12.Cross-Validation
本教程是ML系列的一部分。 在此步驟中,您將學習如何使用交叉驗證來更好地衡量模型性能。
What is Cross Validation
機器學習是一個迭代過程。
您將面臨關于要使用的預測變量,要使用的模型類型,提供這些模型的參數等的選擇。我們通過測量各種替代方案的模型質量,以數據驅動的方式做出這些選擇。
您已經學會使用train_test_split來分割數據,因此您可以測量測試數據的模型質量。 交叉驗證將此方法擴展到模型評分(或“模型驗證”)。與train_test_split相比,交叉驗證可以更準確地衡量模型的質量,但運行時間更長。
The Shortcoming of Train-Test Split
想象一下,你有一個5000行的數據集。 train_test_split函數有一個test_size參數,您可以使用該參數來決定進入訓練集的行數以及進入測試集的行數。測試集越大,您對模型質量的測量就越可靠。在極端情況下,您可以想象測試集中只有一行數據。如果您比較替代模型,哪一個對單個數據點做出最佳預測將主要是運氣問題。
通常,您將保留約20%作為測試數據集。但即使測試集中有1000行,也有一些隨機的機會來確定模型分數。模型可能在一組1000行中表現良好,即使它在不同的1000行上不準確。測試集越大,我們的模型質量測量中的隨機性(又稱“噪聲”)就越小。
但是我們只能通過從訓練數據中刪除數據來獲得大量測試集,而較小的訓練數據集意味著更糟糕的模型。事實上,對小型數據集的理想建模決策通常不是大型數據集的最佳建模決策。
?
The Cross-Validation Procedure
在交叉驗證中,我們在不同的數據子集上運行建模過程,以獲得多種模型質量度量。 例如,我們可以進行5次折疊或實驗。 我們將數據分為5個部分,每個部分占完整數據集的20%。
我們進行了一項名為實驗1的實驗,該實驗使用第一個折疊作為保留集,其他所有內容都作為訓練數據。 這為我們提供了基于20%保留集的模型質量度量,就像我們使用簡單的train-test分割得到的那樣。
然后我們進行第二次實驗,我們從第二次折疊中拿出數據(使用除第二次折疊之外的所有內容來訓練模型。)這使我們對模型質量進行了第二次估計。 我們重復這個過程,使用每次折疊作為保留。 將這些放在一起,100%的數據在某些時候被用作保留。
回到上面的train-test分割示例,如果我們有5000行數據,我們最終得到基于5000行保持的模型質量度量(即使我們不同時使用所有5000行)。
Trade-offs Between Cross-Validation and Train-Test Split
交叉驗證可以更準確地衡量模型質量,如果您做出大量建模決策,這一點尤為重要。但是,它可能需要更長的時間才能運行,因為它會為每次折疊估算一次模型。所以它正在做更多的工作。
鑒于這些權衡,您應該何時使用每種方法?在小型數據集上,運行交叉驗證的額外計算負擔并不是什么大問題。這些也是模型質量得分在train-test split時最不可靠的問題。因此,如果您的數據集較小,則應運行交叉驗證。
出于同樣的原因,對于較大的數據集,簡單的train-test split分割就足夠了。它運行得更快,你可能有足夠的數據,幾乎不需要重新使用其中的一些來保留。
大型和小型數據集沒有簡單的閾值。如果您的模型運行需要幾分鐘或更短時間,則可能需要切換到交叉驗證。如果您的模型運行時間更長,則交叉驗證可能會使您的工作流程變得更加糟糕。
或者,您可以運行交叉驗證并查看每個實驗的分數是否接近。如果每個實驗給出相同的結果,那么train-test split分裂可能就足夠了。
Example
首先我們讀取數據
【1】
import pandas as pd data = pd.read_csv('../input/melb_data.csv') cols_to_use = ['Rooms', 'Distance', 'Landsize', 'BuildingArea', 'YearBuilt'] X = data[cols_to_use] y = data.Price然后指定我們的建模步驟的管道(如果你不使用管道,可能很難正確地進行交叉驗證)
【2】
from sklearn.ensemble import RandomForestRegressor from sklearn.pipeline import make_pipeline from sklearn.preprocessing import Imputer my_pipeline = make_pipeline(Imputer(), RandomForestRegressor())最后我們得到交叉驗證得分:
【3】
from sklearn.model_selection import cross_val_score scores = cross_val_score(my_pipeline, X, y, scoring='neg_mean_absolute_error') print(scores) [-322244.30158131 -305507.19909774 -284635.2229142 ]您可能會注意到我們為評分指定了一個參數。 這指定了要報告的模型質量的度量。 scikit-learn的文檔顯示了一個選項列表。
在這種情況下,我們指定負平均絕對誤差有點令人驚訝。 Scikit-learn有一個約定,其中定義了所有指標,因此更高的數字更好。 在這里使用否定詞允許它們與該約定一致,盡管在其他地方幾乎聞所未聞。
您通常需要單一的模型質量度量來比較模型。 所以我們采用實驗的平均值。
【4】
print('Mean Absolute Error %2f' %(-1 * scores.mean())) Mean Absolute Error 304128.907864Conclusion
使用交叉驗證為我們提供了更好的模型質量測量,還有清理代碼的額外好處(不再需要跟蹤單獨的訓練和測試集。所以,這是一個很好的勝利。
Your Turn
?
總結
以上是生活随笔為你收集整理的12.Cross-Validation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金发辣妹COS女版祖国人:果然美女也可以
- 下一篇: 百度顶会论文复现(1):课程概述