sklearn中dcg_score为何需传入理想排序得分作为y_score参数
sklearn中dcg_score入参逻辑说明
问题复现代码如下:
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的参数定义、函数逻辑的理解存在偏差,所以才会产生“不需要传第二个参数”的误解。
参数的真实含义
dcg_score的两个入参作用分别是:
y_true:形状为(n_samples, n_items)的数组,存储每个待排序物品的真实相关性标注值,不需要手动提前排序,也不需要传入理想排序序列y_score:形状和y_true一致的数组,存储排序模型给每个物品打的预测分数,函数内部会自动按照这个预测分数从高到低给物品重排位置,再按重排后的顺序取对应位置的真实相关性值,代入DCG公式sum(rel_i / log2(i+1))计算结果。
为什么必须传y_score
你手动计算时只需要相关性序列就能得到结果,本质是你默认了「物品的排列顺序就是你手里相关性列表的书写顺序」,相当于你已经提前确定了排序结果,自然不需要额外的排序依据。
但在真实排序任务场景下,你初始拿到的是一堆打乱顺序的物品,每个物品有自己的真实相关性,还有模型给每个物品打的预测分,你根本不知道模型会把物品排成什么顺序——y_score就是告诉函数“模型会按什么规则排序”的核心依据,没有这个参数,函数根本不知道各个相关性值应该放在排序的哪个位置,自然没法计算折损后的累计增益。
你的代码存在的错误
- 你手动构造的
ideal理想排序序列,是计算NDCG时做归一化用的分母(即理想排序下的DCG值),这个值ndcg_score会在内部自动计算,根本不需要你手动传给函数。 - 你当前的传参顺序完全颠倒:把理想排序序列传给了
y_true,把真实相关性序列传给了y_score,得到的结果没有实际意义。 - 如果你想让函数返回你手动算的、按
[3,2,0,0,1]顺序排列的DCG值(约4.6),正确调用方式是dcg_score(actualarr, actualarr)——这相当于你给每个物品的预测分等于它自身的真实相关性,函数排出来的顺序就和你手动计算时用的顺序一致,结果自然匹配。
举个实际使用的例子:如果5个物品的真实相关性是
[3,2,0,0,1],某模型给这5个物品的预测分是[0.9, 0.7, 0.2, 0.1, 0.4],函数会先按预测分降序排物品,得到的顺序对应真实相关性是[3,2,1,0,0],再代入公式算出这个模型对应的DCG值,这才是dcg_score的正确使用场景。
内容的提问来源于stack exchange,提问作者Shaun Potts
相关产品推荐
相关产品推荐

