使用嵌套交叉验证

机器算法验证 机器学习 交叉验证 scikit-学习
2022-02-14 15:27:22

Scikit Learn 的模型选择页面提到了嵌套交叉验证的使用:

>>> clf = GridSearchCV(estimator=svc, param_grid=dict(gamma=gammas),
  ...                    n_jobs=-1)  
>>> cross_validation.cross_val_score(clf, X_digits, y_digits)

两个交叉验证循环并行执行:一个由 GridSearchCV 估计器设置 gamma,另一个由 cross_val_score 测量估计器的预测性能。结果分数是对新数据的预测分数的无偏估计。

据我了解,clf.fit将本机使用交叉验证来确定最佳伽玛。在那种情况下,为什么我们需要使用上面给出的嵌套 cv?注释提到嵌套 cv 产生预测分数的“无偏估计”。不也是这样clf.fit吗?

此外,我无法从该cross_validation.cross_val_score(clf, X_digits, y_digits)过程中获得 clf 最佳估计值。你能告诉我怎么做吗?

2个回答

嵌套交叉验证用于避免由于使用相同的交叉验证来设置模型的超参数(例如正则化参数,C和 SVM 的内核参数)和性能估计。在对内核机器评估中经常使用的看似良性的捷径引入的偏差幅度感到相当震惊之后,我写了一篇关于这个主题的论文。我调查了这个主题,以发现为什么我的结果比在相同数据集上使用类似方法的其他研究组更差,原因是我使用了嵌套交叉验证,因此没有从乐观偏差中受益。

GC Cawley 和 NLC Talbot,模型选择中的过度拟合和性能评估中的后续选择偏差,机器学习研究杂志,2010 年。研究,第一卷。11,第 2079-2107 页,2010 年 7 月。(http://jmlr.org/papers/volume11/cawley10a/cawley10a.pdf

可以在论文中找到带有说明性示例和实验评估的偏差的原因,但本质上的重点是,如果以任何方式使用性能评估标准来对模型进行选择,那么这些选择是基于 (i)泛化性能的真正改进和(ii)评估性能评估标准的特定数据样本的统计特性。换句话说,偏差的出现是因为在调整超参数时可能(太容易)过度拟合交叉验证误差。

使用保留的测试集会clf.fit产生一个无偏估计,而嵌套交叉验证cross_val_score会产生几个无偏估计。嵌套交叉验证的优点是使用算法尚未看到的数据更好地评估真实性能。更好的评估,因为您获得了例如三个带有嵌套 cv 的测试分数,而不是只有一个。

关于最佳估计的第二个问题的答案是,目前(v0.14)无法使用嵌套 cv 获取拟合模型的参数cross_val_score请在此处查看我的答案并举个例子。