针对排序常用的评估指标,给出其计算原理及代码实现

排序评估指标

NDCG

1 原理

NDCG全称为 Normalized Discounted Cumulative Gain(归一化折损累计增益),通常用在搜索排序任务中,在这样的任务里,通常会返回一个list作为搜索排序的结果进行输出,为了验证这个list的合理性,就需要对这个list的排序进行评价。这也是NDCG的由来。

  • Gain: G,增益

    在排序list中,增益指的就是里面的相关性得分,也就是模型的预测结果。rel(i)表示item(i)相关性得分。

  • Culumatative Gain:CG,累计增益。

    对k个rel(i)进行叠加,不考虑位置关系。
    CGk=∑i=1krel(i)CG_k=\sum_{i=1}^krel(i)CGk​=i=1∑k​rel(i)

  • Discounted Cumulative Gain: DCG,折损累计增益。

    考虑排序顺序的因素,使得排名靠前的item增益更高,对排名靠后的item进行折损。DCG认为排在前面的贡献度更大,后面的贡献度较小,也就是对增益值进行加权求和,权重就是位置引起的。
    DCGk=∑i=1krel(i)log2(i+1)DCG_k=\sum_{i=1}^k\frac{rel(i)}{log_2(i+1)}DCGk​=i=1∑k​log2​(i+1)rel(i)​
    或者:
    DCGk=∑i=1k2rel(i)+1log2(i+1)DCG_k=\sum_{i=1}^k\frac{2^{rel(i)}+1}{log_2(i+1)}DCGk​=i=1∑k​log2​(i+1)2rel(i)+1​
    也即是说:i越大,排序越往后,对应的log(i+1)log(i+1)log(i+1)就越大,折损就越高。

  • iDCG,最好排列的的DCG

    根据rel(i)进行降序排列,以此序列计算DCG,也就是最好的DCG,称为iDCG。在计算中,采用labels的相关性得分计算(隐形就是0,1;显性评分则是1-5分数)。
    如果是隐性评分,根据

  • NDCG,归一化折损累计增益

    由于不同搜索的结果返回长度不一样,这样的iDCG就是一个绝对值,没法比较,因此通过DCG/iDCG来表示NDCG,代表着一个相对程度。
    NDCG=DCGiDCGNDCG = \frac{DCG}{iDCG}NDCG=iDCGDCG​

2 代码实现

上面的理论乍一看理解起来很简单,但是真到具体应用的时候,发现还是很复杂的,以后很多问题需要思考,比如,里面的相似性得分,排序根据什么得分排序等等。代码的实现也容易绕晕。下面给出两种代码方式,分别是只能计算隐性得分的torch版本和numpy版本

torch

# socres为对应item(i)的预测得分,labels对item(i)的标签,由于是隐形评分数据,只有0,1点击值
scores = torch.tensor([[0,0.1,0.3,0.4,0.5]])
labels = torch.tensor([[0,1,1,0,1]])
k = 5
# 降序排列,获取推荐列表的id
rank = (-scores).argsort(dim=1)
cut = rank[:, :k]
# 获取相关性得分,也就是0,1,如果命中
hits = labels.gather(1, cut)
# 计算位置关系,从2开始计
position = torch.arange(2, 2+k)
# 根据位置关系计算位置权重
weights = 1 / torch.log2(position+1)
# 计算DCG
dcg = (hits* weights).sum(1)
# 计算iDCG,由于相关性得分为0,1,且经过排序,所以计算前面为1对应weights之和即可。
idcg = torch.Tensor([weights[:min(n, k)].sum() for n in labels.sum(1)])ndcg = dcg / idcg
print(ndcg)

numpy

def getDCG(scores):return np.sum(np.divide(np.power(2, scores) - 1, np.log2(np.arange(scores.shape[0], dtype=np.float32) + 2)+1),# np.divide(scores, np.log2(np.arange(scores.shape[0], dtype=np.float32) + 2)+1),dtype=np.float32)def getNDCG(rank_list, pos_items):relevance = np.ones_like(pos_items)it2rel = {it: r for it, r in zip(pos_items, relevance)}rank_scores = np.asarray([it2rel.get(it, 0.0) for it in rank_list], dtype=np.float32)print(rank_scores)idcg = getDCG(relevance)dcg = getDCG(rank_scores)if dcg == 0.0:return 0.0ndcg = dcg / idcgreturn ndcg
## l1是推荐排序列表,l2是真实点击的列表
l1 = [4,3,2,1,0]
l2 = [4,2,1]
a = getNDCG(l1, l2)
print(a)

评估指标及代码实现(NDCG)相关推荐

  1. ML之ME/LF:基于不同机器学习框架(sklearn/TF)下算法的模型评估指标(损失函数)代码实现及其函数(Scoring/metrics)代码实现(仅代码)

    ML之ME/LF:基于不同机器学习框架(sklearn/TF)下算法的模型评估指标(损失函数)代码实现及其函数(Scoring/metrics)代码实现(仅代码) 目录 单个评价指标各种框架下实现 1 ...

  2. 绝对不容错过:最完整的检测模型评估指标mAP计算指南(附代码)在这里!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前言 本文翻译自Measuring Object Detectio ...

  3. ML之分类预测:分类预测评估指标之AUC计算的的两种函数具体代码案例实现

    ML之分类预测:分类预测评估指标之AUC计算的的两种函数具体代码案例实现 目录 分类预测评估指标之AUC计算的的两种函数代码案例实现 输出结果 实现代码

  4. ML之ME/LF:机器学习中回归预测模型评估指标(MSE/RMSE/MAE)简介、使用方法、代码实现、案例应用之详细攻略

    ML之ME/LF:机器学习中回归预测模型评估指标(MSE/RMSE/MAE)简介.使用方法.代码实现.案例应用之详细攻略 目录 回归预测问题中评价指标简介 RMSE 标准差SD MSE函数

  5. 目标跟踪OTB评估指标(OP, CLE, FPS)与matlab代码

    OTB是单目标跟踪中非常经典的一个数据集.它包含多种评估指标,最常用的有AUC(曲线下面积),DP(距离精度),这两种指标都可以通过OTB工具箱自动计算得到.然而,除了AUC/DP,为了对算法进行更加 ...

  6. 排序评估指标——NDCG和MAP

    在搜索和推荐任务中,系统常返回一个item列表.如何衡量这个返回的列表是否优秀呢? 例如,当我们检索[推荐排序],网页返回了与推荐排序相关的链接列表.列表可能会是[A,B,C,G,D,E,F],也可能 ...

  7. [机器学习与scikit-learn-51]:模型评估-图解回归模型的评估指标MSE、MAE、RMSE、R2、RSS与代码示例

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  8. 【理论 | 代码】机器学习分类与回归性能评估指标大全

    一.回归指标 1.1 均方误差(Mean Squared Error, MSE) MSE 称为均方误差,又被称为 L2 范数损失,该统计参数是预测数据和原始数据对应点误差的平方和的均值,公式如下: M ...

  9. 你真的了解分类模型评估指标都有哪些吗?【附Python代码实现】

    大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师.欢迎大家跟我一起走进数据分析的世界,一起学习! 感兴趣的朋友可以关注我或者我的数据分析专栏,里面有许多优质的文章跟大家分享哦. 必看前言 ...

最新文章

  1. 深度学习、自然语言处理和表征方法
  2. Python字符串常用操作
  3. c++静态成员变量使用前必须初始化,那么下面这个例子为什么不用初始化?
  4. leetcode 677. Map Sum Pairs | 677. 键值映射(Trie前缀树,BFS)
  5. 工作67:el-table问题
  6. 程序员常见保健方法【转贴】
  7. redis3.0伪集群安装步骤
  8. AI发来贺电,您的2333号奶牛已进入恋爱时节 | 野性的呼唤
  9. jquery的DOM节点操作(替换元素节点)
  10. latex for wordpress(一)
  11. 十、Net6 Core Api发布到IIS
  12. 中文界面blend_使用Blend设计出符合效果的WPF界面
  13. matlab去除图片水印_一种基于MATLAB去图片水印方法
  14. 开根号的笔算算法图解_怎么用笔算开根号?
  15. js小游戏-别踩白块儿
  16. python电子病历交接班系统_电子病历的进展
  17. js 区分中英文输入法(如中英文括号)
  18. apicloud的使用
  19. matlab归一程序,Matlab三种归一化方法
  20. java定时任务:oracle导出excel后,发送excel作为附件的邮件

热门文章

  1. Javascript 获取数组长度, 对象成员个数, 字符串数
  2. 生产线如何首件检验,把握品质第一道关
  3. Linux内核虚拟地址空间,-3G的由来。各个进程的虚拟内存4G,内核总在3-4G。内核的虚拟空间地址-3G,总是指向物理内存的0-1G地址,各个进程的虚拟内核共享这个物理内存
  4. 最新版恋爱话术小助手微信QQ双端小程序源码+云开发+流量主+教程
  5. 如何理解JavaScript模块化?
  6. ubuntu ll 命令
  7. 汽院移动终端软件开发作业
  8. 【广告算法工程师入门 9】机制设计-博弈论基础
  9. 百度快照倒退原因分析及补救措施
  10. 捷豹改激光大灯 捷豹XF氙气灯升级LED灯作业