CJa*_*ava 4 r classification machine-learning
我正在执行二进制分类,并且我当前的目标类包括:不良:3126良好:25038
因此,我希望不良(少数)示例的数量等于良好示例(1:1)的数量。因此,坏的需要增加大约8倍(额外的21912个SMOTEd实例),而不能增加大多数(好)。我正在尝试的代码不会像目前一样保持Good的数量不变。
我尝试过的代码:
范例1:
library(DMwR)
smoted_data <- SMOTE(targetclass~., data, perc.over=700, perc.under=0, k=5, learner=NULL)
Run Code Online (Sandbox Code Playgroud)
示例1输出:Bad:25008 Good:0
范例2:
smoted_data <- SMOTE(targetclass~., data, perc.over=700, k=5, learner=NULL)
Run Code Online (Sandbox Code Playgroud)
示例2的输出:错误:25008良好:43764
范例3:
smoted_data <- SMOTE(targetclass~., data, perc.over=700, perc.under=100, k=5, learner=NULL)
Run Code Online (Sandbox Code Playgroud)
示例3的输出:错误:25008良好:21882
要使用实现1:1平衡SMOTE,您需要执行以下操作:
library(DMwR)
smoted_data <- SMOTE(targetclass~., data, perc.over=100)
Run Code Online (Sandbox Code Playgroud)
我必须承认,从内置文档看来,它似乎并不明显,但是如果您阅读原始文档,它会指出:
参数
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
Run Code Online (Sandbox Code Playgroud)