我正在进行二进制分类,我当前的目标类由以下内容组成: 差: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
答案 0 :(得分: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时,您基本上创建了一个新示例(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
包那样进行欠采样。