NDCG 怎么计算?
DCG 与 IDCG 含义详解,推荐系统排序评估应用
原题:请详细描述NDCG(Normalized Discounted Cumulative Gain)的计算公式和步骤,说明IDCG和DCG的含义,并举例说明其在信息检索或推荐系统中的应用场景。
评估与监控 · 京东真题
回答与解析
定义
采用指数增益时:
DCG@k = sum_{i=1..k} (2^{rel_i}-1) / log2(i+1)
IDCG@k是在同一候选集合中将相关性标签按降序排列后得到的最大DCG。
NDCG@k = DCG@k / IDCG@k
它衡量带分级相关性和位置折扣的排序质量,不是Top-K命中率。若IDCG@k=0,应在指标规范中明确该查询是跳过还是记为0。
可复算示例
实际相关性为[3,2,3,0,1]:
DCG@5 = 7 + 3/log2(3) + 7/log2(4) + 0 + 1/log2(6) ≈ 12.78
理想排序为[3,3,2,1,0]:
IDCG@5 = 7 + 7/log2(3) + 3/log2(4) + 1/log2(5) ≈ 13.35
所以NDCG@5 ≈ 12.78/13.35 ≈ 0.958。
搜索和推荐中可用NDCG评估多级相关结果是否把高价值项目放在前面,但还要结合Recall、MRR、覆盖率和线上目标,且标注尺度与截断k必须保持一致。
口语版讲法(约4分钟)
- 解释分级相关性和位置折扣
- 写出DCG公式
- 构造IDCG并归一化
- 逐项复算示例
- 说明应用与指标边界
NDCG解决的不是“前K个结果有没有命中”这么简单,而是带分级相关性的排序是否把更相关的结果放在更靠前的位置。计算先从DCG开始。采用指数增益版本时,第i位的贡献是二的相关性分数次方减一,再除以log二的i加一。相关性越高,增益越大;位置越靠后,折扣越强。
IDCG使用同一批候选和同一组相关性标签,只是把标签按从高到低排列,再按相同公式计算。这代表当前候选集合在截断位置k下能达到的理想排序得分。NDCG就是实际DCG除以IDCG,用理想值归一化后,不同查询的原始增益规模更容易比较。若一个查询在k以内所有标签都为零,IDCG也为零,系统必须预先规定跳过该查询还是把结果记为零。
用相关性三、二、三、零、一的五个结果复算。首位相关性三的增益是七。位置二相关性二的贡献是三除以log二的三,约一点八九。位置三相关性三的贡献是七除以log二的四,也就是三点五。第四位为零没有贡献,第五位贡献是一除以log二的六,约零点三九。相加得到DCG约十二点七八。
理想顺序是三、三、二、一、零。对应贡献是七,加七除以log二的三,再加三除以log二的四,以及一除以log二的五,结果约十三点三五。因此NDCG约等于十二点七八除以十三点三五,也就是零点九五八。旧结果若写成IDCG十五点八九和NDCG零点八,和给定公式并不一致。
搜索中,NDCG适合评估多级人工相关性;推荐中可以把不同强度的反馈映射为gain,但映射规则要固定。它不是Recall@K,后者更关心相关项目有没有被召回。一个系统可能召回很差却把少数已召回结果排得很好,也可能召回足够但头部顺序不佳,所以常把Recall、NDCG、MRR和线上指标一起看。
落地时还要固定标签尺度、gain公式、折扣函数、候选集合和截断k,并检查标注一致性。不同团队若一个使用线性gain、另一个使用指数gain,数字不能直接比较。对无点击曝光数据还要考虑位置偏差,不能把历史点击原样当成无偏相关性。
汇总多个查询时还要说明采用宏平均还是按查询权重加权。宏平均让每个查询贡献相同,流量加权更接近线上分布,却可能掩盖长尾退化。报告时最好同时给均值、分桶结果和置信区间,避免单个总数隐藏问题。
关键一句:为何同一个排序在不同gain定义下会得到不同NDCG。
核验来源
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做一个电商搜索,用户搜“手机”,返回了10个结果,但用户点开了排名第5的商品,没点第1个。你觉得光看点击率够吗?如果我想精细衡量排序质量,把相关性高低和位置权重都考虑进去,你会用什么指标?
- 问法 2 · 层层追问
评估排序结果的质量,你一般用什么指标?……那如果关联性不是二值的,比如0到3分,而且你觉得越靠前的位置应该越重要,怎么设计一个指标来反映这个?……怎么把它归一化,让不同查询的结果可以公平对比?
- 问法 3 · 直球架构
请详细讲一下NDCG的计算步骤,包括DCG、IDCG的定义和公式,并给个简单例子说明怎么算。另外,在推荐系统或信息检索里,什么场景下你会优先用NDCG而不是Precision@K或MRR?