【问题标题】:Confusing example of nested cross validation in scikit-learnscikit-learn 中令人困惑的嵌套交叉验证示例
【发布时间】:2017-04-28 22:04:45
【问题描述】:

我正在查看 scikit-learn 文档中的这个示例:http://scikit-learn.org/0.18/auto_examples/model_selection/plot_nested_cross_validation_iris.html

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

【问题讨论】:

    标签: scikit-learn cross-validation


    【解决方案1】:

    @gael - 因为我无法添加评论,我在答案部分发布了这一点。我不确定通过“第一个拆分在cross_val_score内完成的仪表装置,第二个拆分是在gridsearchcv中完成的(gridsearchcv对象的整个点)” em>。您是否尝试暗示Cross_Val_Score函数通过(k-1) - 折叠数据(用于在外循环中训练)到CLF对象?似乎不是这种情况,因为我可以评论xcrid_val_score函数并只是将indested_score [i]设置为虚拟变量,仍然获得完全相同的clf.best_score_。这意味着GridSearchCV是单独评估的,并使用所有可用数据,而不是培训数据的子集。

    在嵌套的简历中,据我所知,这个想法是内循环将在较小的训练数据子集上进行超参数搜索,然后外循环将使用这些参数进行交叉验证。在内圈中使用较小训练数据的原因之一是避免信息泄漏。它似乎没有那么发生的事情。内圈首先使用所有数据来搜索超参数,然后在外循环中用于交叉验证。因此,内循环已经看过所有数据,并且在外循环中完成的任何测试都会遭受信息泄漏。如果我错了,请给我指出你在答案中指的代码部分?

    【讨论】:

    • 很好的评论,但不幸的是,它会因为实际上不是一个答案而被审查。请赚取一些积分并返回放置此评论! span>
    【解决方案2】:

    完全同意,嵌套-CV程序错误,Cross_Val_Score是由GridSearchCV计算的最佳超参数,并使用这种超参数计算CV分数。在嵌套-CV中,您需要外部回路进行评估模型性能和模型选择的内部环路,使得用于模型选择的内部环路中使用的数据的部分不能相同用于评估模型性能。一个例子将是一个LoooCV外环,用于评估性能(或者,它将是5CV,10CV或无论您喜欢的5CV,10CV,或者您喜欢的任何内容),以及使用内循环中的网格搜索的模型选择的10cv折叠。这意味着,如果您有n个观察,那么您将在N-1观察中执行内循环中的模型选择(使用网格搜索和10-CV),并且您将在LOO观察中判断模型性能(或者如果选择另一种方法,则在阻止数据示例中)。 (请注意,您正在估计内部的超参数意义上的N个最佳模型)。 可以访问Cross_Val_Score和GridSearchCV的链接将有助于。 嵌套简历的一些引用是:

    • Christophe Ambroise和地质j Mclachlan。基于微阵列基因表达数据的基因提取中的选择偏差。国家科学院99,10(2002),6562 - 6566。
    • Gavin C Cawley和Nicola LC Talbot。关于模型选择和后续选择偏差的过度选择。 Machine Moverse Research China,Jul(2010),2079 {2107。

    注意: 我没有在Cross_Val_Score的文档中找到任何内容,指示在k-1折叠的k-1折叠上使用参数搜索,网格搜索+交叉验证,以及在k-1折叠的k-1折叠上使用参数搜索,网格搜索+交叉验证。示例(我所说的是与http://scikit-learn.org/dev/auto_examples/model_selection/plot_nested_cross_validation_iris.html)的代码不同

    【讨论】:

      【解决方案3】:

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

      1. 允许重复使用
      2. 添加了许多会使 for 循环变得乏味的“小事”,例如并行计算、对不同评分函数的支持等。
      3. 实际上在避免数据泄露方面更安全,因为我们的拆分代码已经过多次审核。

      如果你不服气,看看cross_val_score和GridSearchCV的代码。

      最近对示例进行了改进,以便在 cmets 中指定这一点: http://scikit-learn.org/dev/auto_examples/model_selection/plot_nested_cross_validation_iris.html

      (在https://github.com/scikit-learn/scikit-learn/pull/7949 上拉取请求)

      【讨论】:

      • 这可能会增加所使用数据的变化,但它们仍然会有很大的重叠。嵌套交叉验证的重点是为 GridSearch 提供完全可分离的训练和验证测试,并为交叉验证评估提供测试集。
      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 2017-06-12
      • 2017-09-02
      • 1970-01-01
      • 2012-01-07
      • 2015-06-22
      • 2016-05-09
      • 2021-10-25
      相关资源
      最近更新 更多