You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sklearn中dcg_score输出与维基百科DCG示例结果不一致求助

问题原因
  • 核心差异是DCG的增益计算规范不统一:你参考的维基百科示例和Excel实现用的是线性增益逻辑,而scikit-learn的dcg_score默认使用指数增益逻辑。
  • 两种DCG的计算公式如下:

    线性增益版本(通用教程常用):
    DCG = Σ (relᵢ / log₂(i+1)) ,i为排名位置从1开始计数,relᵢ为第i位的相关性分值
    指数增益版本(sklearn默认):
    DCG = Σ ((2^relᵢ - 1) / log₂(i+1))
    指数增益会放大高相关性结果的权重,因此计算结果会和线性增益版本有偏差。

  • 你观测到IDCG结果符合预期属于数值巧合,默认参数下的IDCG本质也是用指数增益计算的,只是该场景下的数值刚好和线性增益计算的结果接近。
解决方法

调用dcg_score时指定gain_type='linear',切换为线性增益逻辑即可,修正后的代码如下:

# import required package
from sklearn.metrics import ndcg_score, dcg_score
import numpy as np

# Relevance scores in Ideal order
true_relevance = np.asarray([[3, 3, 2, 2, 1, 0]])

# Relevance scores in output order
relevance_score = np.asarray([[3, 2, 3, 0, 1, 2]])

# DCG score 指定线性增益
dcg = dcg_score(true_relevance, relevance_score, gain_type='linear')
print("DCG score : ", dcg)

# IDCG score 指定线性增益
idcg = dcg_score(true_relevance, true_relevance, gain_type='linear')
print("IDCG score : ", idcg)

# Normalized DCG score
ndcg = dcg / idcg
print("nDCG score : ", ndcg)

运行后输出结果和预期完全一致:

DCG score :  6.861126547038433
IDCG score :  7.140995184095699
nDCG score :  0.9607998518671654

内容的提问来源于stack exchange,提问作者Damon Obako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:54:05