scikit通过多次重复学习GridSearchCV

2024-04-19 05:12:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图得到一个SVR模型的最佳参数集。 我想在不同的C值上使用GridSearchCV。 然而,从之前的测试中,我注意到分成训练/测试集会极大地影响整体性能(在本例中为r2)。 为了解决这个问题,我想实现一个重复的5倍交叉验证(10x 5CV)。使用GridSearchCV执行它是否有内置的方法?

快速解决方案:

遵循sci工具包offical documentation中提出的想法,快速解决方案表示为:

NUM_TRIALS = 10
scores = []
for i in range(NUM_TRIALS):
     cv = KFold(n_splits=5, shuffle=True, random_state=i)
     clf = GridSearchCV(estimator=svr, param_grid=p_grid, cv=cv)
     scores.append(clf.best_score_)
print "Average Score: {0} STD: {1}".format(numpy.mean(scores), numpy.std(scores))

Tags: 模型numpy参数解决方案性能numcvgrid
2条回答

您可以为GridSearchCV提供不同的交叉验证生成器。二进制或多类分类问题的默认值是^{}。否则,它使用^{}。但你可以自己供应。在您的情况下,看起来您需要^{}^{}

from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold

# Define svr here
...

# Specify cross-validation generator, in this case (10 x 5CV)
cv = RepeatedKFold(n_splits=5, n_repeats=10)
clf = GridSearchCV(estimator=svr, param_grid=p_grid, cv=cv)

# Continue as usual
clf.fit(...)

这称为嵌套交叉验证。您可以查看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()的嵌套交叉验证的描述

  1. clf=GridSearchCV(估计器,param_grid,cv=inner_cv)。
  2. 通过clf, X, y, outer_cvcross_val_score
  3. source code of cross_val_score所示,这个X将使用outer_cv划分为X_outer_train, X_outer_test。你也是
  4. X_outer_test将被推迟,并且X_outer_train将被传递给clf for fit()(在我们的例子中是GridSearchCV)。从这里开始,假设X_outer_train被称为X_inner,因为它被传递给内部估计器,假设y_outer_trainy_inner
  5. X_inner现在将使用GridSearchCV中的inner_cv分成X_inner_trainX_inner_test。y也是
  6. 现在gridSearch估计器将使用X_inner_trainy_train_inner进行训练,并使用X_inner_testy_inner_test进行评分。
  7. 对于内部容器(本例中为5),将重复步骤5和6。
  8. 所有内部迭代(X_inner_train, X_inner_test)的平均得分最好的超参数被传递给clf.best_estimator_,并适合所有数据,即X_outer_train
  9. 这个clfgridsearch.best_estimator_)将使用X_outer_testy_outer_test进行评分。
  10. 对于外部cvu iter(此处为10),将重复步骤3至9,并从cross_val_score返回一系列分数
  11. 然后使用mean()返回nested_score

相关问题 更多 >