Scikit-learn 上的嵌套交叉验证示例

Nested cross-validation example on Scikit-learn

提问人:NCL 提问时间:10/6/2017 最后编辑:Julia MeshcheryakovaNCL 更新时间:1/15/2023 访问量:9557

问:

我正在尝试围绕 Sklearn 中嵌套与非嵌套 CV 的示例进行思考。我检查了多个答案,但我仍然对这个例子感到困惑。 据我所知,嵌套 CV 旨在使用不同的数据子集来选择分类器的最佳参数(例如 SVM 中的 C)并验证其性能。因此,从数据集 X 中,外部 10 倍 CV(为简单起见 n=10)创建了 10 个训练集和 10 个测试集:

(Tr0, Te0),..., (Tr0, Te9)

然后,内部 10-CV 将每个外部训练集拆分为 10 个训练集和 10 个测试集:

From Tr0: (Tr0_0,Te_0_0), ... , (Tr0_9,Te0_9)
From Tr9: (Tr9_0,Te_9_0), ... , (Tr9_9,Te9_9)

现在,使用内部 CV,我们可以为每个外部训练集找到 C 的最佳值。这是通过使用内部 CV 测试 C 的所有可能值来完成的。为该特定的外部训练集选择提供最高性能(例如准确性)的值。最后,在发现每个外部训练集的最佳 C 值后,我们可以使用外部测试集计算出无偏精度。通过此过程,用于识别最佳参数(即 C)的样本不用于计算分类器的性能,因此我们有一个完全无偏的验证。

Sklearn 页面中提供的示例如下:

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=svm, 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()

据我了解,该代码只是使用两种不同的交叉验证(即不同的训练集和测试集)来计算分数。他们俩都使用了整个数据集。GridCV 使用一个(两个 CV 中的一个)确定最佳参数,然后cross_val_score使用第二个 CV 计算使用最佳参数时的性能。

我是否以错误的方式解释嵌套简历?我从示例中遗漏了什么?

python scikit-learn 嵌套 交叉验证 网格搜索

评论

4赞 Vivek Kumar 10/6/2017
你可以在这里看看我的答案,以获得一步一步的分析。
0赞 NCL 10/6/2017
我对名称和顺序感到非常困惑,因为我希望outer_cv在“inner_cv之前”使用。因此,嵌套的发生是因为我们传递了 clf,即 GridSearchCV 的实例cross_val_scor?因此,简单来说,cross_val_score,首先将 X 拆分为 X_tr、X_te,然后将 X_tr 传递给 clf,因为它是 GridSearchCV 的实例,会进一步将X_tr拆分为 X_tr_tr 和 X_tr_te?
1赞 Vivek Kumar 10/6/2017
是的,你是对的。一个被拆分为 和 中定义的折叠数。然后根据数据的其他部分,它再次被发送到 。希望这是有道理的。X_trX_tr_trX_tr_teinner_cvouter_cvX_trinner_cv
0赞 NCL 10/6/2017
是的,谢谢Vivek。因此,如果我们直接将 clf = SVM() 传递给cross_val_score我们就会获得“传统”交叉折叠验证。
1赞 Vivek Kumar 10/6/2017
是的,由于在 GridSearchCV 中进行了交叉验证,因此会发生整个嵌套交叉验证。如果使用简单的估计器,则这将成为简单的交叉验证

答: 暂无答案