这称为嵌套交叉验证。你可以看看官方文档示例引导您走向正确的方向,也可以看看我的其他答案在这里对于类似的方法。
您可以调整这些步骤以满足您的需要:
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()
and GridSearchCV()
- clf = GridSearchCV(估计器,param_grid,cv=inner_cv)。
- Pass
clf, X, y, outer_cv
to cross_val_score
- 正如所见cross_val_score的源代码, this
X
将分为X_outer_train, X_outer_test
using outer_cv
。 y 也一样。
-
X_outer_test
将被阻止并且X_outer_train
将被传递给 clf 进行 fit() (在我们的例子中是 GridSearchCV)。Assume X_outer_train
叫做X_inner
从这里开始,因为它被传递给内部估计器, 认为y_outer_train
is y_inner
.
-
X_inner
现在将被分为X_inner_train
and X_inner_test
using inner_cv
在 GridSearchCV 中。 y 也一样
- 现在将使用 gridSearch 估计器进行训练
X_inner_train
and y_train_inner
并使用评分X_inner_test
and y_inner_test
.
- The 将重复步骤 5 和 6对于inner_cv_iters(本例中为5)。
- 所有内部迭代的平均得分的超参数
(X_inner_train, X_inner_test)
是最好的,被传递给clf.best_estimator_
并适合所有数据,即X_outer_train
.
- This
clf
(gridsearch.best_estimator_
)然后将使用X_outer_test
and y_outer_test
.
- The 将重复步骤 3 至 9对于outer_cv_iters(此处为10),分数数组将从
cross_val_score
- 然后我们使用mean()返回
nested_score
.