我正在从scikit-learn文档中查看此示例:http://scikit-learn.org/0.18/auto_examples/model_selection/mmodel_selection/plot_nested_cross_cross_validation_validation_iris.html
在我看来,在这里没有以公正的方式进行交叉验证。GridSearchCV
(据称是内部CV环路)和cross_val_score
(据称是外部简历环)都使用相同的数据和相同的折叠。因此,对分类器进行了培训和评估的数据之间存在重叠。我出了什么问题?
@gael-由于我无法添加评论,所以我在答案部分中发布了这一点。我不确定 gael的意思是"第一个拆分是在cross_val_score内完成的,第二个拆分是在GridSearchCV(GridSearchCV对象的全部点)内完成的" 。您是否试图暗示cross_val_score函数将(k-1) - 折叠数据(用于外循环中的训练)传递给CLF对象?似乎并非如此,因为我可以评论Cross_val_score函数,然后将Nested_score [i]设置为虚拟变量,并且仍然获得完全相同的Clf.bestrongcore_。这意味着GridSearchCV是单独评估的,并且确实使用所有可用数据,而不是培训数据的子集。
在嵌套的简历中,就我的理解而言,想法是,内部循环将在较小的训练数据子集上进行超参数搜索,然后外循环将使用这些参数进行交叉 - 验证。在内部循环中使用较小训练数据的原因之一是避免信息泄漏。似乎并不是这里发生的事情。内部循环首先使用所有数据搜索超参数,然后将其用于外循环中的交叉验证。因此,内部循环已经看到了所有数据,并且在外循环中进行的任何测试都将遭受信息泄漏。如果我误会了,您能否请我指向您答案中所指的代码部分?
完全同意,nested cv过程是错误的,Cross_val_score是由GridSearchCV计算的最佳超参数,并使用此类超参数计算CV分数。在Nested-CV中,您需要外部循环来评估模型性能和内部循环进行模型选择,以便,在内部循环中用于模型选择中使用的数据的一部分不得与评估模型性能相同。一个示例将是用于评估性能的LOOCV外循环(或者,它将是5CV,10CV或您喜欢的任何内容),并且在内部循环中使用网格搜索的模型选择10cv倍。这意味着,如果您有N观察结果,那么您将在N-1观测值中在内部循环中执行模型选择(例如,使用网格搜索和10-CV),并且您将在LOO观察中评估模型性能((或在保留数据样本中,如果选择另一种方法)。(请注意,您正在从内部估计N最佳模型)。可以访问Cross_val_score和GridSearchCV的代码的链接将很有帮助。嵌套简历的一些参考是:
- Christophe Ambroise和Georey J McLachlan。根据微阵列基因表达数据,基因提取的选择偏差。美国国家科学院学院论文集99,10(2002),6562-6566。
- Gavin C Cawley和Nicola LC Talbot。在模型选择过度拟合和随后的选择偏差时,绩效评估偏差。机器学习研究杂志11,7月(2010年),2079 {2107。
注意:我在cross_val_score的文档中找不到任何东西,表明内部使用参数搜索,网格搜索 交叉验证(例如,在数据的k-1折叠)中优化了超参数,并使用保留数据上的那些优化参数示例(我所说的与http://scikit-learn.org/dev/auto_examples/model_selection/plot_nested_cross_validation_iris.html中的代码不同)
他们没有使用相同的数据。当然,该示例的代码并不明显,因为拆分不可见:第一个拆分是在cross_val_score内完成的,第二个拆分是在GridSearchCV内完成的(GridSearchCV对象的整个点)。使用函数和对象而不是手工编写的循环可能会使事情变得不那么透明,但是它:
- 启用reuses
- 添加了许多"小东西",这些"小东西"会使循环繁琐,例如并行计算,支持不同的评分功能等。
- 在避免数据泄漏方面实际上更安全,因为我们的拆分代码已经过多次审核。
如果您不相信,请查看Cross_val_score和GridSearchCV的代码。
最近改进了该示例以在评论中指定这一点:http://scikit-learn.org/dev/auto_examples/model_selection/plot_nested_cross_validation_iris.html
(https://github.com/scikit-learn/scikit-learn/pull/7949)