樣本打散後計算單特徵 NDCG

單特徵 NDCG

能計算模型的 NDCG,也就能計算單特徵的 NDCG,用於評估單特徵的有效性,跟 Group AUC 用途同樣python

單特徵 NDCG 如何衡量好壞

若是是 AUC,越大於或小於 0.5,特徵越有效,但 NDCG 沒有這個特色,NDCG 都是正的,並且,樣本正負比例不一樣,NDCG 的值也不一樣,變化很大。那麼在一樣的樣本下,就須要有個基準用來講明好壞。linux

一個可靠的方案是把隨機數做爲一個特徵,以其 NDCG 爲基準,比隨機數 NDCG 高得越多,特徵就越有效。git

爲何要打散

有些離散化的特徵在一個 qid 裏區分度不高,例如某個特徵在 10 個樣本只有 3 個值,這時計算的 NDCG 結果就很是依賴初始序,初始序最完美時得出的 NDCG 也偏高,初始序最差時得出的 NDCG 也最差。因此公平起見,須要先將原始樣本打散,再計算 NDCG。github

基準 NDCG,要用到隨機數。工具

特徵 NDCG,隨機打散,能夠用隨機數,也能夠用 linux 命令 shuf排序

好用的 NDCG 計算工具

https://github.com/miandai/NDCGget

基準 NDCG

假如樣本特徵數據格式爲:it

label qid scoreclass

字段間以空格分隔awk

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 參數

相關文章
相關標籤/搜索