交叉驗證的思想
交叉驗證主要用於防止模型過於復雜而引起的過擬合,是一種評價訓練數據的數據集泛化能力的統計方法。其基本思想是將原始數據進行划分,分成訓練集和測試集,訓練集用來對模型進行訓練,測試集用來測試訓練得到的模型,以此來作為模型的評價指標。
簡單的交叉驗證
將原始數據D按比例划分,比如7:3,從D中隨機選擇70%的數據作為訓練集train_data,剩余的作為測試集test_data(綠色部分)。如下圖所示,這里的數據都只利用了一次,並沒有充分利用,對於小數據集,需要充分利用其數據的信息來訓練模型,一般會選擇K折交叉驗證。
K折交叉驗證
將原始數據D隨機分成K份,每次選擇(K-1)份作為訓練集,剩余的1份(紅色部分)作為測試集。交叉驗證重復K次,取K次准確率的平均值作為最終模型的評價指標。過程如下圖所示,它可以有效避免過擬合和欠擬合狀態的發生,K值的選擇根據實際情況調節。
python實現
使用scikit-learn模塊中的方法KFold,示例如下:
1 from sklearn.model_selection import KFold 2 import numpy as np 3 x = np.array(['B', 'H', 'L', 'O', 'K', 'P', 'W', 'G']) 4 kf = KFold(n_splits=2) 5 d = kf.split(x) 6 for train_idx, test_idx in d: 7 train_data = x[train_idx] 8 test_data = x[test_idx] 9 print('train_idx:{}, train_data:{}'.format(train_idx, train_data)) 10 print('test_idx:{}, test_data:{}'.format(test_idx, test_data)) 11 12 # train_idx:[4 5 6 7], train_data:['K' 'P' 'W' 'G'] 13 # test_idx:[0 1 2 3], test_data:['B' 'H' 'L' 'O'] 14 # train_idx:[0 1 2 3], train_data:['B' 'H' 'L' 'O'] 15 # test_idx:[4 5 6 7], test_data:['K' 'P' 'W' 'G']