博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
样本打散后计算单特征 NDCG
阅读量:5103 次
发布时间:2019-06-13

本文共 1305 字,大约阅读时间需要 4 分钟。

单特征 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 计算工具

基准 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 参数

转载于:https://www.cnblogs.com/NaughtyBaby/p/9719183.html

你可能感兴趣的文章
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
Nginx+Keepalived 实现双击热备及负载均衡
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
Something-Summary
查看>>
Spring学习笔记
查看>>
6个有用的MySQL语句
查看>>
我对前端MVC的理解
查看>>
Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】...
查看>>
2016.3.31考试心得
查看>>
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>
算法为啥子那么难【转】
查看>>
对数器的使用
查看>>
OracleOraDb11g_home1TNSListener服务启动后停止,某些服务在未由其他服务或程序使用时将自己主动停止...
查看>>
Redis用户添加、分页、登录、注册、加关注案例
查看>>
练习2
查看>>