記我的第一次Kaggle比賽

Author: Shiyi001 && Bobbbb

眾所周知,Kaggle是一個全球知名的大數(shù)據(jù)競賽。能在Kaggle比賽中獲得一個好的名次,是對一個data scientist最好的肯定?,F(xiàn)在,我就把自己參加Kaggle的經(jīng)歷寫下來,希望能幫到各位Kagglers。

PS 本文假設(shè)讀者對 Machine Learning 的基本概念和常見模型已經(jīng)有一定了解。 Enjoy Reading!

我參加的是Kaggle的Quora Question Pairs比賽,共3394支隊伍參賽。最后我們隊獲得了135名(top 4%)的好成績。在此,我們將自己參加比賽的具體流程和心路歷程記錄下來。完整代碼及心得體會在PPshrimpGo/Quora-Kaggle

數(shù)據(jù)分析 && 數(shù)據(jù)預(yù)處理

在參加比賽后,我們要先對數(shù)據(jù)進(jìn)行分析。由于數(shù)據(jù)量很大,光靠肉眼顯然是不夠的。在此,我們需要使用一些數(shù)據(jù)分析工具以及可視化工具,如pandas,matplotlib, seaborn等。

對數(shù)據(jù)做初步的分析非常有意義,比如對于分類問題中的特征按特征觀察數(shù)據(jù)的分布,可以直觀的看出這個特征是否有足夠的“區(qū)分度”。

一個直觀的可視化展示也非常有助于進(jìn)行思考和挖掘數(shù)據(jù)分布上特征。

通常我們拿到是數(shù)據(jù)并不是“完美”的,會存在各種各樣的情況。針對不同情況,我們需要做出不同的處理。如空值處理,就存在不同的方法。

除了數(shù)據(jù)本身存在的問題,我們?yōu)榱烁玫靥崛√卣骱陀?xùn)練模型,也需要對數(shù)據(jù)進(jìn)行特殊處理(數(shù)據(jù)清洗)。例如在本次比賽中,很多隊伍選擇將連在一起的詞拆開(What's -> What is),替換原句中的非英文單詞等(印度語 -> 英語)。

數(shù)據(jù)清洗的在比賽中可能起到很關(guān)鍵的作用,異常值的剔除和一些空值的補(bǔ)足會給特征提取減弱噪聲,加速模型的構(gòu)建。通常數(shù)據(jù)清洗的手段有以下:

  • 補(bǔ)充空值
  • 剔除異常值
  • 數(shù)據(jù)的轉(zhuǎn)化

具體的方法在如何在 Kaggle 首戰(zhàn)中進(jìn)入前 10%博客中有詳細(xì)介紹,在此不再贅述。

特征工程

一場Kaggle比賽,最重要的就是特征工程。一個良好的特征給預(yù)測結(jié)果帶來的提升是顯而易見的。很多人在做特征工程時很容易沒有頭緒,下面我就說一說我們在這次比賽中的特征提取思路。

首先,由于Quora Question Pairs屬于自然語言處理的文本相似性問題。在考慮問題的時候,我們從兩方面進(jìn)行思考:

1 傳統(tǒng)文本特征
2 詞向量特征

在這兩個方向,我們挖掘了30+個特征,獲得了大約0.30的Public LB Score。

在這一部分工作做完之后,我們接下來做了另外兩部分工作。

1 研究最新的關(guān)于文本相似性的論文,從論文中獲取靈感。并且,我們將論文中的一些算法實現(xiàn),并將其加入我們的特征。
2 查看Kaggle上面的Kernel和discussion。Kaggle是一個非?;钴S和樂于分享的社區(qū),很多人都愿意把自己的思路放上來供大家參考。

從這兩部分工作中,我們又獲得了許多特征,包括了兩個一度被認(rèn)為是leaky的magic feature(這兩個特征幫我們提升了接近0.1)。加上以上特征,我們的Public LB Score來到了0.15左右。

在這一部分,建議大家挖掘特征方向可以思維開闊一些,有時候順著別人的思路,會走的比較深,比如本次比賽的magic feature從基于圖的角度出發(fā),挖掘到了特征,賽后看到top n的經(jīng)驗分享,很多人在此基礎(chǔ)上,挖掘了更多基于圖的特征,取得了不錯的效果。

還有一個就是特征間的多項式組合,比如兩個句子的長度,可以求他們的差值,也可以求他們的和等等。還有不同特征間的相互組合,常常會起較為出色的效果。

模型融合

在之前的特征工程中,我們一直是使用的xgboost作為單模型跑。融合階段,我們決定使用stacking方法。

Stacking
相比 Blending,Stacking 能更好地利用訓(xùn)練數(shù)據(jù)。以 5-Fold Stacking 為例,它的基本原理如圖所示:

Stacking

整個過程很像 Cross Validation。首先將訓(xùn)練數(shù)據(jù)分為 5 份,接下來一共 5 個迭代,每次迭代時,將 4 份數(shù)據(jù)作為 Training Set 對每個 Base Model 進(jìn)行訓(xùn)練,然后在剩下一份 Hold-out Set 上進(jìn)行預(yù)測。同時也要將其在測試數(shù)據(jù)上的預(yù)測保存下來。這樣,每個 Base Model 在每次迭代時會對訓(xùn)練數(shù)據(jù)的其中 1 份做出預(yù)測,對測試數(shù)據(jù)的全部做出預(yù)測。5 個迭代都完成以后我們就獲得了一個 #訓(xùn)練數(shù)據(jù)行數(shù) x #Base Model 數(shù)量 的矩陣,這個矩陣接下來就作為第二層的 Model 的訓(xùn)練數(shù)據(jù)。當(dāng)?shù)诙拥?Model 訓(xùn)練完以后,將之前保存的 Base Model 對測試數(shù)據(jù)的預(yù)測(因為每個 Base Model 被訓(xùn)練了 5 次,對測試數(shù)據(jù)的全體做了 5 次預(yù)測,所以對這 5 次求一個平均值,從而得到一個形狀與第二層訓(xùn)練數(shù)據(jù)相同的矩陣)拿出來讓它進(jìn)行預(yù)測,就得到最后的輸出。

Base Model 選擇如下:

  • xgboost(0.14),
  • LoesticRegression(0.19),
  • RandomForestClassifier(0.19),
  • GradientBoostingClassifier(0.19),
  • MLPClassifier(0.20)
  • LSTM(0.20)

經(jīng)過5折stacking,我們發(fā)現(xiàn)效果居然還不如單模型xgboost。What a sad story!
經(jīng)過一番思考,我們認(rèn)為由于不同的模型使用了相同的特征做分類,模型的diversity不足,于是在最后一天,采取了對每個fold隨機(jī)采樣百分之70的特征進(jìn)行stacking,此番操作減小了base model的水平,所以最后結(jié)果并沒有太大提升。

最后由于時間不足,我們最后選擇0.5Xgboost + 0.5LSTM草草了事。

賽后總結(jié)

  • 1 因盡早進(jìn)行特征管理,后期有些特征并不能起到作用甚至?xí)蟹醋饔谩?梢詥为?dú)拿出這部分特征去做一些事情,特征間的多項式組合沒有考慮。
  • 2 不要一頭扎進(jìn)單模型,盡早對其他模型進(jìn)行調(diào)參,后期時間很可能不夠
  • 3 及早進(jìn)行stacking,可以提前發(fā)現(xiàn)問題并解決。
  • 4 建立自己的PipeLine。
  • 5 對DL的方法應(yīng)該早早考慮和實驗。

引用參考

如何在 Kaggle 首戰(zhàn)中進(jìn)入前 10%
在此特別感謝引用博客作者dnc11994學(xué)長和小松stuart大叔在比賽期間的問題解答。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容