什麼是交叉驗證法?
交叉驗證用於防止模型過於複雜而引起的過擬合.有時亦稱循環估計, 是一種統計學上將數據樣本切割成較小子集的實用方法。於是可以先在一個子集上做分析, 而其它子集則用來做後續對此分析的確認及驗證。 一開始的子集被稱為訓練集。而其它的子集則被稱為驗證集或測試集。交叉驗證是一種評估統計分析、機器學習算法對獨立於訓練數據的數據集的泛化能力(generalize)。
交叉驗證一般要儘量滿足:
1)訓練集的比例要足夠多,一般大於一半
2)訓練集和測試集要均勻抽樣
為什麼用交叉驗證法?
交叉驗證用於評估模型的預測性能,尤其是訓練好的模型在新數據上的表現,可以在一定程度上減小過擬合。
還可以從有限的數據中獲取儘可能多的有效信息。
交叉驗證的主要方法
1. 留出法 (holdout cross validation)
在機器學習任務中,拿到數據後,在數據處理之後,我們會將原始數據集分為兩部分:訓練集、測試集。
訓練集用於訓練模型,測試集對於模型來說是未知數據,用於評估模型的泛化能力。
這個方法操作簡單,只需隨機把原始數據分為兩組數據即可。這是目前最常見也是最常用的方式
不過如果只做一次分割,它對訓練集、測試集的樣本數比例,還有分割後數據的分佈是否和原始數據集的分佈相同等因素比較敏感,不同的劃分會得到不同的最優模型,而且分成兩個集合後,用於訓練的數據更少了。
用 train_test_split 來隨機劃分數據集,其中 20% 用於測試集,80% 為訓練集。
2. k 折交叉驗證(k-fold cross validation)
k 折交叉驗證通過對 k 個不同分組訓練的結果進行平均來減少方差,因此模型的性能對數據的劃分就不那麼敏感。
第一步,不重複抽樣將原始數據隨機分為 k 份。
第二步,每一次挑選其中 1 份作為測試集,剩餘 k-1 份作為訓練集用於模型訓練。
第三步,重複第二步 k 次,這樣每個子集都有一次機會作為測試集,其餘機會作為訓練集。
在每個訓練集上訓練後得到一個模型,
用這個模型在相應的測試集上測試,計算並保存模型的評估指標,
第四步,計算 k 組測試結果的平均值作為模型精度的估計,並作為當前 k 折交叉驗證下模型的性能指標。
數據量小的時候,k 可以設大一點,這樣訓練集佔整體比例就比較大,不過同時訓練的模型個數也增多,數據量大的時候,k 可以設小一點。
當 k=m 即樣本總數時,每次的測試集都只有一個樣本,要進行 m 次訓練和預測。
這個方法用於訓練的數據只比整體數據集少了一個樣本,因此最接近原始樣本的分佈。
但是訓練複雜度增加了,因為模型的數量與原始數據樣本數量相同。
一般在數據缺乏時使用。
此外:
多次 k 折交叉驗證再求均值,例如:10 次 10 折交叉驗證,以求更精確一點。
劃分時有多種方法,例如對非平衡數據可以用分層採樣,就是在每一份子集中都保持和原始數據集相同的類別比例。
模型訓練過程的所有步驟,包括模型選擇,特徵選擇等都是在單個摺疊 fold 中獨立執行的。
最簡單的方法是直接調用 cross_val_score,這裡用了 5 折交叉驗證:
使用交叉驗證得到精準率,召回率,和綜合評價指標,代碼如下:
閱讀更多 愛數據的小司機 的文章