Как получить доступ к вложенным оценкам Scikit Learn для перекрестной проверки

Я использую Python, и я хотел бы использовать вложенную перекрестную проверку с Scikit Learn. Я нашел очень хороший пример:

NUM_TRIALS = 30
non_nested_scores = np.zeros(NUM_TRIALS)
nested_scores = np.zeros(NUM_TRIALS)
# Choose cross-validation techniques for the inner and outer loops,
# independently of the dataset.
# E.g "LabelKFold", "LeaveOneOut", "LeaveOneLabelOut", etc.
inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)

# Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svr, param_grid=p_grid, cv=inner_cv)
clf.fit(X_iris, y_iris)
non_nested_scores[i] = clf.best_score_

# Nested CV with parameter optimization
nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv)
nested_scores[i] = nested_score.mean()

Как получить доступ к наилучшему набору параметров, а также ко всему набору параметров (с их соответствующей оценкой) из вложенной перекрестной проверки?

2 ответа

Решение

Вы не можете получить доступ к отдельным параметрам и лучшим параметрам из cross_val_score, Какие cross_val_score внутренне это клонировать предоставленную оценку и затем вызвать fit а также score методы на это с учетом X, y по индивидуальным оценкам.

Если вы хотите получить доступ к параметрам при каждом разделении, вы можете использовать:

#put below code inside your NUM_TRIALS for loop
cv_iter = 0
temp_nested_scores_train = np.zeros(4)
temp_nested_scores_test = np.zeros(4)
for train, test in outer_cv.split(X_iris):
    clf.fit(X_iris[train], y_iris[train])
    temp_nested_scores_train[cv_iter] = clf.best_score_
    temp_nested_scores_test[cv_iter] = clf.score(X_iris[test], y_iris[test])
    #You can access grid search's params here
nested_scores_train[i] = temp_nested_scores_train.mean()
nested_scores_test[i] = temp_nested_scores_test.mean()

Ответ Вивека Кумара основан на использовании явного внешнего цикла cv for. Если OP хочет получить доступ к лучшей оценке и лучшим параметрам на основе рабочего процесса перекрестной проверки sklearn, я бы предложил использовать вместо cross_val_scoreпотому что первый позволяет вам вернуть оценщик. Дополнительный бонус использования cross_validateзаключается в том, что вы можете указать несколько показателей.

      from sklearn.model_selection import cross_validate
scoring = {"auroc": "roc_auc"} # [1]
nested_scores = cross_validate(clf, X=X_iris, y=y_iris, cv=outer_cv, return_estimator=True, random_state=0)

Затем вы можете получить доступ к лучшей модели из каждого резюме:

      best_models = nested_scores['estimator']
for i, model in enumerate(best_models):
    best_model = model.best_estimator_
    best_params = model.best_params_

[1] список доступных оценок https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter

Другие вопросы по тегам