单特征 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 命令打散时踩了两个坑:

  1. 如果只想按第二列排序,sort 的 -k 参数一定要是 -k2,2,不能是 -k2,不然 sort 排序时会把第三列也算上,这样前面打散就失效了

  2. 如果想要稳定排序,即当第二列相同时,不做重新序,以在 qid 内保持随机打散的序,要记得使用 -s 参数

样本打散后计算单特征 NDCG的更多相关文章

  1. 泛函编程(11)-延后计算-lazy evaluation

    延后计算(lazy evaluation)是指将一个表达式的值计算向后拖延直到这个表达式真正被使用的时候.在讨论lazy-evaluation之前,先对泛函编程中比较特别的一个语言属性”计算时机“(s ...

  2. 如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值

    如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值:比如 输入 单价,数量,计算金额. 参考: 1.  输入 单价,数量,计算金额 ...

  3. php history.back返回后表单数据丢失的解决办法

    js使用history.back返回表单数据丢失的主要原因就是使用了session_start();的原因,该函数会强制当前页面不被缓存.本文章向码农介绍php history.back返回后表单数据 ...

  4. 【图像处理】计算Haar特征个数

    http://blog.csdn.net/xiaowei_cqu/article/details/8216109 Haar特征/矩形特征 Haar特征本身并不复杂,就是用图中黑色矩形所有像素值的和减去 ...

  5. 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 ...

  6. ASP.NET MVC 客户端验证失败后表单仍然提交问题

    客户端验证失败后表单仍然提交问题!导致页面刷新,辛辛苦苦输入的内容荡然无存. 多么奇怪的问题.按道理,验证失败,就应该显示各种错误信息,不会提交表单才对.而现在,错误信息正常显示,但页面却刷新了一遍. ...

  7. 机器学习进阶-案例实战-图像全景拼接-图像全景拼接(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 ...

  8. 按下enter键后表单自动提交问题

    在HTML的form表单里,按下enter键之后,默认情况下表单会自动提交. 在公司一个项目里,按下enter键自动提交表单的查询结果与按下搜索框的搜索结果页面显示不一样,按下搜索按钮之后是通过Aja ...

  9. Ubuntu Server忘记密码后,单用户模式修改密码进去不了桌面的无奈

    俗话说的好,好记性不如烂笔头.有时候脑子一热,就想不起来之前设置过的密码是什么了.我可怜地忘了我的Ubuntu Server的密码,回忆了n种组合都不行,于是只能进行单用户模式的修改密码了. 以下的操 ...

随机推荐

  1. 人活着系列之芳姐和芳姐的猪(Floyd)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2929 这个题一方面数据水,另一方面就是思维水, ...

  2. Andrew Ng-ML-第十章-应用机器学习的建议

    1.如何改进性能不好的学习算法 图1.运用到测试集上效果不佳 当进行一个正则化线性回归时,最小化了代价函数得到参数,但是运用到新的测试集上,发现效果不好,那么如何改进? 1).增加训练集.但是实际上花 ...

  3. SVM计算过程,对偶形式,核函数

    SVM是一个分类方法,用w^X+b定义分类函数, 于是求w.b,为寻最大间隔,引出1/2||w||^2,继而引入拉格朗日因子,化为对单一因数对偶变量a的求解(求解过程中会涉及到一系列最优化或凸二 次规 ...

  4. [LeetCode] 103. Binary Tree Zigzag Level Order Traversal _ Medium tag: BFS

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  5. 查询set、dict、dict.keys()的速度对比

    查找效率:set>dict>list 单次查询中: list set dict O(n) set做了去重,本质应该一颗红黑树 (猜测,STL就是红黑树),复杂度 O(logn): dict ...

  6. js实现轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 关于DOM2级事件的事件捕获和事件冒泡

    DOM2级事件中addEventListener的执行机制,多个addEventListener同时添加时的执行先后规律: W3C的DOM事件触发分为三个阶段:①.事件捕获阶段,即由最顶层元素(一般是 ...

  8. 跑道标识和那些复杂的灯光系统 and 简介、编号、参数、标志及数量 and 飞机跑道标准与参数

    http://www.360doc.com/content/16/0616/12/32670666_568219786.shtml http://news.carnoc.com/list/365/36 ...

  9. FAFU 1136 最长递增子序列

    http://acm.fafu.edu.cn/problem.php?id=1136 根据dp建边,建边的时候记得判断如果原本数的大小就ok了 好久没在自家OJ上刷了 #include <ios ...

  10. python 文件不存在时才能写入,读写模式xt

    想向一个文件中写入数据,但是前提必须是这个文件在文件系统上不存在.也就是不允许覆盖已存在的文件内容. 可以在open() 函数中使用x 模式来代替w 模式的方法来解决这个问题.比如: >> ...