在scikit-learn中辜妓,可以使用 train_test_split 快速地將數(shù)據(jù)集分為訓練數(shù)據(jù)和測試數(shù)據(jù)诅病。當我們評估不同的設(shè)置(超參數(shù))時递雀,在測試集上仍然存在著過擬合風險泵喘,因為參數(shù)要不斷調(diào)整到模型最佳為止癌佩。在這個過程中,關(guān)于測試集的知識就會“泄漏”到模型中秃励,評估指標也不再泛化氏仗。為了解決這個問題,數(shù)據(jù)集的一部分被作為“驗證集”夺鲜,在訓練集上訓練數(shù)據(jù)皆尔,然后在驗證集上驗證,直到模型看起來成功了币励,再在測試集上最終評價慷蠕。
然而,把數(shù)據(jù)集分為三部分食呻,我們用來學習模型的訓練數(shù)據(jù)將減少流炕,并且模型結(jié)果依賴劃分數(shù)據(jù)集的特定隨機數(shù)。
cross-validation (CV) 過程用來解決這個問題仅胞。測試數(shù)據(jù)集仍然用來做最終的評價每辟,但是驗證集不再需要。k折 CV方法干旧,把訓練數(shù)據(jù)劃分為k 個小數(shù)據(jù)集渠欺,k-1 折數(shù)據(jù)用來訓練,余下的數(shù)據(jù)用來評估椎眯。
k折 CV方法采用遞歸計算中的平均值作為模型評價挠将,這種方法會導致較大的計算量,但是沒有浪費數(shù)據(jù)编整。
計算CV指標
CV 最簡單的方法是使用 cross_val_score函數(shù)舔稀。
from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)
scores
每次CV迭代的得分默認使用模型的得分計算計算,也可以通過 scoring 參數(shù)修改掌测,例如 scoring='f1_macro'内贮。
當參數(shù) cv 是整數(shù)時,使用 KFold 或 StratifiedKFold 策略,也可以使用其他劃分策略贺归。
cross_val_predit 對于每個輸入淆两,返回這個輸入在測試集中的預測值。只有在cv策略把輸入的所有元素都分配到測試集一次的情況下拂酣,才能使用秋冰。
分層數(shù)據(jù)的交叉驗證(Cross-validation iterators with stratification based on class labels.)
對于不平衡分類問題,推薦使用 StratifiedKFold 和StratifiedShuffleSplit 確保在訓練和測試集中保持近似的頻率婶熬。
分組數(shù)據(jù)的交叉驗證
GroupKFold
LeaveOneGroupOut
LeavePGroupsOut
GroupShuffleSplit
時間序列數(shù)據(jù)的交叉驗證
TimeSeriesSplit
來源:http://scikit-learn.org/stable/modules/cross_validation.html