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
相关产品推荐
相关产品推荐

