在機器學習中,交叉驗證(cross validation)是一種用來做模型選擇的方法。如果給定的樣本資料充足,我們可以隨機地將資料集切分成訓練集、驗證集和測試集,訓練集用來訓練模型,驗證集用於模型的選擇,而測試集用於最終對方法進行評估。然而實際情況中資料往往是不夠充分的,為了更好地選擇模型,可以使用交叉驗證的方法。
具體而言,當我們開始乙個機器學習的建模工作時,首先會將資料集切分成訓練集和測試集,我們在訓練集上進行模型的訓練和引數的調優,最終到測試集上驗證模型的效果。為了能夠選擇出最優的模型和引數,我們通常會在訓練集中再切分出一小部分作為驗證集,通過觀察模型在驗證集上的效果來評估其好壞。但是如果訓練集的數目不太多,那麼不同驗證集的選擇方式可能會對模型的效果有很大影響。因此,我們可以採用交叉驗證的方式。最常用的是k-fold交叉驗證法,我們隨機的將訓練集等分為k份,每次訓練時取其中的乙份作為驗證集,剩下的作為訓練集,通過觀察模型在k次實驗中的各個指標的平均值,可以對模型的效果有乙個比較準確地了解,而不至於受到驗證集選擇方式的影響。我們可以設定不同的模型引數並逐一觀察它們的平均效果,最終可以選擇出一組最優的引數應用到測試集上。
前面我們談到了使用交叉驗證來進行引數選擇,其實對於測試集和訓練集的切分也可以應用交叉驗證的方法。當整個資料集較小時,如何選擇合適的測試集也是個問題,在隨機切分的情況下,我們可能剛好選擇了一些相對容易**的資料點作為測試集,這會使得我們模型的最終效果看起來很好,但這並不是真實的情況。為了避免這種因為測試集的選擇方式所導致的模型效果出現波動的問題,我們也可以使用交叉驗證的方式,通過觀察模型在多個測試集上的平均效果來總體地評估模型的效果。
還有乙個值得注意的問題,在二分類問題中,當資料集的正負樣本比很低時,對模型的訓練是很有挑戰的,而實際情況往往就是這樣的。這種情況下我們通常希望訓練集和測試集中的正負樣本比可以和總體的比例保持一致,從而降低不平衡資料集帶來的影響,因此我們會採用分層的方式來切分測試集。具體而言,假設我們希望切分25%的資料作為測試集,那麼我們的做法是分別隨機地選取25%的正例和25%的負例作為測試集,剩下的作為訓練集。這種分層抽樣的方式在實際情況中是非常必要的。
幸運的是,在scikit-learn中,stratifiedkfold 可以直接幫助我們完成這一點。
class sklearn.model_selection.stratifiedkfold
(n_splits=3, shuffle=false, random_state=none)
n_splits : int, default=3
number of folds. must be at least 2.
shuffle : boolean, optional
whether to shuffle each stratification of
the data before splitting into batches.
random_state : int, randomstate instance or none, optional, default=none
if int, random_state is the seed used by
therandom
number generator; if randomstate instance, random_state is the
random
number generator; if none, the
random
number generator is the randomstate instance used by np.random. used when shuffle == true.
>>> from sklearn.model_selection import stratifiedkfold
>>> x = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([0, 0, 1, 1])
>>> skf = stratifiedkfold(n_splits=2)
>>> skf.get_n_splits(x, y)
2>>> print(skf)
stratifiedkfold(n_splits=2, random_state=none, shuffle=false)
>>> for train_index, test_index in skf.split(x, y):
... print("train:", train_index, "test:", test_index)
... x_train, x_test = x[train_index], x[test_index]
... y_train, y_test = y[train_index], y[test_index]
train: [1
3] test: [0
2]train: [0
2] test: [1
3]
《統計學習方法》 李航
sklearn.model_selection.stratifiedkfold
2018-06-23
正則化與交叉驗證
1 正則化 模型選擇的典型方法是正則化。正則化是結構風險最小化策略的實現,是在經驗風險上加乙個正則化項或者罰項,正則化項符合奧卡姆剃刀原理。奧卡姆剃刀原理應用於模型選擇時變為一下想法 在所有可能選擇的模型中,能夠很好地解釋已知資料並且十分簡單才是好模型。從貝葉斯估計的角度來看,正則化項對應於模型的先...
交叉驗證與網格搜尋
交叉驗證與網格搜尋是機器學習中的兩個非常重要且基本的概念,但是這兩個概念在剛入門的時候並不是非常容易理解與掌握,自己開始學習的時候,對這兩個概念理解的並不到位,現在寫一篇關於交叉驗證與網格搜尋的文章,將這兩個基本的概念做一下梳理。網格搜尋 grid search 名字非常大氣,但是用簡答的話來說就是...
網格搜尋與交叉驗證
一.網格搜尋驗證 sklearn.model selection.gridsearchcv estimator,param grid,scoring none,fit params none,n jobs 1,iid true,refit true,cv none,verbose 0,pre dis...