繁体   English   中英

折扣累积收益 dcg_score sklearn

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM