1、比賽概述html
2、可視化python
一般來講 matplotlib 和 seaborn 提供的繪圖功能就能夠知足需求了。git
比較經常使用的圖表有:github
大部分狀況下,在構造 Feature 以前,咱們須要對比賽提供的數據集進行一些處理。一般的步驟有:算法
這一部分的處理策略多半依賴於在前一步中探索數據集所獲得的結論以及建立的可視化圖表。在實踐中,我建議使用 iPython Notebook 進行對數據的操做,並熟練掌握經常使用的 pandas 函數。spring
總的來講,咱們應該生成儘可能多的 Feature,相信 Model 可以挑出最有用的 Feature。但有時先作一遍 Feature Selection 也能帶來一些好處:windows
Feature Selection 最實用的方法也就是看 Random Forest 訓練完之後獲得的 Feature Importance 了。其餘有一些更復雜的算法在理論上更加 Robust,可是缺少實用高效的實現,好比這個。從原理上來說,增長 Random Forest 中樹的數量能夠在必定程度上增強其對於 Noisy Data 的 Robustness。數組
看 Feature Importance 對於某些數據通過脫敏處理的比賽尤爲重要。這能夠省得你浪費大把時間在琢磨一個不重要的變量的意義上。網絡
這裏用一個例子來講明在一些狀況下 Raw Feature 可能須要通過一些轉換才能起到比較好的效果。dom
假設有一個 Categorical Variable 一共有幾萬個取值可能,那麼建立 Dummy Variables 的方法就不可行了。這時一個比較好的方法是根據 Feature Importance 或是這些取值自己在數據中的出現頻率,爲最重要(好比說前 95% 的 Importance)那些取值(有很大可能只有幾個或是十幾個)建立 Dummy Variables,而全部其餘取值都歸到一個「其餘」類裏面。
5、模型選擇
準備好 Feature 之後,就能夠開始選用一些常見的模型進行訓練了。Kaggle 上最經常使用的模型基本都是基於樹的模型:
如下模型每每在性能上稍遜一籌,可是很適合做爲 Ensemble 的 Base Model。這一點以後再詳細解釋。(固然,在跟圖像有關的比賽中神經網絡的重要性仍是不能小覷的。)
以上這些模型基本均可以經過 sklearn 來使用。
固然,這裏不能不提一下 Xgboost。Gradient Boosting 自己優秀的性能加上 Xgboost 高效的實現,使得它在 Kaggle 上廣爲使用。幾乎每場比賽的獲獎者都會用 Xgboost 做爲最終 Model 的重要組成部分。在實戰中,咱們每每會以 Xgboost 爲主來創建咱們的模型而且驗證 Feature 的有效性。順帶一提,在 Windows 上安裝 Xgboost 很容易遇到問題,目前已知最簡單、成功率最高的方案能夠參考我在這篇帖子中的描述。
在訓練時,咱們主要但願經過調整參數來獲得一個性能不錯的模型。一個模型每每有不少參數,但其中比較重要的通常不會太多。好比對 sklearn 的 RandomForestClassifier
來講,比較重要的就是隨機森林中樹的數量 n_estimators
以及在訓練每棵樹時最多選擇的特徵數量max_features
。因此咱們須要對本身使用的模型有足夠的瞭解,知道每一個參數對性能的影響是怎樣的。
一般咱們會經過一個叫作 Grid Search 的過程來肯定一組最佳的參數。其實這個過程說白了就是根據給定的參數候選對全部的組合進行暴力搜索。
1 |
param_grid = {'n_estimators': [300, 500], 'max_features': [10, 12, 14]} |
順帶一提,Random Forest 通常在 max_features
設爲 Feature 數量的平方根附近獲得最佳結果。
這裏要重點講一下 Xgboost 的調參。一般認爲對它性能影響較大的參數有:
eta
:每次迭代完成後更新權重時的步長。越小訓練越慢。num_round
:總共迭代的次數。subsample
:訓練每棵樹時用來訓練的數據佔所有的比例。用於防止 Overfitting。colsample_bytree
:訓練每棵樹時用來訓練的特徵的比例,相似 RandomForestClassifier
的 max_features
。max_depth
:每棵樹的最大深度限制。與 Random Forest 不一樣,Gradient Boosting 若是不對深度加以限制,最終是會 Overfit 的。early_stopping_rounds
:用於控制在 Out Of Sample 的驗證集上連續多少個迭代的分數都沒有提升後就提早終止訓練。用於防止 Overfitting。通常的調參步驟是:
eta
設得比較高(好比 0.1),num_round
設爲 300 ~ 500。eta
下降,找到最佳值。early_stopping_rounds
。 1 |
X_dtrain, X_deval, y_dtrain, y_deval = cross_validation.train_test_split(X_train, y_train, random_state=1026, test_size=0.3) |
最後要提一點,全部具備隨機性的 Model 通常都會有一個 seed
或是 random_state
參數用於控制隨機種子。獲得一個好的 Model 後,在記錄參數時務必也記錄下這個值,從而可以在以後重現 Model。
Cross Validation 是很是重要的一個環節。它讓你知道你的 Model 有沒有 Overfit,是否是真的可以 Generalize 到測試集上。在不少比賽中 Public LB 都會由於這樣那樣的緣由而不可靠。當你改進了 Feature 或是 Model 獲得了一個更高的 CV 結果,提交以後獲得的 LB 結果卻變差了,通常認爲這時應該相信 CV 的結果。固然,最理想的狀況是多種不一樣的 CV 方法獲得的結果和 LB 同時提升,但這樣的比賽並非太多。
在數據的分佈比較隨機均衡的狀況下,5-Fold CV 通常就足夠了。若是不放心,能夠提到 10-Fold。可是 Fold 越多訓練也就會越慢,須要根據實際狀況進行取捨。
不少時候簡單的 CV 獲得的分數會不大靠譜,Kaggle 上也有不少關於如何作 CV 的討論。好比這個。但總的來講,靠譜的 CV 方法是 Case By Case 的,須要在實際比賽中進行嘗試和學習,這裏就再也不(也不能)敘述了。
Ensemble Learning 是指將多個不一樣的 Base Model 組合成一個 Ensemble Model 的方法。它能夠同時下降最終模型的 Bias 和 Variance(證實能夠參考這篇論文,我最近在研究相似的理論,可能以後會寫新文章詳述),從而在提升分數的同時又下降 Overfitting 的風險。在如今的 Kaggle 比賽中要不用 Ensemble 就拿到獎金幾乎是不可能的。
常見的 Ensemble 方法有這麼幾種:
從理論上講,Ensemble 要成功,有兩個要素:
相比 Blending,Stacking 能更好地利用訓練數據。以 5-Fold 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 次求一個平均值,從而獲得一個形狀與第二層訓練數據相同的矩陣)拿出來讓它進行預測,就獲得最後的輸出。
這裏給出個人實現代碼:
1 |
class Ensemble(object): |
獲獎選手每每會使用比這複雜得多的 Ensemble,會出現三層、四層甚至五層,不一樣的層數之間有各類交互,還有將通過不一樣的 Preprocessing 和不一樣的 Feature Engineering 的數據用 Ensemble 組合起來的作法。但對於新手來講,穩妥當當地實現一個正確的 5-Fold Stacking 已經足夠了。
能夠看出 Kaggle 比賽的 Workflow 仍是比較複雜的。尤爲是 Model Selection 和 Ensemble。理想狀況下,咱們須要搭建一個高自動化的 Pipeline,它能夠作到:
對新手來講,第一點可能意義還不是太大,由於 Feature 的數量老是人腦管理的過來的;第三點問題也不大,由於每每就是在最後作幾回 Ensemble。可是第二點仍是頗有意義的,手工記錄每一個 Model 的表現不只浪費時間並且容易產生混亂。