样本打散后计算单特征 NDCG
单特征 NDCG
能计算模型的 NDCG,也就能计算单特征的 NDCG,用于评估单特征的有效性,跟 Group AUC 用途一样
单特征 NDCG 如何衡量好坏
如果是 AUC,越大于或小于 0.5,特征越有效,但 NDCG 没有这个特点,NDCG 都是正的,而且,样本正负比例不同,NDCG 的值也不同,变化很大。那么在同样的样本下,就需要有个基准用来说明好坏。
一个可靠的方案是把随机数作为一个特征,以其 NDCG 为基准,比随机数 NDCG 高得越多,特征就越有效。
为什么要打散
有些离散化的特征在一个 qid 里区分度不高,例如某个特征在 10 个样本只有 3 个值,这时计算的 NDCG 结果就非常依赖初始序,初始序最完美时得出的 NDCG 也偏高,初始序最差时得出的 NDCG 也最差。所以公平起见,需要先将原始样本打散,再计算 NDCG。
基准 NDCG,要用到随机数。
特征 NDCG,随机打散,可以用随机数,也可以用 linux 命令 shuf
好用的 NDCG 计算工具
https://github.com/miandai/NDCG
基准 NDCG
假如样本特征数据格式为:
label qid score
字段间以空格分隔
NDCG 计算:
awk '{printf "%s %s %s\n",$1,$2,rand()}' sample.txt | sort -t" " -k2,2 | python NDCG.py 20
注意到这里以随机数 rand 替换了原文件中的特征值 score
单特征 NDCG
先全部打散,再根据 qid 聚合并计算 NDCG
打散有两种方式。
最简单的是用 linux 命令 shuf:
shuf sample.txt | sort -t" " -k2,2 -s | python NDCG.py 20
麻烦点儿的是使用随机数打散(刚开始不知道 shuf 命令,用的是这种方式):
awk '{printf "%s\t%f\n",$0,rand()}' sample.txt | sort -k4n,4 | cut -f1| sort -t" " -k2,2 -s | python NDCG.py 20
解释:
awk '{printf "%s\t%f\n",$0,rand()}' --在最后一列加随机数,不用空格而用 \t 分隔的目的是为了后面好用 cut 去除随机数这一列
sort -k4n,4 --将样本按随机数排序,实现打散
cut -f1 --去除随机数一列
sort -t" " -k2,2 -s --只按第二列排序(-k2,2),且是稳定排序(-s 的作用),即若第二列相同,就不用重排了
附记
使用 sort 命令打散时踩了两个坑:
如果只想按第二列排序,sort 的 -k 参数一定要是 -k2,2,不能是 -k2,不然 sort 排序时会把第三列也算上,这样前面打散就失效了
如果想要稳定排序,即当第二列相同时,不做重新序,以在 qid 内保持随机打散的序,要记得使用 -s 参数
样本打散后计算单特征 NDCG的更多相关文章
- 泛函编程(11)-延后计算-lazy evaluation
延后计算(lazy evaluation)是指将一个表达式的值计算向后拖延直到这个表达式真正被使用的时候.在讨论lazy-evaluation之前,先对泛函编程中比较特别的一个语言属性”计算时机“(s ...
- 如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值
如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值:比如 输入 单价,数量,计算金额. 参考: 1. 输入 单价,数量,计算金额 ...
- php history.back返回后表单数据丢失的解决办法
js使用history.back返回表单数据丢失的主要原因就是使用了session_start();的原因,该函数会强制当前页面不被缓存.本文章向码农介绍php history.back返回后表单数据 ...
- 【图像处理】计算Haar特征个数
http://blog.csdn.net/xiaowei_cqu/article/details/8216109 Haar特征/矩形特征 Haar特征本身并不复杂,就是用图中黑色矩形所有像素值的和减去 ...
- numpy和matlab计算协方差矩阵的不同(matlab是标准的,numpy相当于转置后计算)
matlab是标准的,numpy相当于转置后计算 >> x = [2,0,-1.4;2.2,0.2,-1.5;2.4,0.1,-1;1.9,0,-1.2] x = 2.0000 0 ...
- ASP.NET MVC 客户端验证失败后表单仍然提交问题
客户端验证失败后表单仍然提交问题!导致页面刷新,辛辛苦苦输入的内容荡然无存. 多么奇怪的问题.按道理,验证失败,就应该显示各种错误信息,不会提交表单才对.而现在,错误信息正常显示,但页面却刷新了一遍. ...
- 机器学习进阶-案例实战-图像全景拼接-图像全景拼接(RANSCA) 1.sift.detectAndComputer(获得sift图像关键点) 2.cv2.findHomography(计算单应性矩阵H) 3.cv2.warpPerspective(获得单应性变化后的图像) 4.cv2.line(对关键点位置进行连线画图)
1. sift.detectAndComputer(gray, None) # 计算出图像的关键点和sift特征向量 参数说明:gray表示输入的图片 2.cv2.findHomography(kp ...
- 按下enter键后表单自动提交问题
在HTML的form表单里,按下enter键之后,默认情况下表单会自动提交. 在公司一个项目里,按下enter键自动提交表单的查询结果与按下搜索框的搜索结果页面显示不一样,按下搜索按钮之后是通过Aja ...
- Ubuntu Server忘记密码后,单用户模式修改密码进去不了桌面的无奈
俗话说的好,好记性不如烂笔头.有时候脑子一热,就想不起来之前设置过的密码是什么了.我可怜地忘了我的Ubuntu Server的密码,回忆了n种组合都不行,于是只能进行单用户模式的修改密码了. 以下的操 ...
随机推荐
- Java接口多线程并发测试 (二)
原文地址http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html 这是一篇很不错的文章,感谢原博主的分享! JAVA多线程实现和 ...
- 面试官说:说一说CommonJs的实现原理
其实刚看到这个题目的时候,我的内心是拒绝的,但是本着对科学的敬畏精神,我开始了 CommonJs 的探索之路. 来来来奉上我这几天的心血,拿走不客气.如有错误欢迎指正,共同进步. 提到CommonJs ...
- VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)
前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建.CTreeCtrl类的主要成员函数和应用实例. 树形控件的创建 MFC为树形控件提 ...
- Python 面向对象教程
总结:函数式的应用场景 –> 各个函数之间是独立且无共用的数据. 面向对象三大特性 面向对象的三大特性是指:封装.继承和多态. 一.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封 ...
- linux常用命令:find 命令概览
Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...
- ajax 拦截器设置请求头
使用vue-resource时,往headers里添加token后,post方法会自动变成options? Vue.http.interceptors.push(function(request, n ...
- 解读 Q_D, Q_Q 指针
见 qglog.h文件定义: #define Q_D(Class) Class##Private * const d = d_func() #define Q_Q(Class) Class * ...
- 通过Jenkins + Docker实现antdPro自动化推送私服、自动容器化部署功能
Docker与Docker私服 1. 安装docker https://docs.docker.com/install/ 2. 配置docker镜像加速 https://www.daocloud.io ...
- cojs 强连通图计数1-2 题解报告
OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...
- 【翻唱】【你的名字MAD】爱你等于爱自己
http://video.yingtu.co/0/8f606e9b-9694-4d35-a0bf-730391a3ee12.mp4 [你的名字MAD]爱你等于爱自己-原唱翻唱 http://video ...