首页 > 解决方案 > Python sklearn dcg_score 错误(?)输出

问题描述

我正在尝试复制维基百科示例以获得折扣累积收益。我能够用 excel 进行复制,但在 python 上有不同的结果。

我在这里使用了说明:https ://www.geeksforgeeks.org/normalized-discounted-cumulative-gain-multilabel-ranking-metrics-ml/

我的代码:

# 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)
print("DCG score : ", dcg)

# IDCG score
idcg = dcg_score(true_relevance, true_relevance)
print("IDCG score : ", idcg)

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

输出:

DCG score :  6.57260640248932 #<- should be 6.861
IDCG score :  7.140995184095699 #<- this is OK
nDCG score :  0.9204048221636831 #<- should be 0.961

有什么想法有什么问题吗?

标签: pythonscikit-learn

解决方案


简单来说,y_true 作为增益,y_predictes 决定顺序。y_true 可以是任何顺序。y_true 将按 y_score 排序。检查这个例子:

y_true = np.asarray([[2, 0, 4]])
y_score = np.asarray([[-33212424, -2, -1]])
pred_dcg = dcg_score(y_true, y_score)
ideal_dcg = dcg_score(y_true, y_true)
print(pred_dcg, ideal_dcg)

对于pred_dcg,按照y_score(降序,分数越大,位置越高)排序后,我们得到:

[4,0,2]

其中折扣是:

[log_2(2), log_2(3), log_2(4)] = [1, xx, 0.5]

所以dcg分数将是:3


推荐阅读