如何在交叉验证中使用过采样数据?

时间:2018-03-27 00:03:12

标签: machine-learning weka cross-validation oversampling

我有一个不平衡的数据集。我正在使用SMOTE(合成少数过采样技术)来执行过采样。执行二进制分类时,我对此过采样数据集使用10倍交叉验证。

然而,我最近发表了这篇论文; Joint use of over- and under-sampling techniques and cross-validation for the development and assessment of prediction models提到在交叉验证过程中使用过采样数据集是不正确的,因为它会导致过度优化的性能估算。

我想验证在交叉验证中使用过采样数据的正确方法/程序

2 个答案:

答案 0 :(得分:2)

为了避免在使用监督过滤器时Weka中的交叉验证过度优化性能估计,请使用FilteredClassifier(在meta类别中)并使用过滤器(例如SMOTE)和分类器(例如,您想要使用的Naive Bayes)。

对于每个交叉验证折叠,Weka将仅使用该折叠的训练数据来对过滤器进行参数化。

使用SMOTE执行此操作时,您将看不到Weka结果窗口中实例数量的差异,但发生的情况是Weka正在应用SMOTE的数据集上构建模型,但显示评估的输出它在未经过滤的训练集上 - 这在理解真实表现方面是有意义的。尝试更改SMOTE过滤器设置(例如-P设置,该设置控制生成的数量为数据集中数量的百分比的少数类别实例的数量),您应该看到性能发生变化,向您显示过滤器实际上正在做点什么。

no conversion or promotion of the base types in the catch(..) blockthis video来自使用Weka的更多数据挖掘 these slides,说明FilteredClassifier的使用情况。在这个例子中,过滤操作是有监督的离散化,而不是SMOTE,但同样的原则适用于任何有监督的过滤器。

如果您对SMOTE技术有其他疑问,我建议您在online course和/或Cross Validated上提问。

答案 1 :(得分:0)

正确的方法是首先将数据拆分为多个折叠,然后仅对训练数据应用采样,让验证数据保持原样。下图说明了如何以 K 折方式重新采样数据集的正确方法。

Upsampling/Downsampling with K-Fold Cross validation

如果你想在 python 中实现这一点,有一个库: 图书馆链接:https://pypi.org/project/k-fold-imblearn/