- scikit-learn中默認使用的交叉驗證法是K折疊交叉驗證法(K-fold cross validation):它將數據集拆分成k個部分,再用k個數據集對模型進行訓練和評分.
1.K折疊交叉驗證法(K-fold cross validation)
############################# 使用交叉驗證法對模型進行評估 #######################################
#導入紅酒數據集
from sklearn.datasets import load_wine
#導入交叉驗證工具
from sklearn.model_selection import cross_val_score
#導入用於分類的支持向量機模型
from sklearn.svm import SVC
#載入紅酒數據集
wine = load_wine()
#設置SVC的核函數為linear
svc = SVC(kernel='linear')
#使用交叉驗證法對SVC進行評分
scores = cross_val_score(svc,wine.data,wine.target,cv=3)
#打印結果
print('交叉驗證得分:{}'.format(scores))
交叉驗證得分:[0.83333333 0.95 ]
#使用.mean()來獲得分數平均值
print('交叉驗證平均分:{:.3f}'.format(scores.mean()))
交叉驗證平均分:0.928
#設置cv參數為6
scores = cross_val_score(svc,wine.data,wine.target,cv=6)
#打印結果
print('交叉驗證得分:\n{}'.format(scores))
交叉驗證得分: [0.86666667 0.9 0.93333333 0.96666667 1. 1. ]
#計算交叉驗證平均分
print('交叉驗證平均分:{:.3f}'.format(scores.mean()))
交叉驗證平均分:0.944
#打印紅酒數據集的分類標簽
print('酒的分類標簽:\n{}'.format(wine.target))
酒的分類標簽: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
- 如果用不分層的K折疊的交叉驗證法,那么在拆分數據集的時候,有可能每個子集中都是同一個標簽,這樣的話模型評分都不會太高,而分層k折疊交叉驗證法的優勢在於,它會在每個不同分類中進行拆分,確保每個子集中都有數量一致的不同分類的標簽.
2.隨機差分交叉驗證(shuffle-split cross-validation)
#導入隨機差分工具
from sklearn.model_selection import ShuffleSplit
#設置拆分的份數為10個
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('隨機拆分交叉驗證模型得分:\n{}'.format(scores))
#計算交叉驗證平均分
print('隨機拆分交叉驗證平均分:{:.3f}'.format(scores.mean()))
隨機拆分交叉驗證模型得分: [0.94444444 0.97222222 0.97222222 0.97222222 0.94444444 0.97222222 0.97222222 0.97222222 0.94444444 1. ] 隨機拆分交叉驗證平均分:0.967
3.一個一個試(leave-one-out)
- 其原理和k折疊交叉驗證相似,不同的是,它把每一個數據點都當成一個測試集,所以測試集中有多少樣本,它就要迭代多少次.針對於小數據集來說,其評分是最高的
#導入LeaveOneOut
from sklearn.model_selection import LeaveOneOut
#設置cv參數為leaveoneout
cv = LeaveOneOut()
#重新進行交叉驗證
scores = cross_val_score(svc,wine.data,wine.target,cv=cv)
#打印迭代次數
print('打印迭代次數:{}'.format(len(scores)))
#打印評分結果
print('模型平均分:{:.3f}'.format(scores.mean()))
打印迭代次數:178 模型平均分:0.955
總結 :
我們為什么要使用交叉驗證法?
當我們使用train_test_split方法進行數據集的拆分時,train_test_split用的是隨機拆分的方法,萬一我們拆分的時候,測試集中都是比較容易進行分類或者回歸的數據,而訓練集中都比較難,那么模型的得分就會偏高,反之模型的得分就會偏低.我們也不太可能把所有的random_state遍歷一遍,而交叉驗證法正好彌補了這個缺陷,它的工作原理導致它要對多次拆分進行評分再取平均值,這樣就不會出現我們前面所說的問題了.
文章引自 : 《深入淺出python機器學習》
