1. 說明
?精準(zhǔn)醫(yī)療復(fù)賽結(jié)束,最終排名在20左右。第一名的大神相當(dāng)厲害,尤其是換數(shù)據(jù)之后,那分?jǐn)?shù)簡直是甩出其他人好幾條街,非常想學(xué)習(xí)一下他的解決方案,可惜答辯定在七月,而且不一定公開,估計(jì)到時(shí)候都忘了。
?我在復(fù)賽中用的是個(gè)中規(guī)中矩的方案,也在這里記錄和分享一下,寫得比較隨性,各位就別當(dāng)純技術(shù)文檔看了。
2. 特征工程
(1) 特征去噪

?噪聲數(shù)據(jù)是在最后一天才發(fā)現(xiàn)的,原因是訓(xùn)練集加入A榜答案之后,線下分?jǐn)?shù)反而下降了,于是懷疑A榜數(shù)據(jù)是不是有什么問題?在檢查過程中,陰錯(cuò)陽差地發(fā)現(xiàn),有一些特殊值高出正常值幾十倍,比如說有個(gè)BUN(血尿素氮)為2055,另外ApoA1和ApoB1存在數(shù)據(jù)單位不一致的問題,然后對(duì)它們進(jìn)行了修正。
?在本問題中,噪音數(shù)據(jù)比較容易發(fā)現(xiàn),一方面是特征不多,可以人工過濾,別一方面體驗(yàn)指標(biāo)有可參考范圍,容易界定是否為異常值。如果數(shù)據(jù)多或者經(jīng)過了脫敏處理,就需要一些更精確的算法,比如離群點(diǎn)檢測等等。
(2) 特征分類
?在本問題中,把特征分成兩類:基因數(shù)據(jù)和其它數(shù)據(jù)?;驍?shù)據(jù)是以SNP開頭的,取值為1,2,3,估計(jì)是位點(diǎn)信息,其值沒有大小關(guān)系,因此作為枚舉類型處理,做了onehot變換。其它特征均作為數(shù)值型處理。(注:SNP主要是指在基因組水平上由單個(gè)核苷酸的變異所引起的DNA序列多態(tài)性。)
(3) 標(biāo)準(zhǔn)化
?對(duì)數(shù)值型數(shù)據(jù)處了標(biāo)準(zhǔn)化處理,即:新數(shù)據(jù)=(原數(shù)據(jù)-均值)/標(biāo)準(zhǔn)差。然后將數(shù)值型的缺失值全部填充為0,即均值。
(4) 缺失值處理
?對(duì)SNP數(shù)據(jù)的缺失值處理試驗(yàn)了三種方法:
?第一種是做onehot后不處理缺失值,即1變成[1,0,0], 2變成[0,1,0], 3變成[0,0,1],缺失變成[0,0,0]。
?第二種是取出現(xiàn)次數(shù)最多的值作為缺失值,比如大多數(shù)都是2,則缺失值設(shè)為2。
?第三種是填加一種新值代表缺失值,這種方法線下效果最好,最終采了此方法。
(5) 特征調(diào)整
?去掉了孕前體重和身高,因?yàn)樘卣髦羞€包括了孕前BMI,從經(jīng)驗(yàn)看BMI可以取代體重和身高帶有的信息,從數(shù)據(jù)看,刪掉后的確有所提升。也嘗試刪掉其它一些特征和特征組合,效果都不明顯。
?有一些干擾特征,比無用特征更麻煩,從特征重要性排序看,還挺靠前,其實(shí)是來搗亂的。就比如說,有人被殺了,剛好XX早上和他打了一架,于是大家把XX當(dāng)成重要嫌疑人,結(jié)果真兇跑了。
3. 算法模型
?模型使用的是xgboost的分類,5折交叉驗(yàn)證。這類問題大多數(shù)都使用梯度提升決策樹算法(GBDT類),只是具體工具有所差別。
?這里主要的技術(shù)點(diǎn)是調(diào)參,我是用sklearn的GridSearchCV實(shí)現(xiàn)調(diào)參。其中一個(gè)核心的參數(shù)是scale_pos_weight,它指定了正反例的權(quán)重,直覺是:“患病者”的數(shù)據(jù)應(yīng)該更重要。這個(gè)值我也是通過調(diào)參找到了訓(xùn)練集對(duì)應(yīng)的最佳值。設(shè)置后A榜成績提高了,B榜試的少?zèng)]法下結(jié)論。
?使用scale_pos_weight引發(fā)的問題是,預(yù)測的結(jié)果分布和訓(xùn)練集不一致。如果想要分布一致,簡單地可以把判斷標(biāo)準(zhǔn)從0.5向上或向下調(diào),規(guī)范的一點(diǎn)的方法是做排序之后取前N個(gè)。
?大家好像都看到了結(jié)果的分布問題,于是最后一天,在群里討論預(yù)測結(jié)果里有多少個(gè)1?這又涉及了復(fù)賽的評(píng)分指標(biāo)F1。
4. 評(píng)分指標(biāo)
?復(fù)賽的評(píng)分指標(biāo)是F1分?jǐn)?shù)(F1 Score),是統(tǒng)計(jì)學(xué)中用來衡量二分類模型精確度的一種指標(biāo)。它同時(shí)兼顧了分類模型的準(zhǔn)確率和召回率。F1分?jǐn)?shù)可以看作是模型準(zhǔn)確率和召回率的一種加權(quán)平均,它的最大值是1,最小值是0.
f1=(2PR)/(P+R)
其中P的精確率(預(yù)測正確的正樣本/預(yù)測的正樣本),R是召回率(預(yù)測正確的正樣本/實(shí)際正樣本).
?簡單的說,如果瞎蒙一半對(duì)一半錯(cuò),F(xiàn)1在0.5左右,如果蒙全1,F(xiàn)1為0.667??雌饋?,如果拿不準(zhǔn)就蒙成1,勝算更大。
5. 其它嘗試
?還嘗試了一些其它方法,但都因效果不佳,沒用到最終代碼里,也在此分享一下思路。
(1) 模型融合:將同一模型,不同參數(shù)的概率結(jié)果取均值作為預(yù)測。
(2) 取更多的1:針對(duì)評(píng)價(jià)標(biāo)準(zhǔn),調(diào)高scale_pos_weight,使預(yù)測中含更多的1。
(3) 組合和去掉一些特征:用循環(huán)組合的方式加入和去掉一些特征。
(4) 取各模型的TopX值:取各個(gè)模型分別認(rèn)為最可能患病的實(shí)例。
6. 結(jié)果分析
?分析了一下模型預(yù)測的結(jié)果,基本分為三部分:
?第一種:各個(gè)算法的結(jié)論一致,并且是對(duì)的。
?第二種:各個(gè)算法的結(jié)論一致,并且是錯(cuò)的。
?第三種:各個(gè)算法的結(jié)論不一致,有對(duì)有錯(cuò)。
?前兩種往往混在一起的,算法都得到了一致的結(jié)論,能查出來就查出來了,查不出來也沒辦法了,畢竟數(shù)據(jù)也并非攜帶了所有信息。而第三種是疑似狀態(tài),也正是檢驗(yàn)算法的關(guān)鍵。
7. 遺憾和教訓(xùn)
?遺憾的是還有一些算法,不同算法的組合,特征組合,尤其是不同基因的組合,還都沒有嘗試,就結(jié)束了。教訓(xùn)也很多:
(1) 不要試圖參加deadline時(shí)間相近的多個(gè)比賽,時(shí)間不夠,就沒法做大的修改。
(2) 數(shù)據(jù)量小的比賽里暫時(shí)領(lǐng)先并不說明能模型好,很可能是過擬合了。
(3) 多看,仔細(xì)看別人的方案,少做“重復(fù)造輪子”的事情。
(4) 不要總是使用熟悉的工具,在這種比賽里嘗試更重要。
?除了加強(qiáng)技術(shù)以外,安排,心態(tài)也都很重要??傊煽儾缓?,就是還有提升空間,繼續(xù)努力中。