如何在 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.over
和perc.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的主要内容,如果未能解决你的问题,请参考以下文章
使用 Weka 进行分类没有给出精度、Fmeasure 和 MCC 的任何结果