眾所周知,Kaggle是一個全球知名的大數據競賽。能在Kaggle比賽中獲得一個好的名次,是對一個data scientist最好的肯定。現在,我就把自己參加Kaggle的經歷寫下來,希望能幫到各位Kagglers。
PS 本文假設讀者對 Machine Learning 的基本概念和常見模型已經有一定了解。 Enjoy Reading!
我參加的是Kaggle的Quora Question Pairs比賽,共3394支隊伍參賽。最后我們隊獲得了135名(top 4%)的好成績。在此,我們將自己參加比賽的具體流程和心路歷程記錄下來。完整代碼及心得體會在PPshrimpGo/Quora-Kaggle
數據分析 && 數據預處理
在參加比賽后,我們要先對數據進行分析。由于數據量很大,光靠肉眼顯然是不夠的。在此,我們需要使用一些數據分析工具以及可視化工具,如pandas,matplotlib, seaborn等。
對數據做初步的分析非常有意義,比如對于分類問題中的特征按特征觀察數據的分布,可以直觀的看出這個特征是否有足夠的“區分度”。
一個直觀的可視化展示也非常有助于進行思考和挖掘數據分布上特征。
通常我們拿到是數據并不是“完美”的,會存在各種各樣的情況。針對不同情況,我們需要做出不同的處理。如空值處理,就存在不同的方法。
除了數據本身存在的問題,我們為了更好地提取特征和訓練模型,也需要對數據進行特殊處理(數據清洗)。例如在本次比賽中,很多隊伍選擇將連在一起的詞拆開(What's -> What is),替換原句中的非英文單詞等(印度語 -> 英語)。
數據清洗的在比賽中可能起到很關鍵的作用,異常值的剔除和一些空值的補足會給特征提取減弱噪聲,加速模型的構建。通常數據清洗的手段有以下:
- 補充空值
- 剔除異常值
- 數據的轉化
具體的方法在如何在 Kaggle 首戰中進入前 10%博客中有詳細介紹,在此不再贅述。
特征工程
一場Kaggle比賽,最重要的就是特征工程。一個良好的特征給預測結果帶來的提升是顯而易見的。很多人在做特征工程時很容易沒有頭緒,下面我就說一說我們在這次比賽中的特征提取思路。
首先,由于Quora Question Pairs屬于自然語言處理的文本相似性問題。在考慮問題的時候,我們從兩方面進行思考:
1 傳統文本特征
2 詞向量特征
在這兩個方向,我們挖掘了30+個特征,獲得了大約0.30的Public LB Score。
在這一部分工作做完之后,我們接下來做了另外兩部分工作。
1 研究最新的關于文本相似性的論文,從論文中獲取靈感。并且,我們將論文中的一些算法實現,并將其加入我們的特征。
2 查看Kaggle上面的Kernel和discussion。Kaggle是一個非常活躍和樂于分享的社區,很多人都愿意把自己的思路放上來供大家參考。
從這兩部分工作中,我們又獲得了許多特征,包括了兩個一度被認為是leaky的magic feature(這兩個特征幫我們提升了接近0.1)。加上以上特征,我們的Public LB Score來到了0.15左右。
在這一部分,建議大家挖掘特征方向可以思維開闊一些,有時候順著別人的思路,會走的比較深,比如本次比賽的magic feature從基于圖的角度出發,挖掘到了特征,賽后看到top n的經驗分享,很多人在此基礎上,挖掘了更多基于圖的特征,取得了不錯的效果。
還有一個就是特征間的多項式組合,比如兩個句子的長度,可以求他們的差值,也可以求他們的和等等。還有不同特征間的相互組合,常常會起較為出色的效果。
模型融合
在之前的特征工程中,我們一直是使用的xgboost作為單模型跑。融合階段,我們決定使用stacking方法。
Stacking
相比 Blending,Stacking 能更好地利用訓練數據。以 5-Fold Stacking 為例,它的基本原理如圖所示:
Stacking
整個過程很像 Cross Validation。首先將訓練數據分為 5 份,接下來一共 5 個迭代,每次迭代時,將 4 份數據作為 Training Set 對每個 Base Model 進行訓練,然后在剩下一份 Hold-out Set 上進行預測。同時也要將其在測試數據上的預測保存下來。這樣,每個 Base Model 在每次迭代時會對訓練數據的其中 1 份做出預測,對測試數據的全部做出預測。5 個迭代都完成以后我們就獲得了一個 #訓練數據行數 x #Base Model 數量 的矩陣,這個矩陣接下來就作為第二層的 Model 的訓練數據。當第二層的 Model 訓練完以后,將之前保存的 Base Model 對測試數據的預測(因為每個 Base Model 被訓練了 5 次,對測試數據的全體做了 5 次預測,所以對這 5 次求一個平均值,從而得到一個形狀與第二層訓練數據相同的矩陣)拿出來讓它進行預測,就得到最后的輸出。
Base Model 選擇如下:
- xgboost(0.14),
- LoesticRegression(0.19),
- RandomForestClassifier(0.19),
- GradientBoostingClassifier(0.19),
- MLPClassifier(0.20)
- LSTM(0.20)
經過5折stacking,我們發現效果居然還不如單模型xgboost。What a sad story!
經過一番思考,我們認為由于不同的模型使用了相同的特征做分類,模型的diversity不足,于是在最后一天,采取了對每個fold隨機采樣百分之70的特征進行stacking,此番操作減小了base model的水平,所以最后結果并沒有太大提升。
最后由于時間不足,我們最后選擇0.5Xgboost + 0.5LSTM草草了事。
賽后總結
- 1 因盡早進行特征管理,后期有些特征并不能起到作用甚至會有反作用??梢詥为毮贸鲞@部分特征去做一些事情,特征間的多項式組合沒有考慮。
- 2 不要一頭扎進單模型,盡早對其他模型進行調參,后期時間很可能不夠
- 3 及早進行stacking,可以提前發現問題并解決。
- 4 建立自己的PipeLine。
- 5 對DL的方法應該早早考慮和實驗。
引用參考
如何在 Kaggle 首戰中進入前 10%
在此特別感謝引用博客作者dnc11994學長和小松stuart大叔在比賽期間的問題解答。