Scikit learn scikit学习中嵌套交叉验证的混淆示例

Scikit learn scikit学习中嵌套交叉验证的混淆示例,scikit-learn,cross-validation,Scikit Learn,Cross Validation,我正在看scikit学习文档中的这个示例: 在我看来,交叉验证并不是以无偏见的方式进行的。GridSearchCV(假定为内部CV循环)和cross_val_score(假定为外部CV循环)都使用相同的数据和相同的折叠。因此,分类器的训练数据和评估数据之间存在重叠。我做错了什么?他们没有使用相同的数据。诚然,该示例的代码并没有让它变得明显,因为拆分是不可见的:第一次拆分在cross_val_score内完成,第二次拆分在GridSearchCV(GridSearchCV对象的整个点)内完成。使用

我正在看scikit学习文档中的这个示例:


在我看来,交叉验证并不是以无偏见的方式进行的。
GridSearchCV
(假定为内部CV循环)和
cross_val_score
(假定为外部CV循环)都使用相同的数据和相同的折叠。因此,分类器的训练数据和评估数据之间存在重叠。我做错了什么?

他们没有使用相同的数据。诚然,该示例的代码并没有让它变得明显,因为拆分是不可见的:第一次拆分在cross_val_score内完成,第二次拆分在GridSearchCV(GridSearchCV对象的整个点)内完成。使用函数和对象而不是手工编写循环可能会降低透明度,但它:

  • 允许重用
  • 添加了许多会使for循环变得单调乏味的“小事”,例如并行计算、支持不同的评分函数等
  • 实际上,在避免数据泄漏方面更安全,因为我们的拆分代码已经过多次审核
  • 如果您不相信,请查看cross_val_score和GridSearchCV的代码

    最近对该示例进行了改进,以在注释中指定:


    (打开请求)

    @Gael-由于我无法添加评论,我将在回答部分发布此消息。我不确定Gael所说的“第一次拆分在cross_val_score内完成,第二次拆分在GridSearchCV(GridSearchCV对象的整个点)内完成”是什么意思。您是否试图暗示cross_val_score函数将(k-1)折叠数据(用于外循环中的训练)传递给clf对象?事实并非如此,因为我可以注释掉cross_val_score函数,只需将嵌套的_score[I]设置为一个伪变量,仍然可以获得完全相同的clf.best_score。这意味着GridSearchCV是单独评估的,并使用所有可用数据,而不是训练数据的子集


    在嵌套CV中,据我所知,其想法是内部循环将在较小的训练数据子集上执行超参数搜索,然后外部循环将使用这些参数进行交叉验证。在内环中使用较小的训练数据的原因之一是为了避免信息泄漏。看来这里并不是这样。内部循环首先使用所有数据搜索超参数,然后在外部循环中用于交叉验证。因此,内环已经看到了所有数据,在外环中进行的任何测试都将遭受信息泄漏。如果我弄错了,您能告诉我您在回答中提到的代码部分吗?

    完全同意,嵌套的cv过程是错误的,cross_val_分数是由GridSearchCV计算的最佳超参数,并使用这些超参数计算cv分数。在嵌套cv中,您需要用于评估模型性能的外部循环和用于模型选择的内部循环,因此,用于模型选择的内部循环中使用的数据部分不得与用于评估模型性能的数据部分相同。例如,用于评估性能的LOOCV外循环(或者,它将是5cv、10cv或您喜欢的任何形式)和用于模型选择的10cv折叠,在内循环中使用栅格搜索。这意味着,如果您有N个观测值,那么您将在内部循环中对N-1个观测值执行模型选择(例如,使用网格搜索和10-CV),并且您将在LOO观测值上评估模型性能(或者在保持数据样本中,如果您选择另一种方法)。 (请注意,在超参数的意义上,您正在估计N个最佳模型)。 访问cross_val_分数代码和GridSearchCV的链接将很有帮助。 嵌套CV的一些参考包括:

    • 克里斯托夫·安布罗斯和乔治·麦克拉克伦。基于微阵列基因表达数据的基因提取中的选择偏差。《国家科学院院刊》99,10(2002),6562-6566
    • 加文C考利和尼古拉LC塔尔博特。模型选择中的过度拟合和绩效评估中的后续选择偏差。《机器学习研究杂志》,2010年7月11日,2079{2107
    注:
    我在cross_val_score的文档中没有发现任何东西表明,在内部,超参数是使用参数搜索、网格搜索+交叉验证优化的,例如,在k-1倍的数据上,以及在保留数据样本上使用这些优化的参数(我所说的与中的代码不同)

    很好的评论,但不幸的是,它会因为不是一个答案而被忽略。请只获得一些分数并返回放置此评论!这可能会增加所用数据的变化,但它们仍然会有很大的重叠。嵌套交叉验证的要点是要有完全可分离的培训和valGridSearch的验证测试和交叉验证评估的测试集。