能計算模型的 NDCG,也就能計算單特徵的 NDCG,用於評估單特徵的有效性,跟 Group AUC 用途同樣python
若是是 AUC,越大於或小於 0.5,特徵越有效,但 NDCG 沒有這個特色,NDCG 都是正的,並且,樣本正負比例不一樣,NDCG 的值也不一樣,變化很大。那麼在一樣的樣本下,就須要有個基準用來講明好壞。linux
一個可靠的方案是把隨機數做爲一個特徵,以其 NDCG 爲基準,比隨機數 NDCG 高得越多,特徵就越有效。git
有些離散化的特徵在一個 qid 裏區分度不高,例如某個特徵在 10 個樣本只有 3 個值,這時計算的 NDCG 結果就很是依賴初始序,初始序最完美時得出的 NDCG 也偏高,初始序最差時得出的 NDCG 也最差。因此公平起見,須要先將原始樣本打散,再計算 NDCG。github
基準 NDCG,要用到隨機數。工具
特徵 NDCG,隨機打散,能夠用隨機數,也能夠用 linux 命令 shuf排序
https://github.com/miandai/NDCGget
假如樣本特徵數據格式爲: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
先所有打散,再根據 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 參數