如何在 R 中平衡不平衡分类 1:1 与 SMOTE

Posted

技术标签:

【中文标题】如何在 R 中平衡不平衡分类 1:1 与 SMOTE【英文标题】:How to balance unbalanced classification 1:1 with SMOTE in R 【发布时间】:2016-08-07 16:32:27 【问题描述】:

我正在做二进制分类,我当前的目标类包括: 坏:3126 好:25038

所以我希望坏(少数)示例的数量等于好示例的数量 (1:1)。 所以 Bad 需要增加约 8 倍(额外的 21912 SMOTEd 实例),而不是增加大多数(Good)。我正在尝试的代码不会像目前一样保持 Good 的数量不变。

我尝试过的代码:

示例 1:

library(DMwR)
smoted_data <- SMOTE(targetclass~., data, perc.over=700, perc.under=0, k=5, learner=NULL)

示例 1 输出: 坏:25008 好:0

示例 2:

smoted_data <- SMOTE(targetclass~., data, perc.over=700, k=5, learner=NULL)

示例 2 输出: 坏:25008 好:43764

示例 3:

smoted_data <- SMOTE(targetclass~., data, perc.over=700, perc.under=100, k=5, learner=NULL)

示例 3 输出: 坏:25008 好:21882

【问题讨论】:

【参考方案1】:

您可以尝试在 R 中使用 ROSE 包。

可查看带有示例的研究文章here

【讨论】:

谢谢。我一直在与其他软件包苦苦挣扎。这个按预期工作【参考方案2】:

您应该使用 114.423 的 perc.under。由于 (700/100)x3126x(114.423/100)=25038.04。

但请注意,由于 SMOTE 对多数类进行随机欠采样,因此您将获得在多数类中具有重复项的新数据。也就是说,你的新数据会有 25038 个 GOOD 样本,但是和原始数据的 25038 个 GOOD 样本是不一样的。一些 GOOD 样本将不包含在内,而一些样本将在新生成的数据中重复。

【讨论】:

【参考方案3】:

我推荐你使用我正在开发的bimba 包。它在 CRAN 上尚不可用,但您可以从 github 轻松安装它。

您可以在其 github 页面上找到有关如何安装它的说明: https://github.com/RomeroBarata/bimba

对使用SMOTE 函数在bimba 中实现的数据的唯一限制是预测变量必须是数字,并且目标必须是保存数据的数据框的最后一列,并且只有两个值。

只要您的数据遵守这些限制,使用SMOTE 函数就很容易:

library(bimba)
smoted_data <- SMOTE(data, perc_min = 50, k = 5)

其中perc_min 指定在过采样后所需的少数类百分比(在这种情况下perc_min = 50 平衡类)。请注意,大多数类没有像 DMwR 包中那样被欠采样。

【讨论】:

【参考方案4】:

要使用SMOTE 实现 1:1 平衡,您需要这样做:

library(DMwR)
smoted_data <- SMOTE(targetclass~., data, perc.over=100)

我不得不承认,这在内置文档中似乎并不明显,但是如果您阅读原始文档,它会指出:

参数perc.overperc.under控制数量 少数类的过度抽样和多数类的抽样不足 类,分别。

perc.over 通常是大于 100 的数字。对于属于少数类的原始数据集中的每个案例,perc.over/100 的新示例 将创建类。如果 perc.over 是一个低于 100 的值而不是单个 将以随机选择的比例生成案例(由 perc.over/100) 属于少数群体的案件 原始数据集。

因此,当perc.over 为 100 时,您实际上创建了 1 个新示例 (100/100 = 1)。

perc.under 的默认值为 200,这就是您要保留的值。

参数perc.under控制比例 将随机选择的多数类别的案例 最终的“平衡”数据集。这个比例是相对于计算的 新产生的少数类案件的数量。

prop.table(table(smoted_data$targetclass))
# returns 0.5  0.5

【讨论】:

以上是关于如何在 R 中平衡不平衡分类 1:1 与 SMOTE的主要内容,如果未能解决你的问题,请参考以下文章

Xgboost 处理不平衡的分类数据

使用 Weka 进行分类没有给出精度、Fmeasure 和 MCC 的任何结果

用R处理不平衡的数据

R语言中样本平衡的几种方法

目标检测中的样本不平衡处理方法——OHEM, Focal Loss, GHM, PISA

逻辑回归分类中解决类别不平衡问题