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

时间:2017-10-06 10:18:51

标签: python scikit-learn nested cross-validation grid-search

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

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

然后,内部 10-CV将 EACH 外部训练集分为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 page中提供的示例是:

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计算使用最佳参数时的性能。

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

修改

可以在此post上找到已回答的详细信息。

0 个答案:

没有答案