首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >折扣累积增益dcg_score滑雪板

折扣累积增益dcg_score滑雪板
EN

Stack Overflow用户
提问于 2022-06-30 14:46:41
回答 1查看 71关注 0票数 0
代码语言:javascript
复制
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]呢?

EN

回答 1

Stack Overflow用户

发布于 2022-09-30 23:01:50

我理解sklearn.metrics.ndcg通过从y_true中获取值来计算它的和,就好像它是按照y_score重新排序的一样。

正如在代码中所解释的:“将真实分数按预测分数的顺序排序”

这意味着度量是根据导出的排名计算的,使用的是真正的相关性值。

一个小例子:

代码语言:javascript
复制
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}')

产出:

代码语言:javascript
复制
sklearn: 0.63, naive: 0.63
sklearn: 0.63, naive: 0.17

这表明朴素为相同的排名顺序产生了不同的度量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72817809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档