眾所周知,Kaggle是一個(gè)全球知名的大數(shù)據(jù)競(jìng)賽砰蠢。能在Kaggle比賽中獲得一個(gè)好的名次,是對(duì)一個(gè)data scientist最好的肯定。現(xiàn)在询枚,我就把自己參加Kaggle的經(jīng)歷寫下來(lái),希望能幫到各位Kagglers浙巫。
PS 本文假設(shè)讀者對(duì) Machine Learning 的基本概念和常見(jiàn)模型已經(jīng)有一定了解金蜀。 Enjoy Reading!
我參加的是Kaggle的Quora Question Pairs比賽,共3394支隊(duì)伍參賽的畴。最后我們隊(duì)獲得了135名(top 4%)的好成績(jī)渊抄。在此,我們將自己參加比賽的具體流程和心路歷程記錄下來(lái)丧裁。完整代碼及心得體會(huì)在PPshrimpGo/Quora-Kaggle
數(shù)據(jù)分析 && 數(shù)據(jù)預(yù)處理
在參加比賽后护桦,我們要先對(duì)數(shù)據(jù)進(jìn)行分析。由于數(shù)據(jù)量很大煎娇,光靠肉眼顯然是不夠的二庵。在此,我們需要使用一些數(shù)據(jù)分析工具以及可視化工具缓呛,如pandas,matplotlib, seaborn等催享。
對(duì)數(shù)據(jù)做初步的分析非常有意義,比如對(duì)于分類問(wèn)題中的特征按特征觀察數(shù)據(jù)的分布强经,可以直觀的看出這個(gè)特征是否有足夠的“區(qū)分度”睡陪。
一個(gè)直觀的可視化展示也非常有助于進(jìn)行思考和挖掘數(shù)據(jù)分布上特征。
通常我們拿到是數(shù)據(jù)并不是“完美”的匿情,會(huì)存在各種各樣的情況兰迫。針對(duì)不同情況,我們需要做出不同的處理炬称。如空值處理汁果,就存在不同的方法。
除了數(shù)據(jù)本身存在的問(wèn)題玲躯,我們?yōu)榱烁玫靥崛√卣骱陀?xùn)練模型据德,也需要對(duì)數(shù)據(jù)進(jìn)行特殊處理(數(shù)據(jù)清洗)。例如在本次比賽中跷车,很多隊(duì)伍選擇將連在一起的詞拆開(kāi)(What's -> What is),替換原句中的非英文單詞等(印度語(yǔ) -> 英語(yǔ))棘利。
數(shù)據(jù)清洗的在比賽中可能起到很關(guān)鍵的作用,異常值的剔除和一些空值的補(bǔ)足會(huì)給特征提取減弱噪聲朽缴,加速模型的構(gòu)建善玫。通常數(shù)據(jù)清洗的手段有以下:
- 補(bǔ)充空值
- 剔除異常值
- 數(shù)據(jù)的轉(zhuǎn)化
具體的方法在如何在 Kaggle 首戰(zhàn)中進(jìn)入前 10%博客中有詳細(xì)介紹,在此不再贅述密强。
特征工程
一場(chǎng)Kaggle比賽茅郎,最重要的就是特征工程蜗元。一個(gè)良好的特征給預(yù)測(cè)結(jié)果帶來(lái)的提升是顯而易見(jiàn)的。很多人在做特征工程時(shí)很容易沒(méi)有頭緒系冗,下面我就說(shuō)一說(shuō)我們?cè)谶@次比賽中的特征提取思路奕扣。
首先,由于Quora Question Pairs屬于自然語(yǔ)言處理的文本相似性問(wèn)題掌敬。在考慮問(wèn)題的時(shí)候惯豆,我們從兩方面進(jìn)行思考:
1 傳統(tǒng)文本特征
2 詞向量特征
在這兩個(gè)方向,我們挖掘了30+個(gè)特征奔害,獲得了大約0.30的Public LB Score循帐。
在這一部分工作做完之后,我們接下來(lái)做了另外兩部分工作舀武。
1 研究最新的關(guān)于文本相似性的論文,從論文中獲取靈感离斩。并且银舱,我們將論文中的一些算法實(shí)現(xiàn),并將其加入我們的特征跛梗。
2 查看Kaggle上面的Kernel和discussion寻馏。Kaggle是一個(gè)非常活躍和樂(lè)于分享的社區(qū)核偿,很多人都愿意把自己的思路放上來(lái)供大家參考诚欠。
從這兩部分工作中,我們又獲得了許多特征漾岳,包括了兩個(gè)一度被認(rèn)為是leaky的magic feature(這兩個(gè)特征幫我們提升了接近0.1)轰绵。加上以上特征,我們的Public LB Score來(lái)到了0.15左右尼荆。
在這一部分左腔,建議大家挖掘特征方向可以思維開(kāi)闊一些,有時(shí)候順著別人的思路捅儒,會(huì)走的比較深液样,比如本次比賽的magic feature從基于圖的角度出發(fā),挖掘到了特征巧还,賽后看到top n的經(jīng)驗(yàn)分享鞭莽,很多人在此基礎(chǔ)上,挖掘了更多基于圖的特征麸祷,取得了不錯(cuò)的效果澎怒。
還有一個(gè)就是特征間的多項(xiàng)式組合,比如兩個(gè)句子的長(zhǎng)度摇锋,可以求他們的差值丹拯,也可以求他們的和等等站超。還有不同特征間的相互組合,常常會(huì)起較為出色的效果乖酬。
模型融合
在之前的特征工程中死相,我們一直是使用的xgboost作為單模型跑。融合階段咬像,我們決定使用stacking方法算撮。
Stacking
相比 Blending,Stacking 能更好地利用訓(xùn)練數(shù)據(jù)县昂。以 5-Fold Stacking 為例肮柜,它的基本原理如圖所示:
整個(gè)過(guò)程很像 Cross Validation。首先將訓(xùn)練數(shù)據(jù)分為 5 份倒彰,接下來(lái)一共 5 個(gè)迭代审洞,每次迭代時(shí),將 4 份數(shù)據(jù)作為 Training Set 對(duì)每個(gè) Base Model 進(jìn)行訓(xùn)練待讳,然后在剩下一份 Hold-out Set 上進(jìn)行預(yù)測(cè)芒澜。同時(shí)也要將其在測(cè)試數(shù)據(jù)上的預(yù)測(cè)保存下來(lái)。這樣创淡,每個(gè) Base Model 在每次迭代時(shí)會(huì)對(duì)訓(xùn)練數(shù)據(jù)的其中 1 份做出預(yù)測(cè)痴晦,對(duì)測(cè)試數(shù)據(jù)的全部做出預(yù)測(cè)。5 個(gè)迭代都完成以后我們就獲得了一個(gè) #訓(xùn)練數(shù)據(jù)行數(shù) x #Base Model 數(shù)量 的矩陣琳彩,這個(gè)矩陣接下來(lái)就作為第二層的 Model 的訓(xùn)練數(shù)據(jù)誊酌。當(dāng)?shù)诙拥?Model 訓(xùn)練完以后,將之前保存的 Base Model 對(duì)測(cè)試數(shù)據(jù)的預(yù)測(cè)(因?yàn)槊總€(gè) Base Model 被訓(xùn)練了 5 次露乏,對(duì)測(cè)試數(shù)據(jù)的全體做了 5 次預(yù)測(cè)碧浊,所以對(duì)這 5 次求一個(gè)平均值,從而得到一個(gè)形狀與第二層訓(xùn)練數(shù)據(jù)相同的矩陣)拿出來(lái)讓它進(jìn)行預(yù)測(cè)施无,就得到最后的輸出辉词。
Base Model 選擇如下:
- xgboost(0.14),
- LoesticRegression(0.19),
- RandomForestClassifier(0.19),
- GradientBoostingClassifier(0.19),
- MLPClassifier(0.20)
- LSTM(0.20)
經(jīng)過(guò)5折stacking,我們發(fā)現(xiàn)效果居然還不如單模型xgboost猾骡。What a sad story瑞躺!
經(jīng)過(guò)一番思考,我們認(rèn)為由于不同的模型使用了相同的特征做分類,模型的diversity不足兴想,于是在最后一天幢哨,采取了對(duì)每個(gè)fold隨機(jī)采樣百分之70的特征進(jìn)行stacking,此番操作減小了base model的水平嫂便,所以最后結(jié)果并沒(méi)有太大提升捞镰。
最后由于時(shí)間不足,我們最后選擇0.5Xgboost + 0.5LSTM草草了事。
賽后總結(jié)
- 1 因盡早進(jìn)行特征管理岸售,后期有些特征并不能起到作用甚至?xí)蟹醋饔眉!?梢詥为?dú)拿出這部分特征去做一些事情凸丸,特征間的多項(xiàng)式組合沒(méi)有考慮拷邢。
- 2 不要一頭扎進(jìn)單模型,盡早對(duì)其他模型進(jìn)行調(diào)參屎慢,后期時(shí)間很可能不夠
- 3 及早進(jìn)行stacking瞭稼,可以提前發(fā)現(xiàn)問(wèn)題并解決。
- 4 建立自己的PipeLine腻惠。
- 5 對(duì)DL的方法應(yīng)該早早考慮和實(shí)驗(yàn)环肘。
引用參考
如何在 Kaggle 首戰(zhàn)中進(jìn)入前 10%
在此特別感謝引用博客作者dnc11994學(xué)長(zhǎng)和小松stuart大叔在比賽期間的問(wèn)題解答。