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

时间:2016-04-15 15:48:44

标签: r machine-learning classification

我正在进行二进制分类,我当前的目标类由以下内容组成: 差:3126好:25038

所以我希望Bad(少数)例子的数量等于Good例子的数量(1:1)。 所以坏需要增加~8倍(额外的21912个SMOTEd实例)而不是增加大多数(好)。我正在尝试的代码不会保持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

4 个答案:

答案 0 :(得分: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时,您基本上创建了一个新示例(100/100 = 1)。

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

  

参数perc.under控制比例   将随机选择的多数类的案例   最终&#34;平衡&#34;数据集。该比例是相对计算的   到新生成的少数民族案件的数量。

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

答案 1 :(得分:1)

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

有一个带有示例的研究文章here

答案 2 :(得分:1)

你应该使用114.423的perc.under。自(700/100)x3126x(114.423 / 100)= 25038.04。

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

答案 3 :(得分:0)

我建议您使用我正在开发的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包那样进行欠采样。