如何正确使用过采样而不夸大结果?

数据挖掘 Python 分类 预处理 打击 过采样
2022-03-15 02:47:52

我正在使用一个包含 4 个类的小型私有数据集(超过 192 个样本)。为了进行任何分类,预处理步骤是微不足道的。在特征选择和提取技术中,我决定应用过采样(SMOTE)。这是我所做的:

  • 使用整个数据集(原始 192 个样本):
  • 使用 SMOTE 为每个类创建合成样本,所以我每类总共得到 500 个样本(总共 2000 个)

我对这个过程有很大的怀疑,因为当我应用 SMOTE 时,我使用最简单的模型(例如 15 神经元 MLP)获得了非常高的准确率(在某些情况下甚至 100%)。所以,我有一些问题要断言我的实验的正确性:

  1. 是否可以对整个数据集进行过采样,或者我应该只在训练数据中应用 SMOTE(请记住,这将留下很少的样本进行测试)?

  2. SMOTE 最初用于处理不平衡的数据集,为样本较少的类创建样本。可以使用它为所有类生成样本以扩大整个数据集吗?

2个回答

首先-您是否尝试过在不进行过采样的情况下进行建模?如果您没有不平衡的类,为什么需要过采样?您并不总是需要大量数据来获得一个好的模型作为基线。

关于should i apply the SMOTE only in train data- 总是留下一些测试数据,不要对整个数据集应用任何转换(甚至是标准化或缺失值估算)。如果你有一些预处理——在训练数据集、训练模型上进行。然后将预处理管道应用于测试数据并对其进行预测。

simplest models such as a 15-neuron MLP.- 这听起来不是simplest我的解决方案。你有没有尝试过其他方法?另外,您是否检查过每个班级confusion matrix的分类错误?test data

根据我的经验,我可以分享一些笔记。

  • 我不会信任 SMOTE 创建测试实例的程度。深刻的是,它可能会创建彼此过于相似的人工数据,因此准确性很高。因此,我只会在训练集中创建 SMOTE 样本。
  • 由于您的数据集很小,我会使用类似“遗漏”的交叉验证。
  • 我假设为所有类创建人工样本是为了让你的模型更准确。同样,您可以尝试仅使用训练数据,但在机器学习中,将类似(统计采样)方法集成到分类器中(例如,自举、随机森林等)以使分类器性能更好。说到这,由于您的数据集很小,您可以尝试决策树实现。