用于模型选择的嵌套交叉验证

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

嵌套交叉验证是一种用于估计模型及其超参数泛化误差的技术。在不同模型之间进行选择或需要优化超参数时,它特别有用。在本教程中,我们将使用鸢尾花数据集在支持向量分类器模型上比较非嵌套和嵌套交叉验证。我们还将可视化这两种方法在性能上的差异。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向Labby提问。课程结束后提供反馈,我们会及时为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49227{{"用于模型选择的嵌套交叉验证"}} sklearn/model_selection -.-> lab-49227{{"用于模型选择的嵌套交叉验证"}} sklearn/datasets -.-> lab-49227{{"用于模型选择的嵌套交叉验证"}} ml/sklearn -.-> lab-49227{{"用于模型选择的嵌套交叉验证"}} end

加载数据集

第一步是从scikit-learn中加载鸢尾花数据集。

from sklearn.datasets import load_iris

## 加载数据集
iris = load_iris()
X_iris = iris.data
y_iris = iris.target

定义超参数

接下来,我们定义要为支持向量分类器优化的超参数。在这种情况下,我们优化成本参数 C 和核系数 gamma

## 设置要优化的参数的可能值
p_grid = {"C": [1, 10, 100], "gamma": [0.01, 0.1]}

定义模型

我们使用具有径向基函数核的支持向量分类器。

from sklearn.svm import SVC

## 我们将使用具有 "rbf" 核的支持向量分类器
svm = SVC(kernel="rbf")

非嵌套交叉验证

我们使用非嵌套交叉验证来调整超参数并评估模型的性能。GridSearchCV 函数会对估计器的指定参数值进行详尽搜索。我们使用4折交叉验证。

from sklearn.model_selection import GridSearchCV

## 非嵌套参数搜索与评分
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=4)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_

嵌套交叉验证

我们使用嵌套交叉验证来估计模型及其超参数的泛化误差。在内循环中,我们进行网格搜索以找到每个训练集的最佳超参数。在外循环中,我们在测试集上评估模型的性能。

from sklearn.model_selection import KFold, cross_val_score

## 随机试验次数
NUM_TRIALS = 30

## 用于存储分数的数组
non_nested_scores = np.zeros(NUM_TRIALS)
nested_scores = np.zeros(NUM_TRIALS)

## 每次试验的循环
for i in range(NUM_TRIALS):
    ## 为内循环和外循环选择交叉验证技术,
    ## 与数据集无关。
    inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
    outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)

    ## 带有参数优化的嵌套交叉验证
    clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv)
    nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv)
    nested_scores[i] = nested_score.mean()

score_difference = non_nested_score - nested_scores.mean()

可视化结果

我们使用柱状图来可视化非嵌套和嵌套交叉验证的结果。

from matplotlib import pyplot as plt

## 绘制差异的柱状图。
plt.bar(["非嵌套", "嵌套"], [non_nested_score, nested_scores.mean()])
plt.ylim([0.9, 1.0])
plt.ylabel("分数")
plt.title("非嵌套和嵌套交叉验证分数")
plt.show()

总结

嵌套交叉验证是一种用于估计模型及其超参数泛化误差的强大技术。它有助于防止过拟合,并确保模型在新数据上表现良好。在本教程中,我们使用鸢尾花数据集,在支持向量分类器模型上比较了非嵌套和嵌套交叉验证。我们使用柱状图可视化了这两种方法在性能上的差异。