天天看點

K-Fold 交叉驗證 (Cross-Validation)

在機器學習模組化過程中,通行的做法通常是将資料分為訓練集和測試集。測試集是與訓練獨立的資料,完全不參與訓練,用于最終模型的評估。在訓練過程中,經常會出現過拟合的問題,就是模型可以很好的比對訓練資料,卻不能很好在預測訓練集外的資料。如果此時就使用測試資料來調整模型參數,就相當于在訓練時已知部分測試資料的資訊,會影響最終評估結果的準确性。通常的做法是在訓練資料再中分出一部分做為驗證(Validation)資料,用來評估模型的訓練效果。

驗證資料取自訓練資料,但不參與訓練,這樣可以相對客觀的評估模型對于訓練集之外資料的比對程度。模型在驗證資料中的評估常用的是交叉驗證,又稱循環驗證。它将原始資料分成K組(K-Fold),将每個子集資料分别做一次驗證集,其餘的K-1組子集資料作為訓練集,這樣會得到K個模型。這K個模型分别在驗證集中評估結果,最後的誤差MSE(Mean Squared Error)加和平均就得到交叉驗證誤差。交叉驗證有效利用了有限的資料,并且評估結果能夠盡可能接近模型在測試集上的表現,可以做為模型優化的名額使用。

下面舉一個具體的例子來說明K-Fold的過程,比如如下的資料

[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
           

分為K=3組後

Fold1: [0.5, 0.2]
Fold2: [0.1, 0.3]
Fold3: [0.4, 0.6]
           

交叉驗證的時會使用如下三個模型,分别進行訓練和測試,每個測試集誤差MSE加和平均就得到了交叉驗證的總評分

Model1: Trained on Fold1 + Fold2, Tested on Fold3
Model2: Trained on Fold2 + Fold3, Tested on Fold1
Model3: Trained on Fold1 + Fold3, Tested on Fold2
           

K-Fold Sklearn API

Scikit中指供了K-Fold API,n-split就是K值,shuffle指是否對資料洗牌,random_state為随機種子

# scikit-learn k-fold cross-validation
from numpy import array
from sklearn.model_selection import KFold
# data sample
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
# prepare cross validation
kfold = KFold(n_splits=3, shuffle = True, random_state= 1)
# enumerate splits
for train, test in kfold.split(data):
    print('train: %s, test: %s' % (data[train], data[test]))
           
train: [0.1 0.4 0.5 0.6], test: [0.2 0.3]
train: [0.2 0.3 0.4 0.6], test: [0.1 0.5]
train: [0.1 0.2 0.3 0.5], test: [0.4 0.6]
           

K-Fold in Cross Validation

Scikit中提取帶K-Fold接口的交叉驗證接口sklearn.model_selection.cross_validate,但是該接口沒有資料shuffle功能,是以一般結合Kfold一起使用。如果Train資料在分組前已經經過了shuffle處理,比如使用train_test_split分組,那就可以直接使用cross_val_score接口

import numpy as np
from sklearn import svm, datasets
from sklearn.model_selection import cross_val_score

iris = datasets.load_iris()
X, y = iris.data, iris.target

clf = svm.SVC(kernel='linear', C=1, random_state=0)

n_folds = 5
kf = KFold(n_folds, shuffle=True, random_state=42).get_n_splits(X)
scores = cross_val_score(clf, X, y, scoring='precision_macro', cv = kf)

scores[0]
           

K值的選取會影響bias和viriance。K越大,每次投入的訓練集的資料越多,模型的Bias越小。但是K越大,又意味着每一次選取的訓練集之前的相關性越大,而這種大相關性會導緻最終的test error具有更大的Variance。一般來說,根據經驗我們一般選擇k=5或10。作者:自由01

連結:https://www.jianshu.com/p/284581d9b189

來源:簡書

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

繼續閱讀