Kaggle教程 機器學習中級5 交叉驗證

原文鏈接:https://www.kaggle.com/alexisbcook/cross-validation

在本節課程中,你將會學習如何使用交叉驗證來評估模型性能。

1、介紹

機器學習是一個迭代的過程。

您將面臨以下選擇:使用什麼預測變量、使用什麼類型的模型、向這些模型提供什麼參數等等。目前爲止,你使用驗證數據(或保留數據)評估模型質量來做出這些選擇。

但這種方法也有一些缺點。假設你有一個5000行的數據集,通常你會保留大約20%(1000行)的數據作爲驗證數據。但這再模型評分中會帶來隨機變化,有時在一組1000行校驗數據中表現良好,但在另一個1000行數據集中卻不準確。

在極端情況下,你可以想象在驗證數據集中只有一行數據。如果你比較不同的模型,那麼哪一個模型預測效果最好主要取決於運氣!

一般來說,驗證數據集越大,評估模型質量中帶來的隨機性(即“噪音”)越小,越可靠。不幸的是,我們只能從訓練數據中取出部分來獲取更大的驗證數據集,更小的訓練數據集意味着更糟糕的模型!

2、什麼是交叉驗證?

交叉驗證中,我們使用不同的數據子集來執行建模過程,以獲得模型質量的多個度量。

例如,我們可以將數據分成5個部分,每個部分佔整個數據集的20%。.在這種情況下,我們將數據分成5個“folds”。
tut5_crossval然後,我們對每個fold進行一次實驗:

  • 實驗1中,我們使用第一個fold作爲驗證(保留)數據集,其他fold爲訓練數據。這給我們一個基於20%保留數據集的模型質量度量。
  • 實驗2中,我們保留第二個fold的數據(其他fold爲訓練數據)。這將得到第二個模型質量評估結果。
  • 以此類推,使用每個fold作爲驗證數據集,我們最終得到的模型質量,是基於所有的行數據集(即使我們不同時使用所有行)。

3、什麼時候使用交叉驗證?

交叉驗證爲模型質量提供了更精確的度量,這在您進行大量建模決策時尤爲重要。然而,它可能需要更長的時間來運行,因爲它評估了多個模型(每個fold一個)。

所以,在此權衡之下,什麼時候使用每種方法呢?

  • 對於小數據集,額外的計算並不是什麼大事,你應該進行交叉驗證。
  • 對於較大的數據集,一個驗證數據集就夠了。你的代碼將會執行得更快,有足夠的數據就沒必要複用數據。

並沒有一個明確的界限來區數據集是大還是小,但如果你的模型幾分鐘或更短時間就能跑完,那麼久值得使用交叉驗證。

或者,你可以運行交叉驗證,看看每個實驗的分數是否接近。如果每個實驗都產生相同的結果,一個驗證集可能就足夠了。

4、案例

我們將會使用前面課程中相同的數據,加載輸入數據X並輸出數據到y

然後我們定義一個pipeline,使用填充器來填充缺失數據,以及隨機森林模型來做預測。

如果不使用 pipeline,來交叉驗證是非常困難的!使用pipeline將會使代碼非常簡單。

from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

my_pipeline = Pipeline(steps=[('preprocessor', SimpleImputer()),
                              ('model', RandomForestRegressor(n_estimators=50,
                                                              random_state=0))
                             ])

我們使用cross_val_score()函數來獲取交叉驗證評分,通過cv參數來設置fold數量。

from sklearn.model_selection import cross_val_score

# 乘以-1,因爲sklearn計算得到的是負MAE值(neg_mean_absolute_error)
scores = -1 * cross_val_score(my_pipeline, X, y,
                              cv=5,
                              scoring='neg_mean_absolute_error')

print("MAE scores:\n", scores)

輸出結果:

MAE scores:
 [301628.7893587  303164.4782723  287298.331666   236061.84754543
 260383.45111427]

scoring參數指定了模型質量的度量方法,我們選擇負的平均絕對誤差值scikit-learn文檔列出了可選值

指定負MAE有點奇怪。Scikit-learn有一個約定,大的數字意味着更好的效果。在這裏使用負號可以使它們與約定保持一致,儘管在其他地方幾乎沒有聽說過。

我們通常需要模型質量的單一度量來比較不同的模型,所以取全部實驗的平均值。

print("Average MAE score (across experiments):")
print(scores.mean())

輸出結果:

Average MAE score (across experiments):
277707.3795913405

5、結論

使用交叉驗證能使模型質量更好,同時代碼也更加簡潔:注意我們不再需要跟蹤每個的訓練和驗證集。尤其是對於小數據集,這是個很大的提升!

6、去吧,皮卡丘

把你的新技能運用到下一個練習中~

原文:
https://www.kaggle.com/alexisbcook/cross-validation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章