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