bcl*_*man 9 pipeline scikit-learn cross-validation
我刚刚阅读了k-fold交叉验证,并意识到我无意中使用当前的预处理设置泄漏数据.
通常,我有一个火车和测试数据集.我在整个火车数据集上做了一堆数据插补和一次热编码,然后运行k-fold交叉验证.
泄漏是因为,如果我正在进行5倍交叉验证,我将训练80%的列车数据,并在剩余的20%的列车数据上进行测试.
我真的应该根据80%的火车来估算20%(而我之前使用的是100%的数据).
1)这是考虑交叉验证的正确方法吗?
2)我一直在研究这个Pipeline类sklearn.pipeline,它似乎对做一堆变换很有用,然后最终将模型拟合到结果数据中.但是,我正在做一些像" float64用平均值列出缺失数据"这样的东西,"用模式归还所有其他数据",等等.
这种插补没有明显的变压器.我该如何将这一步添加到Pipeline?我会创建自己的子类BaseEstimator吗?
这里的任何指导都会很棒!
我建议将 5 折交叉验证视为简单地将数据分成 5 部分(或折叠)。您保留一份进行测试,并将另外 4 份一起用于您的训练集。我们再重复此过程 4 次,直到每次折叠都有机会进行测试。
为了使您的插补正确工作并且不受污染,您需要确定用于测试的 4 倍的平均值,并使用它来插补训练集和测试集中的该值。
我喜欢使用StratifiedKFold来实现 CV 分割。这将确保折叠中每个类别的样本数量相同。
为了回答有关使用 Pipelines 的问题,我想说您可能应该使用自定义插补转换器对 BaseEstimator 进行子类化。在 CV 分割的循环内部,您应该计算训练集的平均值,然后将该平均值设置为变压器中的参数。然后你可以调用fit或transform。
| 归档时间: |
|
| 查看次数: |
1309 次 |
| 最近记录: |