gpt4 book ai didi

python - 具有多次重复的 scikit-learn GridSearchCV

转载 作者:太空狗 更新时间:2023-10-29 20:33:19 25 4
gpt4 key购买 nike

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

快速解决方案:

遵循 sci-kit 中提出的想法 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))

最佳答案

这称为嵌套交叉验证。你可以看看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_cv 传递给 cross_val_score
  3. source code of cross_val_score 中所示,这个X会被outer_cv分成X_outer_train, X_outer_test。 y 也一样。
  4. X_outer_test 将被阻止,X_outer_train 将被传递给 clf for fit()(在我们的例子中是 GridSearchCV)。 假设 X_outer_train 从这里被称为 X_inner 因为它被传递给内部估计器,假设 y_outer_train y_inner.
  5. X_inner 现在将使用 GridSearchCV 中的 inner_cv 拆分为 X_inner_trainX_inner_test。你也一样
  6. 现在,gridSearch 估计器将使用 X_inner_trainy_train_inner 进行训练,并使用 X_inner_testy_inner_test 进行评分。
  7. 将为 inner_cv_iters(在本例中为 5)重复第 5 步和第 6 步
  8. 所有内部迭代的平均得分 (X_inner_train, X_inner_test) 最好的超参数被传递到 clf.best_estimator_ 并适合所有数据,即 X_outer_train
  9. clf (gridsearch.best_estimator_) 然后将使用 X_outer_testy_outer_test 进行评分。
  10. 将为 outer_cv_iters(此处为 10)重复步骤 3 到 9,并且将从 cross_val_score
  11. 返回分数数组
  12. 然后我们使用 mean() 返回 nested_score

关于python - 具有多次重复的 scikit-learn GridSearchCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42228735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com