跳到正文

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. Cumulated Gain-Based Evaluation of IR Techniques
  2. scikit-learn ndcg_score Documentation

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你在做一个电商搜索,用户搜“手机”,返回了10个结果,但用户点开了排名第5的商品,没点第1个。你觉得光看点击率够吗?如果我想精细衡量排序质量,把相关性高低和位置权重都考虑进去,你会用什么指标?

  2. 问法 2 · 层层追问

    评估排序结果的质量,你一般用什么指标?……那如果关联性不是二值的,比如0到3分,而且你觉得越靠前的位置应该越重要,怎么设计一个指标来反映这个?……怎么把它归一化,让不同查询的结果可以公平对比?

  3. 问法 3 · 直球架构

    请详细讲一下NDCG的计算步骤,包括DCG、IDCG的定义和公式,并给个简单例子说明怎么算。另外,在推荐系统或信息检索里,什么场景下你会优先用NDCG而不是Precision@K或MRR?

同模块相关题目