【问题标题】:Why do we need to give y in sklearn's kfold.split()?为什么我们需要在 sklearn 的 kfold.split() 中给出 y?
【发布时间】:2022-01-23 01:37:45
【问题描述】:

sklearn.model_selection.KFold 的 split() 函数将 X 和 y(y 是可选的)作为参数。为什么我们需要给 y? split() 函数所做的只是为 kfold CV 生成行索引,因此行数应该足够。实际上也不需要 X。这是一种兼容性问题吗?谢谢。

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    因为他们希望遵循与其他交叉验证拆分相同的格式,其中一些依赖于 X 或 y 数据。例如,StratifiedKFold 依赖于 y,因为它试图保持测试数据和训练数据之间的类分布成比例。 here 的不同风格有很好的视觉表现。

    所以,是的,你的预感是对的。它是兼容性驱动的。

    【讨论】:

      【解决方案2】:

      在我看来,在考虑 split()kFold 的方法时,y 并不是定义行索引的基础(实际上甚至不是 X,但仅样本数)。

      确实,如果您查看类 BaseCrossValidator 中方法 split() 的实现,您会发现它实际上仅取决于样本数量(参见 _num_samples() 方法 here 的参考,例如;观察,此外,基类中的 _iter_test_indices() 方法未实现,因为它专门用于单个类,并由 _iter_test_masks() 调用,而split() 又调用它。

      接下来发生的事情是,在KFold(和_BaseKFold)类中,split()_iter_test_indices() 都是专门的,以便再次仅考虑样本数量;另一方面,当涉及到 StratifiedKFold 类时,y 确实发挥了作用,正如您在 _make_test_folds() 的实现中所看到的那样(由 _iter_test_masks() 调用)。

      【讨论】:

        猜你喜欢
        • 2021-10-09
        • 1970-01-01
        • 2017-09-28
        • 2019-06-09
        • 2014-06-18
        • 2017-02-26
        • 2011-04-03
        • 2017-07-27
        • 2020-09-21
        相关资源
        最近更新 更多