常用交叉驗(yàn)證法包括K折疊交叉驗(yàn)證法(K-fold cross validation)、隨機(jī)拆分交叉驗(yàn)證法(shuffle-split cross validation)、挨個(gè)兒試試法(leave-one-out)。

K折疊交叉驗(yàn)證法(K-fold cross validation)
K折疊交叉驗(yàn)證法將數(shù)據(jù)集拆分成K個(gè)部分,再用K個(gè)數(shù)據(jù)集對(duì)模型進(jìn)行訓(xùn)練和評(píng)分。例如K=5,則數(shù)據(jù)集被拆分成5個(gè),其中第一個(gè)子集會(huì)被作為測(cè)試數(shù)據(jù)集,另外4個(gè)用來訓(xùn)練模型,之后再用第二個(gè)子集作為測(cè)試集,而另外4個(gè)用來訓(xùn)練模型,以此類推,直到把5個(gè)數(shù)據(jù)集全部用完,這樣我們會(huì)得到5個(gè)模型的評(píng)分。模型最終的評(píng)分使用5個(gè)得分的平均分來計(jì)算。
分層K折疊交叉驗(yàn)證法:每個(gè)子集中都有數(shù)量基本一致的不同分類標(biāo)簽
不分層K折疊交叉驗(yàn)證法:每個(gè)子集可能都是同一個(gè)標(biāo)簽
wine = load_wine()
svc = SVC(kernel='linear')
scores = cross_val_score(svc, wine.data, wine.target, cv=6)
print('交叉驗(yàn)證得分:\n{}'.format(scores))
print('交叉驗(yàn)證平均分:{:.3f}'.format(scores.mean()))
交叉驗(yàn)證得分:
[ 0.86666667 0.9 0.93333333 0.96666667 1. 1. ]
交叉驗(yàn)證平均分:0.944
分析:cross_val_score默認(rèn)使用3個(gè)折疊,可以通過cv參數(shù)指定K值,分類模型默認(rèn)使用分層K折疊交叉驗(yàn)證法。
隨機(jī)拆分交叉驗(yàn)證法(shuffle-split cross validation)
原理:先從數(shù)據(jù)集中隨機(jī)抽一部分?jǐn)?shù)據(jù)集作為訓(xùn)練集,再從其余的部分隨機(jī)抽一部分作為測(cè)試集,進(jìn)行評(píng)分后再迭代,重復(fù)上一步的動(dòng)作,直到把我們希望迭代的次數(shù)全部跑完。
from sklearn.model_selection import ShuffleSplit
shuffle_split = ShuffleSplit(test_size=.2, train_size=.7,
n_splits = 10)
scores = cross_val_score(svc, wine.data, wine.target, cv=shuffle_split)
print('隨機(jī)拆分交叉驗(yàn)證模型得分:\n{}'.format(scores))
隨機(jī)拆分交叉驗(yàn)證模型得分:
[ 0.91666667 0.91666667 0.91666667 0.94444444 0.97222222 0.91666667
0.91666667 0.97222222 0.97222222 0.97222222]
分析:每次迭代測(cè)試集設(shè)置為數(shù)據(jù)集的20%,訓(xùn)練集設(shè)置為數(shù)據(jù)集的70%,并且把整個(gè)數(shù)據(jù)集拆分成10個(gè)子集,模型進(jìn)行了10次評(píng)分,最終得分是10個(gè)分?jǐn)?shù)的平均值。
挨個(gè)兒試試法(leave-one-out)
原理:把每一個(gè)數(shù)據(jù)點(diǎn)都當(dāng)成一個(gè)數(shù)據(jù)集,數(shù)據(jù)集里面有多少樣本就要迭代多少次,數(shù)據(jù)集大的話,耗時(shí),數(shù)據(jù)集少的話,準(zhǔn)確度高。
from sklearn.model_selection import LeaveOneOut
cv = LeaveOneOut()
scores = cross_val_score(svc, wine.data, wine.target, cv=cv)
print('迭代次數(shù):{}'.format(len(scores)))
print("模型平均分:{:.3f}".format(scores.mean()))
迭代次數(shù):178
模型平均分:0.955
分析:交叉驗(yàn)證法比train_test_split更加消耗資源,而且速度要慢一些