如何访问 Scikit Learn 嵌套交叉验证分数

Posted

技术标签:

【中文标题】如何访问 Scikit Learn 嵌套交叉验证分数【英文标题】:How to access Scikit Learn nested cross-validation scores 【发布时间】:2017-06-12 04:13:56 【问题描述】:

我正在使用 python,我想将嵌套交叉验证与 scikit learn 一起使用。我找到了一个很好的example:

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

如何访问嵌套交叉验证中的最佳参数集以及所有参数集(及其相应的分数)?

【问题讨论】:

【参考方案1】:

您无法从cross_val_score 访问单个参数和最佳参数。 cross_val_score 在内部做的是克隆提供的估算器,然后在各个估算器上使用给定的 Xy 调用 fitscore 方法。

如果您想在每次拆分时访问参数,您可以使用:

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

【讨论】:

我使用什么模型(超参数)来预测新数据?可能与OP对“最佳参数”的要求有关。 @Paul 请详细解释。最好是一个新问题。您可以使用 GridSearchCV 进行超参数调优。 4 个内部循环中的每个网格搜索 clf.fit() 将返回一组不同的超参数(4 组超参数)。当我希望预测新的、看不见的数据时,我需要一些模型 M,它适合一些超参数。我将 4 组(或其他一组)超参数中的哪一组用于模型 M?我认为这里提出了这个问题:stats.stackexchange.com/q/319780 我认为答案是您只需对完整数据运行另一个单独的网格搜索,如stats.stackexchange.com/a/65158 第二段中所述,对吗?

以上是关于如何访问 Scikit Learn 嵌套交叉验证分数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scikit-learn 中使用交叉验证获得预测概率

如何在 scikit-learn 中执行随机森林模型的交叉验证?

如何在 scikit-learn 中计算正确的交叉验证分数?

在 scikit learn 中结合网格搜索和交叉验证

如何创建一个应用 z-score 和交叉验证的 scikit-learn 管道?

在 scikit-learn 中跨多个模型进行交叉验证时如何保持相同的折叠?