1. 程式人生 > >實戰天池精準醫療大賽之三_分類迴歸與排序

實戰天池精準醫療大賽之三_分類迴歸與排序

1. 說明

 開賽第一週掙扎在前100的邊緣,第二週掙扎在前20的邊緣,第三週懶得弄了,坐等換資料。初賽的前100名可進複賽,所以在前100中排名前後也沒啥意義,開始的時候覺得自己分數蒙的成份很高,換了資料就完蛋,然後不斷改進,坐實;後來就有點瞎叫勁了。又傲嬌又膽小,也沒結交到隊友,至今還是孤軍作戰。記錄一下本週收穫,也不知這些都公開之後會不會被打出排行榜[哭臉]。

2. 分類與迴歸

 所有迴歸都可以抽象成分類,比如訓練集有100個數,最差的情況下就是分成100個類,或者處理成99次二分類。而對於具體數值的迴歸,可通過其所屬類別中的元素計算,比如:中值,均值,期望值,評估函式最佳值等等。
 細數參與過的幾個比賽:醫療大賽是切分正常和糖尿病,微博互動是切分正常和巨量互動,淘寶穿搭是切分普通組合和常見的組合,人品預測是切分普通和人品不好的,股票是切分普通和大漲的。基本都是從正常中尋找反常資料,幾乎都可以當成不均衡的分類問題處理,而且它們有個共同的特點,就是越特殊的值權重越大,比如說預測對一個高血糖值對評分的貢獻多過上百個普通值。
 把分類理解成資料的抽象,可簡化問題,也可以在其上運用複雜的計算。同樣是使用GBDT類的演算法,分類就比迴歸靈活很多,尤其是二分類。

3. 排序(Rank)

 排序可以視為一種演算法,或者演算法中的一個實用的小工具。比如特徵工程中的排序特徵,排序更常見的是用在評價函式之中。
 比如本題原本是一個迴歸問題,我們把它當成分類處理,分類的邊界劃在哪?是界定正常值的6.1,還是界定糖尿病的11.1,還是中值?問題的核心是:把從黑到白的柔和過渡通過劃邊界描述成了非黑即白的二元對立——人通常也是這麼做的,比如,把人分為好人與壞人。
 排序提供了一種輔助的方法:它把所有人排了序,越靠前是好人的可能性越大。如果越靠前越容易是反常資料,那麼取前N個就可以輕鬆地過濾資料和分類,搜尋引擎也是類似的排序原理。
 具體到本題,我是先對所有資料做迴歸,然後用不同邊界分類篩出各個檔位的特殊資料,用該檔的均值預測特殊資料,其中用排序控制特殊資料的多少。原理非常簡單,不過還需要調整演算法,比如在分類中想要找可能性最大的前N個,不考慮其它,和把所有資料都儘量正常分類,做法肯定不同,詳見後面“基於排序的評價函式”。

4. 正常與反常

 上面說到,本題我用了分類加回歸,分類那麼好,為什麼還加回歸呢?像上面“分類與迴歸”中說到的100個數迴歸等99次二分類,從這個角度看分類和迴歸本來是一個東西,只是粒度不同。也就是說處理任何問題,都需要在不同粒度下分析。
 舉個例子,追漲殺跌和低買高賣明顯是不同的操作策略。

在藍色點賣出,綠色點買入,相對於黑色的趨勢線是低買高賣(細粒度),而根據黑色上升趨勢線操作又是追漲行為(組粒度)。這裡趨勢就是常態,請注意:常態不僅是不動的狀態,一條橫線,也有可能是斜線或者曲線,它可以是用迴歸擬合出來的模型;而藍色和綠色點就是反常,反常沒有一定之規,主要看常態是什麼。比如大家都上輔導班,你不上就反常了。

5. 基於排序的評價函式

 這裡主要基於xgboost工具,它提供排序的評價函式有:ams,auc,pre,ndcg,map。其中大多數找不到相應的中文說明,建議看原始碼:xgboost/src/metric/rank_metric.cc

(1) xgboost相關說明

i. 評價函式
xgboost中,一般通過eval_metric設定軟體自帶的評價函式,也可以通過feval自定義評價函式。評價函式包括迴歸相關的,分類相關的,這裡主要介紹排序相關的。一般評價函式的輸入變數是訓練資料和預測值。輸出是評價函式名稱和評價分值。

ii. 引數
有些評價函式可以帶引數,形如:[email protected][email protected][email protected]。一般是從1-0的排序,如果設定了減號,可以支援從0向1的排序。

iii. weight
權重是通過scale_pos_weight或者作為DMatrix引數設定的,比如正例和反例的比例為1:4,將scale_pos_weight設為4,在計算時正例將乘權重4。weight在有些評估函式中也發揮作用,比如ams和auc。

2) xgboost提供的評價函式

i. PRE
PRE全稱是Precision,即準確率。根據實際和預測的不同,一般有四種情況:tp,fn,fp,tn,如下圖所示:

實圈代表實際為真,空圈代表實際為假,tp是預測成真實際也是真的;tn為預測是假實際也是假的,fp是實際是假預測成了真,fn是實際是真預測成了假。精確率Precision和召回率Recall是常用的技術指標。

Precision指的是在所有預測成真的例項中實際為真的比例,也就是綠佔圓的比例。該評價可以加引數,即只計算排序後前N個例項的精確率。

ii. MAP
MAP全稱是Mean Average Precision。翻成中文是平均精度均值,即對均值再求均值,求的是所有類的average precision的平均,公式如下:

其中Q是類數,AveP(q)是q類的精度均值。

iii. MDCG
MDCG全稱是Normalized Discounted Cumulative Gain。公式如下:

其中p是資料項數,reli是第i項的評分結果,分子表示評級越高分值越高,分母是排名越靠前分母值越小分值越高。DCG是當前所有條目的評分,而IDCG是對當前所有評級評分。
NDCG是一種源自搜尋引擎的演算法,越靠前權重越大,單項評級越高權值越大,求最累加得分。
具體說明見:https://en.wikipedia.org/wiki/Discounted_cumulative_gain

iv. AUC
AUC全稱是Area Under Curve,曲線下面積,其中曲線指的是ROC曲線,ROC的橫軸是假陽率fpr,縱軸是tpr真陽率,公式如下:

利用tpr和fpr畫出的曲線,形如:

ROC曲線上的每個位置描述了在不同分界點上tpr和fpr的大小,而曲線下面積描述了該模式對各種分界的綜合成績。
AUC對類別是否均衡並不敏感,幾乎是分類常用的評估演算法。

v. AMS
AMS全稱是Approximate Median Significance,公式如下:

其中s,b分別是未經正則化的真正例(TP)和假正例(FP),br是常數化正則項設為10,log是自然對數。
它的格式是[email protected],其中引數k是個百分比,指定topn佔資料的百分比,它主要評估序列的前n項。評價函式求出的是序列中最大的ams值,及它所在的位置。
AMS是Kaggle的Higgs Boson比賽中的評價函式,詳見原始碼:xgboost/demo/kaggle-higgs。這種評分標準用得不太多。

6. 一些想法

 我覺得寫演算法和寫應用有個明顯的不同:寫應用可以大量借鑑別人的程式碼,API都是一樣的,你能做的我也能做,但演算法比賽不同,照抄照搬還想超過人家基本不可能。
 在看別人程式碼的時候,最終成果可能只有幾百行,但是推理和嘗試的程式碼量比成果多得多,這部分最終並沒呈現出來,看似簡單的答案只是冰山一角。因此,有時看了人家的答案,覺得每句都能理解,到了自己做的時候,還是照貓畫虎,只能微調。
 我覺得恐怕還是要在實戰中磨鍊自己的套路。