You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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就是告诉函数“模型会按什么规则排序”的核心依据,没有这个参数,函数根本不知道各个相关性值应该放在排序的哪个位置,自然没法计算折损后的累计增益。

你的代码存在的错误

  1. 你手动构造的ideal理想排序序列,是计算NDCG时做归一化用的分母(即理想排序下的DCG值),这个值ndcg_score会在内部自动计算,根本不需要你手动传给函数。
  2. 你当前的传参顺序完全颠倒:把理想排序序列传给了y_true,把真实相关性序列传给了y_score,得到的结果没有实际意义。
  3. 如果你想让函数返回你手动算的、按[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:24:12