使用 SMOTE 生成合成数据以提高不平衡数据的性能

数据挖掘 大数据 训练 采样 打击
2022-02-13 21:18:41

我目前有一个包含 21392 个样本的数据集,其中 16948 个属于多数类(A 类),其余 4444 个属于少数类(B 类)。我目前正在使用 SMOTE(Synthetic Minority Over-Sampling Technique)来生成合成数据,但对于应该生成多少百分比的合成样本以确保机器学习/深度学习模型的良好分类性能感到困惑。

我有几个选项:- 1. 第一个选项是生成 21392 个新样本,其中 A 类的 16904 个多数样本和 B 类的剩余 4488 个少数样本。然后,合并原始和综合生成的新样本。然而,我认为的主要缺点是我的整个数据集(原始+新)中少数样本的百分比将或多或少保持不变,我认为这违背了对少数样本进行过采样的目的。2. 第二种选择是生成 21392 个新样本,其中 16904 个多数样本和剩余 4488 个少数样本。然后,仅将原始数据与新数据的新生成的少数样本合并。这样,我的整体数据中少数(B类)样本的百分比会增加(从4444/21392 = 20.774 %(4444+4488)/(21392+4488) = 34.513 %. 我相信这就是 SMOTE 的目的(增加少数样本的数量并减少整个数据集中的不平衡)。

我对使用 SMOTE 相当陌生,非常感谢您对这两个选项中的哪一个更好或我可能考虑的任何其他选项提出任何建议/评论。

1个回答

首先,在进行任何过采样/欠采样之前,您必须将数据集拆分为训练/测试拆分。如果您根据您的方法执行任何策略,然后拆分数据,您将偏向您的模型,这是错误的,因为您在未来的测试集中引入了不存在的点,并且您的分数估计将不完美。

然后在拆分数据后,您将只在训练集上使用 SMOTE。如果您使用 imblearn 的 SMOTE,它会自动为您平衡课程。此外,如果您不想要完美的平衡,您可以使用一些参数来更改它,或者尝试不同的策略。

https://imbalanced-learn.readthedocs.io/en/stable/over_sampling.html#smote-adasyn

所以,基本上,你会有这样的事情:

from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE

X_train, X_test, y_train, y_test = train_test_split(X, y, split_size=0.3)
X_resample, y_resampled = SMOTE().fit_resample(X_train, y_train)

然后继续在 X_resample、y_resample 上拟合模型。上面,X 是您的特征矩阵,y 是您的目标标签。