首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

機器學習 Kaggle 隨機森林 分析師 THU數據派 2017-06-09

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

作者:Werner Chao

翻譯:白靜

術語校對:黃凱波

本文長度為2800字,建議閱讀8分鐘

線上心理健康公司KaJin Health首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

最近,Kaggle競賽非常受歡迎,很多人都試圖獲得好成績。但是,這些競賽競爭十分激烈,獲勝者通常不會透露其方法。通常情況下,獲勝者只會寫一個他們所做的事情的簡單概述,而不會透露很多,所以用何種方法可用的提高模型精確度仍是一個謎。

這篇博文介紹瞭如何在Kaggle競賽中提高模型精確度。我將分享一些如何獲得較高分數且排名相對靠前(達到前10%)的步驟。這篇博文結構如下:

1. 數據探索(Data Exploratory)

1.1 數值數據(Numerical Data)

1.2 分類數據(Categorical Data)

2. 模型建立(Model Building)

2.1 線性迴歸(Linear Regression)

2.2 LASSO迴歸(Lasso Regression)

2.3嶺迴歸(Ridge Regression)

2.3.1 數據轉換(Data Transformation)

2.4 隨機森林(Random Forest)

2.5 梯度推進器1(Gradient Boosting Machine)

2.6 神經網絡(Neural Network)

2.7 疊加模型(Stacking Models)

1. 數據探索(Data Exploratory)

1.1 數值數據(Numerical Data)

首先,我們迅速瀏覽一下數據。這裡有14組連續(數值)特徵。令人感到意外的是,這些數據相當整齊。看以下兩個圖表,如果我們注意到平均數和標準差,會發現平均數在0.5左右,標準差在0.2上下。這意味著這些數據已經被轉換過了。

接下來,我們將為這14組連續特徵繪製直方圖,這裡我們要注意的是特徵“cont7”和“cont9”左偏。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

損失(Loss)變量的繪製情況並不好,因此我們為其繪製一個單獨的直方圖,發現損失變量也是左偏。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

為了查明這些變量的偏斜程度,我們計算了偏斜度。“cont7”“cont9”和“損失”這三個變量的偏斜程度最高。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

如果進一步繪製一個箱線圖,我們會再次發現“cont7”和“cont9”有很多離群值。如果我們嘗試修正偏斜度,可能會減少離群值的數量。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

在此,我們將嘗試三種轉換類型,對它們進行比較,找出效果最好的一種,這三種轉換類型分別是:對數(log)、開平方根(sqrt)和Boxcox轉換。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

我們能夠清楚地發現Boxcox變換對這三種情況都起作用。但是我們不能將Boxcox變換用在“損失”(Loss)變量上,因為目前在Python裡,沒有撤銷Boxcox的功能。因此,我們無法做到:在預測之後將“損失” (Loss)轉換回去,再計算平均絕對誤差(mean absolute error)。隨後,我們將使用對數(log)來轉換“損失”(Loss)變量。

1.2 分類特徵(Categorical Features)

對於分類特徵,我們可以繪製頻率圖。關於分類特徵的幾個要點如下:

  • 類別標籤A、B只與分類特徵1到分類特徵72有關;

  • 73-78特徵描述了兩個以上的類別;

  • 109-116特徵表達了多種類別。

這裡有幾幅採樣頻率圖來證明以上三點:

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

2. 模型建立(Model Building)

2.1 線性迴歸(Linear Regression)

分析完連續特徵和分類特徵之後,我們就可以開始建立模型了。要注意的是這個數據集非常完整,沒有任何缺失數據。這裡我們將要做的是建立一個工作流程,首先輸入原始數據,然後隨著我們對數據進行不同轉換,可以將新模型與基準模型(原始數據案例)進行比較。原始數據案例是未經轉換的連續特徵和虛擬編碼特徵。至少,我們必須對分類數據做虛擬編碼,這是因為sklearn模型不允許觀察數據中有字符串。

我們可以擬合一個如下所示的線性迴歸:

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

如上所示,測試得分遠大於訓練得分。這意味著訓練集過擬合。關於這個估計需要說明的一點是:我們正在使用平均絕對誤差,這裡這個值是負數是因為sklearn使其成為負值。所以當我們降低這個誤差時(調整模型使誤差更接近零),看起來卻像是在提高分數(即:-1﹣(-2)=1,因此新成績比以前的成績高了1分)

2.2 LASSO迴歸(Lasso Regression)

很明顯我們需要一個正則化,因此將使用Lasso迴歸。記住,Lasso迴歸只是線性迴歸加一個正則化項。我們可以在下面看到一個5折的交叉驗證。我們得到的交叉驗證分數大約為1300,接近之前線性迴歸1288的分數。這意味著我們處在正確的軌道上!雖然三種不同的情況產生的結果非常接近,但注意下面的網格搜索告訴我們最好的alpha是0.1.

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

2.3 嶺迴歸(Ridge Regression)

另一個易於使用的正則化是嶺迴歸。由於我們已經知道Lasso迴歸的效果很好,所以這個數據集很有可能是一個線性問題,我們將使用嶺迴歸來解決這個問題。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

2.3.1 數據轉換(Data Transformation)

現在有了工作流程設置,我們將使用嶺迴歸來檢測不同的數據轉換,探究哪種轉換能得出最好的結果。記得之前我們已經對特徵“cont7”和“cont9”進行了boxcox轉換,但是並未真正實行(直到現在我們使用的一直是原始連續特徵和獨熱編碼分類特徵)。現在我們將實行這個轉換。

我們將實施並比較這些轉換:

  • 原始(數值/連續特徵)+虛擬編碼(分類特徵)

Raw (numerical/continuous features) + Dummy Encode (categorical features)

  • 歸一化(數值)+虛擬(分類)

Normalized (num) + Dum (cat)

  • Boxcox轉換&歸一化(數值)+虛擬(分類)

Boxcox Transformed & Normalized (Num) + Dum (cat)

  • Box&範數(數值)+虛擬(分類)+log1(損失變量)

Box & Norm (num) + Dum (cat) + Log1 (Loss variable)

下表並列比較了交叉驗證的誤差,我們發現使用損失(目標)變量的對數得到了最好的結果。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

2.4 隨機森林(Random Forest)

現在我們已經進行了轉換,並且知道這個問題是一個線性案例,我們可以轉向更復雜的模型,比如,隨機森林。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

我們馬上發現交叉驗證得分從1251(來自嶺迴歸)改進到1197。

2.5 梯度推進器(Gradient Boosting Machine)

我們將進一步採用更加高級的模型——梯度推進器(Gradient Boosting Machine)。這個程序庫被稱為極端梯度提升2(Xgboost),因為它優化了梯度推進算法。在此,我將分享優化過的超參數。調整極端梯度提升(Xgboost)是一門耗時的藝術,因此我們不在這裡談論。這篇博文論述的是一種循序漸進的方法,我將簡要介紹這裡採取的一般步驟:

1. 推測學習率和n_estimator

Guess learning_rate & n_estimator

2. 交叉驗證調整min_child_weight和max_depth

Cross validate to tune for min_child_weight & max_depth

3. 交叉驗證調整colsample_bytree和subsample

Cross validate to tune for colsample_bytree & subsample

4. 交叉驗證調整gamma

Cross validate to tune for gamma

5. 降低學習率並調整n_estimator

Decrease learning_rate & tune for n_estimator

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

通過使用這些參數,我們能夠得到的交叉驗證分數為1150——再次改進了誤差!

2.6 神經網絡(Neural Network)

我們也將使用神經網絡來擬合這個數據集。如今,不使用神經網絡幾乎不可能贏得競賽。

神經網絡的主要問題是它很難調整、也很難知道有多少層次、要使用多少隱藏節點。我的做法是先從單層開始,並且我使用的隱藏節點的數量是特徵數量的兩倍,然後慢慢增加更多的層次,最後我得到了如下結構。我用Keras作為前端,Tensorflow作為後端。在這個模型中,我得到的交叉驗證分數是1115。

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

因此,可比較不同的模型:

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

2.7 疊加模型(Stacking Models)

還記得我們的初始平均絕對誤差是1300嗎?我們已經將這一誤差改進了14%,數值降至1115。然而單一模型並不能讓你在Kaggle競賽中取得好名次,我們需要疊加模型。

疊加模型的概念是每個模型在什麼情況下運行良好,就採用其最好部分。這篇博文一個擴展的指南和解釋。

簡化版本如下:

  1. 將訓練集分割成幾份(在我的案例中分成了5份);

  2. 在不同份數下訓練每個模型,並對分割的訓練數據進行預測;

  3. 設置一個簡單的機器學習算法,如線性迴歸;

  4. 使用每個模型訓練的權重作為線性迴歸的特徵;

  5. 使用原始數據訓練集目標作為線性迴歸的目標。

為了更容易理解上述步驟,我創建了下表:

我的疊加代碼在Github存儲庫中。我疊加了兩個最好的模型: 極端梯度提升(Xgboost)和神經網絡。

提交我的疊加模型之後,我的測試得分為1115.75.

首席數據分析師教你怎麼一步步提升Kaggle競賽模型的精確度

通過排行榜可以得知,如果我在競賽結束之前提交模型,1115.75在3055個團隊中大概排名326,你可以通過Kaggle排行榜鏈接進行查證,大概排在前10%到11%。

1.譯者注:又譯“梯度提升機”。

2.譯者注:XGBoost是“極端梯度提升”(eXtreme Gradient Boosting)的簡稱,XGBoost源於梯度提升框架,但是更加高效。XGBoost已屢屢斬獲Kaggle各項競賽的冠軍寶座。

相關推薦

推薦中...