python - 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
有什么想法有什么问题吗?
解决方案
简单来说,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
推荐阅读
- flask - Apache Superset 中的 LDAP 配置
- druid - json 中德鲁伊的后聚合示例查询
- strapi - 有没有办法在 Strapi 中填充嵌套关系?
- javascript - 循环一个数组对象给我在控制台日志中未定义
- html - 我关闭了标签,但在第 9 行收到 TemplateSyntaxError: Unclosed tag: 'if'。寻找其中之一:elif、else、endif
- c# - MongoDB updateMany 使用 equals 设置布尔字段
- bash - Bash 字符串替换添加了前面的空格
- java - 猪拉丁得到 (ranslatetay) 而不是 (anslatetray)
- gcc - BlueField(v1) 智能网卡安装DPDK
- python - 如何在 Python 中绘制表示为元组的行列表?