如何在执行 SMOTE、python 之前删除具有少于一定数量示例的少数类

Posted

技术标签:

【中文标题】如何在执行 SMOTE、python 之前删除具有少于一定数量示例的少数类【英文标题】:How to remove minority classes with less than a certain number of examples before performing SMOTE, python 【发布时间】:2020-12-06 16:58:53 【问题描述】:

我有一个数据集,其中包含 100 列作为从 word2vec 生成的特征向量(100D 特征向量),我的目标是我的数据集中每一行向量的分类变量。现在我的数据集总共有大约 1000 个不同的分类变量,行数约为 75000。数据集的问题是它高度不平衡,除了前 200 个分类变量之外,其余所有类的样本都很少,@ 987654321@.

现在我想使用 SMOTE 对这些数据执行过采样,以便为少数类生成更多示例。 I want to ignore the classes that have less than 6 sample examples 因为那是 SMOTE 给出值错误的地方。有什么办法,我可以在代码中处理它,以便在执行 SMOTE 时忽略那些样本少于 6 个的类?这样做是否有助于解决我目前面临的错误?

代码和错误信息供参考:

dataset = pd.read_csv(r'C:\vectors.csv')
X = dataset.iloc[:, 3:103]
y = dataset.iloc[:, 0]
from imblearn.over_sampling import SMOTE
smote = SMOTE(k_neighbors = 1)       
smote_Xtrain, smote_y_train = smote.fit_sample(X, y) 

虽然我设置了 k_neighbors = 1,但我目前收到此错误 ValueError: Expected n_neighbors <= n_samples, but n_samples = 1, n_neighbors = 2

对此的任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

您可以使用以下命令查看每个类的唯一条目并对其进行计数:df['VARIABLE'].value_counts(dropna=False)(如果您不希望出现 NaN,请转为 dropna=True)。

然后,您可以自己创建一个算法,设置一个阈值,并自动删除低于您的阈值的类,或者将它们放入一个新的大类“其他”例如

【讨论】:

感谢您的建议。尝试过,但现在在尝试将训练数据拟合到 Smote 时出现内存错误。知道如何解决吗?

以上是关于如何在执行 SMOTE、python 之前删除具有少于一定数量示例的少数类的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 SMOTE 之前还是之后执行网格搜索(用于调整超参数)?

如何在词嵌入层之前应用 SMOTE 技术(过采样)

如何在交叉验证和 GridSearchCV 中实现 SMOTE

评估 SMOTE 和 RandomUnderSampling 不同的策略

过采样:Python 中二进制和分类数据的 SMOTE

在 python 金字塔 web 框架中,如何在播种之前删除所有数据库表行?