【模型選擇與評估01】交叉驗證

1.參考文獻
sklearn文檔

交叉驗證本質上屬於機器學習模型外圍的輔助手段,其針對的是在實際模型訓練過程中,存在的過擬合問題而提出的解決方法。

1.最基本的數據集劃分

基於的是sklearn中的train_test_split函數,實現數據集按指定比例劃分爲訓練集和測試集(下面例子裏比例爲0.4)
之所以說是最基本的劃分方法,是因爲僅基於比例做了單次劃分。
>>> import numpy as np
>>> from sklearn.model_selection import train_test_split
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))
>>> X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.4, random_state=0)
>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))
>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)                           
0.96...

2.計算交叉驗證

2.1 使用交叉驗證最簡單的方法是在估計器和數據集上調用 cross_val_score 輔助函數。
其中cv的值表示交叉驗證次數,scoring可以指定評價指標
>>> from sklearn import metrics
>>> clf = svm.SVC(kernel='linear', C=1)
>>> scores = cross_val_score(clf, iris.data, iris.target, cv=5, scoring='f1_macro')
>>> scores                                              
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])
當 cv 參數是一個整數時, cross_val_score 默認使用 KFold 或 StratifiedKFold 策略,後者會在估計器派生自 
ClassifierMixin 時使用。也可以通過傳入一個交叉驗證迭代器來使用其他交叉驗證策略,比如:

>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = iris.data.shape[0]
>>> cv = ShuffleSplit(n_splits=3, test_size=0.3, random_state=0)
>>> cross_val_score(clf, iris.data, iris.target, cv=cv)
...                                                     
array([ 0.97...,  0.97...,  1.        ])
2.2 cross_validate 函數與 cross_val_score 在下面的兩個方面有些不同:
【1】它允許指定多個指標進行評估.2】除了測試得分之外,它還會返回一個包含訓練得分,擬合次數, score-times (得分次數)的一個字典。

>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, iris.data, iris.target, scoring=scoring,cv=5, return_train_score=False)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro']                       
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])

除了返回結果不同,函數 cross_val_predict 具有和 cross_val_score 相同的接口, 
對於每一個輸入的元素,如果其在測試集合中,將會得到預測結果。交叉驗證策略會將可用的元素提交到測試集合有且僅有一次
(否則會拋出一個異常)。

3.交叉驗證迭代器

K折:KFold
重複n次K折:RepeatedKFold
留一交叉驗證:LeaveOneOut
留P交叉驗證:LeavePOut
隨機排列交叉驗證:ShuffleSplit

分層抽樣
!!!一些分類問題在目標類別的分佈上可能表現出很大的不平衡性:例如,可能會出現比正樣本多數倍的負樣本。在這種情況下,建議採用如 StratifiedKFold 和 StratifiedShuffleSplit 中實現的分層抽樣方法,確保相對的類別頻率在每個訓練和驗證 摺疊 中大致保留。

StratifiedKFold 是 k-fold 的變種,會返回 stratified(分層) 的摺疊:每個小集合中,
各個類別的樣例比例大致和完整數據集中相同。
在有 10 個樣例的,有兩個略不均衡類別的數據集上進行分層 3-fold 交叉驗證的例子:

>>> from sklearn.model_selection import StratifiedKFold
>>> X = np.ones(10)
>>> y = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
>>> skf = StratifiedKFold(n_splits=3)
>>> for train, test in skf.split(X, y):       注意用法 skf.split()
...     print("%s %s" % (train, test))
[2 3 6 7 8 9] [0 1 4 5]
[0 1 3 4 5 8 9] [2 6 7]
[0 1 2 4 5 6 7] [3 8 9]

4.用於分組數據的交叉驗證迭代器


5.預定義的摺疊 / 驗證集


6.交叉驗證在時間序列數據中應用


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章