![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yYxQTNmFTMhZzYjhDOlVTZhZDOhF2YkZzNzcjMwIWNl9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如果感興趣,歡迎點選上方“關注”,點選右下角「在看」分享給身邊好友!
交叉驗證也稱為循環估計,是統計上将資料樣本切割成較小集合的使用方法,由Seymour Geisser提出。
交叉驗證應用場景主要在模型訓練中,在給定的樣本空間中,拿出大部分樣本作為訓練集,小部分樣本使用剛建立的模型進行測試,并求這小部分樣本的預測誤差或者預測精度,同時記錄它們的加和平均值,這個過程疊代K次,即K折交叉。把每個樣本的預測誤差平方加和,稱為預測誤差。
交叉驗證的目的
- 從有限的學習資料中擷取盡可能多的有效資訊;
- 交叉驗證從多個方向開始學習樣本的,可以有效地避免陷入局部最小值;
- 可以在一定程度上避免過拟合問題;
常見的交叉驗證形式
簡單交叉驗證:将原始資料随機分為兩組,一組作為訓練集,一組作為驗證集,利用訓練集訓練分類器,然後利用驗證集驗證模型,記錄最後的分類準确率的性能名額。
一般來說,簡單交叉驗證并非一種交叉驗證,因為資料并沒有交叉使用。随機從最初的樣本中選出部分,形成交叉驗證資料,而剩餘的就當作訓練資料。一般來說,少于原本樣本三分之一的資料被選做驗證資料。
優點:好處的處理簡單,隻需随機把原始資料分為兩組即可!
缺點:嚴格意義來說簡單交叉驗證并不能算是CV,因為這種方法沒有達到交叉的思想,由于是随機地将原始資料分組,是以最後驗證集分類準确率的高低與原始資料的分組有很大的關系,是以這種方法得到的結果其實并不具有說服性!
K-fold交叉驗證:初始采樣分割成K個子樣本,一個單獨的子樣本被保留作為驗證模型的資料,其他K-1個樣本用來訓練。交叉驗證重複K次,每個子樣本驗證一次,平均K次的結果或者使用其它結合方式,得到一個單一估測。這個方法的優勢在于,同時重複運用随機産生的子樣本進行訓練和驗證,每次的結果驗證一次,10折交叉驗證是最常用的。
優點:K-CV可以有效地避免過學習以及欠學習狀态的發生,最後得到的結果也比較具有說服性。
留一驗證:意指隻使用原本樣本中的一項來當作驗證資料,而剩餘的則留下來當作訓練資料。這個步驟一直持續到每個樣本都被當作一次驗證資料。事實上,這等同于K-fold交叉驗證是一樣的,其中K為原本樣本個數。在某些情況下是存在有效率的演算法,如使用kernel regression和Tikhonov regularization
驗證方法選擇
到底應該選擇哪一種方法呢?其實很簡單,如果我們隻是對資料做一個初步的模型建立,不是要做深入分析的話,簡單交叉驗證就可以,否則就用k折交叉驗證,在樣本量少的時候,使用留一交叉驗證。
以KFold進行案例分析
from sklearn.datasets import load_irisfrom sklearn.model_selection import StratifiedKFold,cross_val_scorefrom sklearn.linear_model import LogisticRegression iris = load_iris() print('Iris labels:\n{}'.format(iris.target)) logreg = LogisticRegression() strKFold = StratifiedKFold(n_splits=3,shuffle=False,random_state=0) scores = cross_val_score(logreg,iris.data,iris.target,cv=strKFold) print("straitified cross validation scores:{}".format(scores)) print("Mean score of straitified cross validation:{:.2f}".format(scores.mean()))