交叉驗證(Cross Validation)是驗證分類器(你訓練的模型)性能的一種統(tǒng)計分析方法。其基本思想是在某種意義下將原始訓練數(shù)據(jù)進行分組,訓練集和驗證集。所以對于一個大數(shù)據(jù)集,一般我們會把它按照 6:2:2 分成訓練集、驗證集和測試集(簡易的機器學習過程會省去驗證集)。
首先用訓練集對模型進行訓練,再利用驗證集來測試訓練得到的模型,以此來初步評價模型的性能(注意!交叉驗證還是處于訓練的階段,不是測試階段)。
常見的交叉驗證方法包括簡單交叉驗證、K折交叉驗證、留一法交叉驗證 和 留P法交叉驗證。
簡單交叉驗證
就是上面最簡單的概念,將訓練數(shù)據(jù)分為訓練集和驗證集,訓練集訓練模型,驗證集驗證模型,驗證得到的準確率就是模型的性能指標。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( data, target, test_size=.4, random_state=0 )
K折交叉驗證(K-Fold)
將訓練數(shù)據(jù)分為K組(一般是均分),然后將每個子集數(shù)據(jù)分別做一次驗證集,其余K-1組子集當作訓練集,所以會進行K次交叉驗證,得到K個模型,將K個模型最終的驗證準確率取平均值,作為模型的性能指標,通常設K大于或等于3。
from sklearn.model_selection import KFold
kf = KFold(n_splits = 10) # k取10
留一法交叉驗證(LOO-CV)
留一法交叉驗證(leave-one-out cross validation)就是K折交叉驗證里K=N的情況,就是每個子集只由一個樣本數(shù)據(jù)組成,N個樣本數(shù)據(jù),所以會進行N次交叉驗證,得到N個模型,將N個模型最終的驗證準確率取平均值,作為模型的性能指標。
from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
留P法交叉驗證(LPO-CV)
留P法交叉驗證(leave-p-out cross validation)則是從數(shù)據(jù)集中留下P個數(shù)據(jù)點作為驗證集,而其他的數(shù)據(jù)用作訓練集。這個過程會遍歷所有可能的訓練集/驗證集分割方式。如果數(shù)據(jù)集有N個樣本,那么將會有從N個樣本中選出P個樣本的組合方式,對于每一種組合,訓練一次模型并評估一次性能。由于組合數(shù)可能非常大,這種方法在計算上通常非常昂貴,特別是當數(shù)據(jù)集的大小相對于P來說較大時。
from sklearn.model_selection import LeavePOut
lpo = LeavePOut(p=5) #p取5