【发布时间】:2022-01-23 01:37:45
【问题描述】:
sklearn.model_selection.KFold 的 split() 函数将 X 和 y(y 是可选的)作为参数。为什么我们需要给 y? split() 函数所做的只是为 kfold CV 生成行索引,因此行数应该足够。实际上也不需要 X。这是一种兼容性问题吗?谢谢。
【问题讨论】:
标签: python scikit-learn
sklearn.model_selection.KFold 的 split() 函数将 X 和 y(y 是可选的)作为参数。为什么我们需要给 y? split() 函数所做的只是为 kfold CV 生成行索引,因此行数应该足够。实际上也不需要 X。这是一种兼容性问题吗?谢谢。
【问题讨论】:
标签: python scikit-learn
因为他们希望遵循与其他交叉验证拆分相同的格式,其中一些依赖于 X 或 y 数据。例如,StratifiedKFold 依赖于 y,因为它试图保持测试数据和训练数据之间的类分布成比例。 here 的不同风格有很好的视觉表现。
所以,是的,你的预感是对的。它是兼容性驱动的。
【讨论】:
在我看来,在考虑 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() 调用)。
【讨论】: