[英]Discounted Cumulative Gain dcg_score sklearn
from sklearn.metrics import ndcg_score, dcg_score
import numpy as np
actual= [3,2,0,0,1]
ideal= sorted(actual, reverse=True)
#list to np asarray
actualarr=np.asarray([actual])
idealarr= np.asarray([ideal])
print ("actual score as array", actualarr)
print("ideal score as array", idealarr)
#Discounted Cumulative Gain
dcg= dcg_score(idealarr, actualarr)
print("DCG: ", dcg)
我不明白为什么dcg_score
将 y_score 作为参数。 当我用手算 DCG (sum relevance/log2(i+1)) 我可以得到相同的答案 ~4.6,但我可以用真实分数[3,2,0,0,1]
来实现这个,所以为什么它是否也需要 function 中的理想分数[3,2,1,0,0]
?
我知道sklearn.metrics.ndcg
通过从y_true
中获取值来计算它的总和,就好像它是根据y_score
重新排序的一样。
正如代码中所解释的那样:“将真实分数按照预测分数的顺序求和”
这意味着该指标是根据诱导排名计算的,使用真实的相关值。
一个小例子:
import numpy as np
from sklearn.metrics import dcg_score
def naive_dcg(y_score):
score = 0
for i,n in enumerate(y_score[0]):
num = 2**n -1
den = np.log2(i+1+1)
score += num/den
return score
y_true = [[1,0]]
y_score = [[0,1]]
print(f'sklearn: {dcg_score(y_true,y_score):.2}, naive: {naive_dcg(y_score):.2}')
y_score = [[0.1,0.2]]
print(f'sklearn: {dcg_score(y_true,y_score):.2}, naive: {naive_dcg(y_score):.2}')
输出:
sklearn: 0.63, naive: 0.63
sklearn: 0.63, naive: 0.17
这表明 naive 为相同的排名顺序产生了不同的指标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.