使用交叉驗證法(Cross Validation)進行模型評估


  • 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機器學習》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM