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长和(和相关性/log2 2(i+1))时,我可以得到同样的答案~4.6,但我可以用真正的分数[3,2,0,0,1]来实现这一点,那么为什么函数中也需要理想的分数[3,2,1,0,0]呢?
发布于 2022-09-30 23:01:50
我理解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这表明朴素为相同的排名顺序产生了不同的度量。
https://stackoverflow.com/questions/72817809
复制相似问题