這被稱爲嵌套cross_validation:
繼在科幻試劑盒offical documentation提出的想法,一個快速的解決方案由下式表示。你可以看official documentation example引導你進入正確的方向,也可以看看我的other answer here類似的方法。
您可以調整的步驟,以滿足您的需要:
svr = SVC(kernel="rbf")
c_grid = {"C": [1, 10, 100, ... ]}
# CV Technique "LabelKFold", "LeaveOneOut", "LeaveOneLabelOut", etc.
# To be used within GridSearch (5 in your case)
inner_cv = KFold(n_splits=5, shuffle=True, random_state=i)
# To be used in outer CV (you asked for 10)
outer_cv = KFold(n_splits=10, shuffle=True, random_state=i)
# Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svr, param_grid=c_grid, cv=inner_cv)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_
# Pass the gridSearch estimator to cross_val_score
# This will be your required 10 x 5 cvs
# 10 for outer cv and 5 for gridSearch's internal CV
clf = GridSearchCV(estimator=svr, param_grid=c_grid, cv=inner_cv)
nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv).mean()
編輯 - 嵌套的交叉驗證與cross_val_score()
和GridSearchCV()
說明
- CLF = GridSearchCV(估計,param_grid,CV = inner_cv)。
- 通行證
clf, X, y, outer_cv
到cross_val_score
- 作爲source code of cross_val_score看到,這
X
將使用outer_cv
分爲X_outer_train, X_outer_test
。 y一樣。
X_outer_test
將被阻止,並且X_outer_train
將傳遞到clf for fit()(在我們的例子中爲GridSearchCV)。 假設X_outer_train
從這裏開始被稱爲X_inner
,因爲它被傳遞給內部估計器,假設y_outer_train
是y_inner
。
X_inner
現在將在GridSearchCV中使用inner_cv
拆分爲X_inner_train
和X_inner_test
。 y相同
- 現在,將使用
X_inner_train
和y_train_inner
對網格搜索估算器進行訓練,並使用X_inner_test
和y_inner_test
對其進行評分。
- 步驟5和6對於inner_cv_iters(在這種情況下爲5)將重複。
- 將所有迭代的平均分數最好的參數傳遞到
clf.best_estimator_
並適用於所有數據,即X_train
。
- 然後使用
X_outer_test
和y_outer_test
對clf
(gridsearch.best_estimator_
)進行評分。
- 的步驟3到9會反覆爲outer_cv_iters(10此處)和分數的數組將從
cross_val_score
- 返回然後,我們使用均值()找回
nested_score
。
爲了更好地理解,您的目標是重複5CV以瞭解SVR的行爲方式?這意味着你將爲每個參數組合使用10x5不同的分割?在任何情況下,您都可以提供自定義cv函數來執行此操作,並根據需要多次生成數據集分割,或根據需要對其進行自定義。 GridSearchCV會將它視爲每次使用所選參數的運行,並且它將像往常一樣在最後收集結果。 – mkaran