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

Posted

技术标签:

【中文标题】过采样:Python 中二进制和分类数据的 SMOTE【英文标题】:Oversampling: SMOTE for binary and categorical data in Python 【发布时间】:2018-05-19 05:50:54 【问题描述】:

我想将 SMOTE 应用于包含二进制、分类和连续数据的不平衡数据集。有没有办法将 SMOTE 应用于二进制和分类数据?

【问题讨论】:

【参考方案1】:

根据文档,现在可以使用 SMOTENC 来实现。 SMOTE-NC 能够处理分类和连续特征的混合。

这是来自documentation的代码:

from imblearn.over_sampling import SMOTENC
smote_nc = SMOTENC(categorical_features=[0, 2], random_state=0)
X_resampled, y_resampled = smote_nc.fit_resample(X, y)

【讨论】:

您好,如果数据集具有离散和分类特征,您知道我应该使用什么吗? 您只需要在第二行提到上面提到的分类特征索引。离散的功能,它会自动照顾。 您好,我也有类似的问题。如果您有时间,可以在此相关帖子上请求您的帮助吗? ***.com/questions/71193740/…【参考方案2】:

截至 2018 年 1 月,此问题尚未在 Python 中实现。以下是来自团队的reference。事实上,如果有人想实施,他们愿意接受提案。

Chawla & Bowyer 的 paper (web archive) 对于那些对这个持续性问题有学术兴趣的人,在第 6.1 节中解决了这个 SMOTE-Non Continuous 抽样问题。

更新:此功能已于 2018 年 10 月 21 日实施。服务请求现已关闭。

【讨论】:

链接到纸张已损坏,但可以在此处找到 Wayback Machine 中最新版本的链接:web.archive.org/web/20180413091607/https://www.jair.org/media/…【参考方案3】:

因此,根据文档,SMOTE 尚不支持 Python 中的分类数据,并提供连续输出。

您可以采用一种解决方法,将分类变量转换为整数并使用 SMOTE。

然后使用np.round(X_train[categorical_variables]) 将它们转换回各自的分类值。

【讨论】:

此解决方案不太适合顺序无意义的名义数据。例如,我们将女装、汽车、女鞋类编码为 0、1、2。然后,使用 SMOTE,我们抽取 2 个样本,其中一个具有类别 0,另一个具有类别 2,我们最终进行插值,使得舍入值为 1。最终结果将是我们生成的数据样本被分类为 ' Car'类,而父母属于女装女鞋,完全没有意义。 能否将分类数据转换成one-hot-encoding然后应用SMOTE。 现在,这个功能已经被他们以SMOTENC的形式发布了,它可以处理数字和分类变量

以上是关于过采样:Python 中二进制和分类数据的 SMOTE的主要内容,如果未能解决你的问题,请参考以下文章

在python中平衡的多类分类(过采样)

Xgboost 处理不平衡的分类数据

分类问题中的过采样和欠采样

使用 SMOTE 对图像数据进行过采样

为不平衡二元分类对数据进行过采样的过程

如何使用 Python 对图像数据集进行过采样?