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

How to use over-sampled data in cross validation?

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

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

我想验证在交叉验证中使用过采样数据的正确性approach/procedure?

为避免在使用监督过滤器时 Weka 中 cross-validation 的性能估计过于乐观,请使用 FilteredClassifier(在 meta 类别中)并使用过滤器(例如 SMOTE)对其进行配置和您要使用的分类器(例如朴素贝叶斯)。

对于每个 cross-validation 折叠,Weka 将仅使用该折叠的训练数据来参数化过滤器。

当您使用 SMOTE 执行此操作时,您不会在 Weka 结果中看到实例数量的差异 window,但发生的情况是 Weka 正在 SMOTE-applied 上构建模型数据集,但显示在未过滤的训练集上评估它的输出——这在理解真实性能方面是有意义的。尝试更改 SMOTE 过滤器设置(例如 -P 设置,它控制生成的额外 minority-class 个实例占数据集中数量的百分比),您应该会看到性能发生变化,向您展示过滤器实际上在做一些事情。

FilteredClassifier 的用法在 this video and these slides from the More Data Mining with Weka online course 中说明。在这个例子中,过滤操作是有监督的离散化,而不是 SMOTE,但同样的原则适用于任何有监督的过滤器。

如果您对 SMOTE 技术还有其他疑问,我建议您在 Cross Validated and/or the Weka mailing list 上询问他们。

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

如果您想在 python 中实现此目的,可以使用一个库: Link 去图书馆:https://pypi.org/project/k-fold-imblearn/