JobPlus知识库 IT 工业智能4.0 文章
信息检索评价指标总结

1、NDCG的目标:希望得到的排序列表,质量越高越好。并且,如果将更相关的排到更前面,那么计算得到的NDCG是会越高的。

AUC和NDCG的区别:

1、AUC的含义:把正样本排在负样本前的概率。AUC关注的是全局的排序,只要正样本排在负样本之前,就可以得分。并没有加权。

2、NDCG也是关注排序,但是NDCG关注的是,加权排序。比如我们希望top10的排序准确度,要比bottom10的排序准确度重要。对于这种加权排序,NDCG会更加合适。

因此,AUC和NDCG的区别是,加权与否。AUC的评估中,top-10的排序质量和bottom-10的排序质量是一样重要的。但是,在NDCG中,是需要加权的,top-10的排序质量和bottom-10的排序质量的权重是不一样的。

2、

说明:sklearn只有到0.20版本才支持NDCG误差的计算,因此我们可以将该代码拷贝出来。


[python]

  1. import numpy as np  
  2. from sklearn.preprocessing import LabelBinarizer  
  3. from sklearn.metrics import make_scorer  
  4. from sklearn.utils import check_X_y  
  5. import sys  
  6.   
  7. def dcg_score(y_true, y_score, k=5):  
  8.     order = np.argsort(y_score)[::-1]  
  9.     y_true = np.take(y_true, order[:k])  
  10.     gain = 2 ** y_true - 1  
  11.     #print(gain)  
  12.     discounts = np.log2(np.arange(len(y_true)) + 2)  
  13.     #print(discounts)  
  14.     return np.sum(gain / discounts)  
  15.   
  16.   
  17. def ndcg_score(y_true, y_score, k=5):  
  18.     y_score, y_true = check_X_y(y_score, y_true)  
  19.   
  20.     # Make sure we use all the labels (max between the length and the higher  
  21.     # number in the array)  
  22.     lb = LabelBinarizer()  
  23.     lb.fit(np.arange(max(np.max(y_true) + 1, len(y_true))))  
  24.     binarized_y_true = lb.transform(y_true)  
  25.     print(binarized_y_true)  
  26.     if binarized_y_true.shape != y_score.shape:  
  27.         raise ValueError("y_true and y_score have different value ranges")  
  28.   
  29.     scores = []  
  30.   
  31.     # Iterate over each y_value_true and compute the DCG score  
  32.     for y_value_true, y_value_score in zip(binarized_y_true, y_score):  
  33.         actual = dcg_score(y_value_true, y_value_score, k)  
  34.         best = dcg_score(y_value_true, y_value_true, k)  
  35.         #print(best)  
  36.         scores.append(actual / best)  
  37.     return np.mean(scores)  
  38.   
  39.   
  40. # NDCG Scorer function  
  41. # sklearn的NDCG对二维的计算有点问题,可以转化为三分类问题  
  42. y_true = [0, 1, 0]  
  43. y_score = [[0.0, 1.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]  
  44. print(ndcg_score(y_true, y_score, k=2))  

说明:sklearn对二分类的NDCG貌似不是支持得很好,所以折中一下,换成三分类,第三类补成概率为0.


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
498人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序