【推荐】排序模型的评价指标nDCG

nDCG是衡量排序模型性能的指标,考虑了排序正确性和相关性。它基于Gain、CG、DCG和IDCG计算,考虑了位置信息的折损。例如,在打分数据集中,nDCG可以评估模型预测的标签顺序与真实顺序的匹配度,分数越高表示性能越好。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

  nDCG(Normalized Discounted Cumulative Gain)归一化折损累计增益是一种用于评估排序模型性能的指标,它考虑了两个方面:排序的正确性和相关性的程度。

  学习nDCG按照GainCGDCGiDCGnDCG这个顺序来学习。

  假设现在你有一个标签序列:

ABCD
打分数据集3210
点击数据集1010

  如果是打分数据集,那么A分数最高(3),D最低(0),这样真实顺序为ABCD;
  如果是点击数据集,那么AC分数有(1),BD无(0),这样标签为AC,顺序无所谓;

增益Gain

  增益Gain就表示第i个标签位置的得分。这里 r e l ( i ) rel(i) rel(i)表示分数,这个分数到底是什么?分数是什么什么取决于数据集的对应位置存的是什么。

G a i n = r e l ( i ) Gain= rel(i) Gain=rel(i)

  如果是用的是推荐的显示反馈,也就是打分数据集(1-5分),那么这个1-5的打分就是计算时要用的分数。如果用的隐式反馈,也就是用户点击数据集,那这个分数就是0-1。1表示用户点击过,0表示未点击过。

  那么在上面举例中:在打分数据集,可以说标签A的增益为3、B为2……

累计增益 CG

  累计增益 CG表示前k个位置累计得到的效益。CG必须要指定topk中的k才可以计算,不然在不同的情况下,A用户有100个标签、B用户只有10个标签,这样去统计CG就没意义了。

C G @ k = ∑ i = 1 k r e l ( i ) CG@k = \sum_{i=1}^{k} rel(i) CG@k=i=1krel(i)

  那么在上面举例中:在打分数据集,如果标签为[A,B,C,D]或[B,A,C,D],CG@2 = 5。所以,顺序不影响CG得分。如果我们想评估不同顺序的影响,就需要使用另一个指标DCG来评估。

折损累计增益 DCG

  CG只是单纯累加相关性,不考虑位置信息。考虑排序顺序的因素,使得排名靠前的item增益更高,对排名靠后的item进行折损。CG与顺序无关,而DCG评估了顺序的影响。DCG的思想是:list中item的顺序很重要,不同位置的贡献不同,一般来说,排在前面的item影响更大,排在后面的item影响较小。

D C G @ k = ∑ i = 1 k r e l ( i ) log ⁡ 2 ( i + 1 ) DCG@k = \sum_{i=1}^{k} \frac{rel(i)}{\log_2(i+1)} DCG@k=i=1klog2(i+1)rel(i)

  那么在上面举例中:在打分数据集,如果标签为[A,B,C,D]:DCG@2 = 3/log(2) + 2/log(3) = 6.149;如果标签为[B,A,C,D]:DCG@2 = 2/log(2) + 3/log(3) = 5.616;我们发现肯定是越靠近原始标签顺序,折损累计增益越大。

理想折损累计增益 IDCG

  IDCG是指理想情况下的DCG,即DCG取得最大值的情况,就是数据集中的顺序。公式为:

I D C G @ k = ∑ i = 1 ∣ R E L ∣ r e l ( i ) log ⁡ 2 ( i + 1 ) IDCG@k = \sum_{i=1}^{|REL|} \frac{rel(i)}{\log_2(i+1)} IDCG@k=i=1RELlog2(i+1)rel(i)

  它和DCG没区别,只是DCG算的是模型预测出来的标签顺序去算分,IDCG算的是数据集中的真实标签顺序去算分,所以DCG不可能比IDCG大。

归一化折损累计增益 nDCG

  除以IDCG,把分数约束到[0,1]。

n D C G @ k = D C G @ k I D C G @ k nDCG@k = \frac{DCG@k}{IDCG@k} nDCG@k=IDCG@kDCG@k

计算举例

  假如现在模型对标签A-B-C-D预测的分数是[0.111, 0.222, 0.001, 0.10]

  那么要对分数排个序即[0.222, 0.111, 0.10, 0.001]

  那么模型预测出来的标签顺序为B-A-D-C

  模型预测出来的标签顺序B-A-D-C在数据集里面的评分是[2, 3, 0, 1]

  nDGC@3 = [2/log(2) + 3/log(3) + 0/log(4)] / [3/log(2) + 2/log(3) + 1/log(4)] = 0.8174935137996165

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

征途黯然.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值