樣本打散後計算單特徵 NDCG

2022-04-05 14:33:08 字數 1266 閱讀 7204

能計算模型的 ndcg,也就能計算單特徵的 ndcg,用於評估單特徵的有效性,跟 group auc 用途一樣

如果是 auc,越大於或小於 0.5,特徵越有效,但 ndcg 沒有這個特點,ndcg 都是正的,而且,樣本正負比例不同,ndcg 的值也不同,變化很大。那麼在同樣的樣本下,就需要有個基準用來說明好壞。

乙個可靠的方案是把隨機數作為乙個特徵,以其 ndcg 為基準,比隨機數 ndcg 高得越多,特徵就越有效。

有些離散化的特徵在乙個 qid 裡區分度不高,例如某個特徵在 10 個樣本只有 3 個值,這時計算的 ndcg 結果就非常依賴初始序,初始序最完美時得出的 ndcg 也偏高,初始序最差時得出的 ndcg 也最差。所以公平起見,需要先將原始樣本打散,再計算 ndcg。

基準 ndcg,要用到隨機數。

特徵 ndcg,隨機打散,可以用隨機數,也可以用 linux 命令 shuf

假如樣本特徵資料格式為:

label qid score

欄位間以空格分隔

ndcg 計算:

awk '' 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 '' sample.txt | sort -k4n,4 | cut -f1| sort -t" " -k2,2 -s | python ndcg.py 20

解釋:awk '' --在最後一列加隨機數,不用空格而用 \t 分隔的目的是為了後面好用 cut 去除隨機數這一列

sort -k4n,4 --將樣本按隨機數排序,實現打散

cut -f1 --去除隨機數一列

sort -t" " -k2,2 -s --只按第二列排序(-k2,2),且是穩定排序(-s 的作用),即若第二列相同,就不用重排了

使用 sort 命令打散時踩了兩個坑:

如果只想按第二列排序,sort 的 -k 引數一定要是 -k2,2,不能是 -k2,不然 sort 排序時會把第三列也算上,這樣前面打散就失效了

如果想要穩定排序,即當第二列相同時,不做重新序,以在 qid 內保持隨機打散的序,要記得使用 -s 引數

Excel 分組後計算

分組後的計算都類似,仍然採用 groups 函式,分組並同時計算出各洲的 gdp 總量,然後再求一遍各洲的 gdp 總量佔全球 gdp 的百分比值。spl 如下 ab 1 clipboard import t 從剪貼簿匯入帶標題的考試成績表 2 a1.groups area sum gdp tota...

卷積前後計算筆記

conv2d中步長預設為1,計算公式為size w k 2p s 1 maxpool2d中步長預設為kernal size,例如f.max pool2d f.relu self.conv2d x 2,2 中步長就為2,此時size 2 1.指定cuda時用torch.set device 2.在li...

openmp開啟後計算結果錯誤原因

openmp多執行緒使用方法十分簡單,一般對於for迴圈只需要加一句 pragma omp parallel for就可以了。新手使用的時候有時候可能會出現開啟omp之後,得到的計算結果是錯的,而且多次執行結果還不相同。1.其中乙個可能的原因是你的 中不同的執行緒同時使用某一記憶體的值並且試圖改變它...