这被称为嵌套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