簡體   English   中英

scikit-learn GridSearchCV多次重復

[英]scikit-learn GridSearchCV with multiple repetitions

我正在嘗試為SVR模型獲取最佳參數集。 我想在不同的C值上使用GridSearchCV 但是,從之前的測試中我發現,分成訓練/測試集高可影響整體表現(在這種情況下為r2)。 為了解決這個問題,我想實現重復的5倍交叉驗證(10 x 5CV)。 是否有使用GridSearchCV執行它的內置方式?

快速解決方案:

遵循sci-kit 官方文檔中提出的想法,快速解決方案代表:

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))

這稱為嵌套的cross_validation。 您可以查看官方文檔示例,以指導您進入正確的方向,並在此處查看我的其他答案,以獲得類似的方法。

您可以根據需要調整步驟:

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(estimator,param_grid,cv = inner_cv)。
  2. clf, X, y, outer_cvcross_val_score
  3. cross_val_score的源代碼所示 ,該X將使用outer_cv分為X_outer_train, X_outer_test outer_cv 同樣的y。
  4. X_outer_test將被保留, X_outer_train將傳遞給clf for fit()(在我們的例子中為GridSearchCV)。 假設X_outer_train從此處被稱為X_inner ,因為它被傳遞給內部估計器 ,假設y_outer_trainy_inner
  5. X_inner現在將分成X_inner_trainX_inner_test使用inner_cv在GridSearchCV。 同樣的y
  6. 現在,將使用X_inner_trainy_train_inner訓練gridSearch估算器,並使用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. 然后使用X_outer_testy_outer_test對該clfgridsearch.best_estimator_ )進行評分。
  10. 對於outer_cv_iters(此處為10) 將重復步驟3到9,並且將從cross_val_score返回分數數組
  11. 然后我們使用mean()來獲取nested_score

您可以為GridSearchCV提供不同的交叉驗證生成器。 二元或多類分類問題的默認值是StratifiedKFold 否則,它使用KFold 但是你可以提供自己的。 在您的情況下,看起來您需要RepeatedKFoldRepeatedStratifiedKFold

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(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM