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

问题描述 投票:0回答:1

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

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

然后,inner 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页面中提供的示例是:

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 nested cross-validation grid-search
1个回答
0
投票
您对嵌套交叉验证(CV)的理解是正确的,但似乎对示例代码的结构存在误解。

在 scikit-learn 提供的示例中,确实使用了嵌套交叉验证。让我们分解代码以了解它如何适应嵌套 CV 的概念:

CV 分割的初始化:

inner_cv = KFold(n_splits=4, shuffle=True, random_state=i) outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)
初始化两组交叉验证迭代器:
内部CV和外部CV。两者都使用 4 折交叉验证,但它们的目的不同。

非嵌套参数搜索和评分:

clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv) clf.fit(X_iris, y_iris) non_nested_scores[i] = clf.best_score_
在这部分中,GridSearchCV 与内部交叉验证(inner_cv)一起使用。它使用交叉验证在参数网格 p_grid 中搜索最佳超参数。然后在整个数据集(X_iris、y_iris)上训练找到的最佳模型,并记录其性能分数(例如准确性)。

具有参数优化的嵌套 CV:

nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv) nested_scores[i] = nested_score.mean()
这里,cross_val_score 与外部交叉验证(outer_cv)一起使用。使用交叉验证来评估 clf 模型(使用内部 CV 期间找到的最佳参数进行训练)。对外部 CV 中的每个折叠重复此过程。最后,计算并记录跨折叠获得的分数的平均值。

因此,总而言之,本例中的嵌套交叉验证涉及:

Inner CV:用于超参数调整(GridSearchCV)以找到最佳模型。 外部CV:用于评估内部CV找到的最佳模型的性能。 这种结构确保模型性能的评估是公正的,因为超参数是在外部 CV 的每个折叠内的一组单独的数据上进行优化的。

您的解释似乎是正确的,但该示例确实展示了嵌套交叉验证的使用。外部CV中的每个折叠用于评估在相应训练数据上训练的模型的泛化性能,并使用内部CV选择超参数以避免数据泄漏和过度拟合。

© www.soinside.com 2019 - 2024. All rights reserved.