归一化折损累计增益 (nDCG) 是一种用于评估排名列表质量的指标,例如搜索结果或推荐,它考虑了项目的相关性和它们的位置。 它将排名的有效性与理想排名进行比较,产生介于 0 和 1 之间的分数,其中 1 代表完美的排序。 nDCG 的计算方法是将排名列表的折损累计增益 (DCG) 除以理想排序列表的 DCG (IDCG)。 让我们逐步分解它。
首先,DCG 通过对每个项目的相关性求和来衡量排名列表的累积增益,并根据折扣因子进行调整,该折扣因子降低了列表中较晚出现项目的权重。 DCG 的公式通常是:DCG = Σ (relevance_i / log₂(position_i + 1)) 例如,考虑一个搜索查询返回相关性分数为 [3, 2, 3, 0, 1] 且位置为 1 到 5 的文档。DCG 的计算如下
- 位置 1: 3 / log₂(2) = 3
- 位置 2: 2 / log₂(3) ≈ 1.26
- 位置 3: 3 / log₂(4) = 1.5
- 位置 4: 0 (已丢弃)
- 位置 5: 1 / log₂(6) ≈ 0.39 将这些加起来得到 DCG ≈ 3 + 1.26 + 1.5 + 0.39 ≈ 6.15。
接下来,理想 DCG (IDCG) 通过以降序对相关性分数进行排序并重新计算 DCG 来计算。 使用相同的示例,理想的顺序是 [3, 3, 2, 1, 0]。 IDCG 变为
- 位置 1: 3 / log₂(2) = 3
- 位置 2: 3 / log₂(3) ≈ 1.89
- 位置 3: 2 / log₂(4) = 1
- 位置 4: 1 / log₂(5) ≈ 0.43 将这些加起来得到 IDCG ≈ 3 + 1.89 + 1 + 0.43 ≈ 6.32。
最后,nDCG 是 DCG 与 IDCG 的比率:nDCG = DCG / IDCG 在示例中,nDCG ≈ 6.15 / 6.32 ≈ 0.97。 这表明排名接近理想。 nDCG 的一个关键优势是它的归一化,这允许跨具有不同相关性尺度的查询进行比较。 但是,像全零相关性分数这样的边缘情况需要特殊处理(例如,将 nDCG 设置为 0)。 开发人员还应注意 DCG 公式中的变化,例如使用 (2^relevance_i - 1) 而不是原始相关性分数,这会放大较高和较低相关性等级之间的差异。
在实践中,nDCG 广泛应用于搜索引擎、推荐系统和其他需要考虑位置和相关性的排名任务。 通过关注这两个因素,它提供了排名质量的平衡衡量标准。 在实现 nDCG 时,请确保对数底数(通常为以 2 为底)的选择保持一致,并根据问题的要求处理平局或缺失值。 TensorFlow 或 scikit-learn 等库通常包含 nDCG 的内置函数,但了解底层计算有助于调试和优化自定义实现。