zoukankan      html  css  js  c++  java
  • 样本打散后计算单特征 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 ",$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 %f ",$0,rand()}' sample.txt | sort -k4n,4 | cut -f1| sort -t" " -k2,2 -s | python NDCG.py 20

    解释:

    awk '{printf "%s %f ",$0,rand()}' --在最后一列加随机数,不用空格而用 分隔的目的是为了后面好用 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 参数

  • 相关阅读:
    向现有的磁盘组加入/删除ASM磁盘
    词语相似度计算
    C++ STL algorithm 列表
    ORACLE内核参数
    一款好的UI草图设计软件
    (转)svn检出的时候报 Unable to connect to a repository at URL错误
    HTTP 错误 500.19 – Internal Server Error web.config 文件的 system.webServer/httpErrors 节中不允许绝对物理路径“C:\inetpub\custerr”。
    使用SVN后系统变慢的解决方法
    oracle 11g ORA12541: TNS: 无监听程序 (DBD ERROR: OCIServerAttach)
    [转载]无法删除oci.dll文件的解决办法
  • 原文地址:https://www.cnblogs.com/NaughtyBaby/p/9719183.html
Copyright © 2011-2022 走看看