我有一个不平衡的数据集。我正在使用 SMOTE(合成少数过采样技术)来执行过采样。在执行二元分类时,我在这个过采样数据集上使用了 10 倍交叉验证。
但是,我最近看到了这篇论文;联合使用过采样和欠采样技术以及交叉验证来开发和评估预测模型,其中提到在交叉验证期间使用过采样数据集是不正确的,因为它会导致过度乐观的性能估计。
我想验证在交叉验证中使用过采样数据的正确方法/程序?
我有一个不平衡的数据集。我正在使用 SMOTE(合成少数过采样技术)来执行过采样。在执行二元分类时,我在这个过采样数据集上使用了 10 倍交叉验证。
但是,我最近看到了这篇论文;联合使用过采样和欠采样技术以及交叉验证来开发和评估预测模型,其中提到在交叉验证期间使用过采样数据集是不正确的,因为它会导致过度乐观的性能估计。
我想验证在交叉验证中使用过采样数据的正确方法/程序?
为了避免在使用监督过滤器时 Weka 中的交叉验证对性能估计过于乐观,请使用FilteredClassifier
(在meta
类别中)并使用您想要使用的过滤器(例如 SMOTE)和分类器(例如朴素贝叶斯)对其进行配置。
对于每个交叉验证折叠,Weka 将仅使用该折叠的训练数据来参数化过滤器。
当您使用 SMOTE 执行此操作时,您不会在 Weka 结果窗口中看到实例数量的差异,但是发生的情况是 Weka 正在 SMOTE 应用的数据集上构建模型,但在未经过滤的训练集——这在理解真实性能方面是有意义的。尝试更改 SMOTE 过滤器设置(例如,该-P
设置控制生成多少额外的少数类实例占数据集中数量的百分比),您应该会看到性能发生变化,表明过滤器实际上正在做某事。
此视频和这些幻灯片FilteredClassifier
中说明了使用Weka在线课程的更多数据挖掘。在这个例子中,滤波操作是有监督的离散化,而不是 SMOTE,但同样的原理适用于任何有监督的滤波器。
如果您对 SMOTE 技术还有其他问题,我建议您在Cross Validated和/或Weka 邮件列表上提问。
正确的方法是首先将数据拆分为多个折叠,然后将采样仅应用于训练数据并让验证数据保持原样。下图说明了如何以 K 折方式重新采样数据集的正确方法。
如果你想在 python 中实现这一点,有一个库:链接到库:https ://pypi.org/project/k-fold-imblearn/