SMOTE in r大大减少了样本量

时间:2019-02-11 06:36:02

标签: r statistics sample-size

我有一个大约有130000条记录的数据集。记录分为目标变量0和1两类。1仅占总比例的0.09%。

我正在Windows 10上的R-3.5.1中运行分析,我使用了SMOTE算法来处理这种不平衡的数据集。

我使用以下代码来处理不平衡的数据集

library(DMwR)
data_code$target=as.factor(data_code$target) #Converted to factor as 
# SMOTE works with factor data type
smoted_data <- SMOTE(target~., data_code, perc.over=100)

但是在执行代码后,我看到0的计数是212,而1的计数也是212,这大大减少了我的样本量。你能建议我如何使用SMOTE处理不平衡的数据集而不更改我的样本吗?数据大小

3 个答案:

答案 0 :(得分:1)

您需要使用函数中可用的两个参数:perc.overperc.under

根据SMOTE中的doc

  

参数perc.over和perc.under控制数量   少数群体的过度采样和多数群体的采样不足   类。

所以:

  

perc.over通常将是一个大于100的数字。   值,对于属于   少数阶层,perc.over / 100该类别的新例子是   已创建

我看不到您的数据,但是,如果您的少数类有100个案例,并且perc.over=100,该算法将从该类中生成100/100 = 1个新案例。

  

参数perc.under控制着案例的比例   多数类别,将被随机选择用于最终的“平衡”类别   数据集。此比例是相对于   新产生的少数群体案件。

例如,perc.under=100的值将从原始数据的多数类中选择与少数类所生成的观察值相同的值。

在我们的示例中,仅生成了一个新案例,因此它将仅添加一个新案例,从而产生具有2个案例的新数据集。

我建议perc.over使用大于100的值,而perc.under使用更高的值(默认值为100和200)。

请记住,您正在添加少数族裔中不真实的新观察值,我将尽力控制这些观察值。

数值示例:

set.seed(123)

data <- data.frame(var1 = sample(50),
                   var2 = sample(50),
                   out = as.factor(rbinom(50, 1, prob=0.1)))

table(data$out)
#  0  1 
# 43  7 # 50 rows total (original data)
smote_data <- DMwR::SMOTE(out ~ var1, data, perc.over = 200, perc.under = 400)
table(smote_data$out)
#  0  1 
# 56 21 # 77 rows total (smote data)

答案 1 :(得分:0)

DMwR包的一种替代方法是smotefamily包,它不会减小样本量。

相反,它从少数类创建附加数据(=合成数据),并将其添加到原始数据中。这样$data参数中的输出就可以进行训练了。要调整合成数据量,可以修改参数dup_size。但是,默认的dup_size = 0已经优化了输出以实现平衡的类,因此您无需对其进行调整。

Richard Richard在此blog post中对此进行了很大的解释。

示例代码(在前两列中具有功能):

smote1 <- smotefamily::SMOTE(features, target, K = 4, dup_size = 0)
formula1 <- "class ~ ." %>% as.formula
model.smote <- caret::train(formula1, method = "rpart", smote1$data)
predictions.smote <- predict(model.smote, smote1$data[,1:2]) %>% print
cv2 <- confusionMatrix(smote1$data$class %>% as.factor, predictions.smote)

我发现smotefamily::SMOTE更方便,因为您不必调整两个参数perc_overperc_under直到获得可接受的样本大小,然后DMwR::SMOTE通常会生成NA值。

答案 2 :(得分:0)

我知道回答您的问题还为时已晚,但希望此答案对其他人有所帮助!您正在使用的软件包是DMwR,它使用的是combination of SMOTE and under-sampling of the majority class

我建议您使用smotefamily::SMOTE,因为它仅用于对少数群体进行抽样,因此您不会失去对多数群体的观察。