【问题标题】:SMOTE in r reducing sample size significantlySMOTE in r 显着减少样本量
【发布时间】:2019-02-11 06:36:02
【问题描述】:

我有一个包含大约 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 处理这个不平衡的数据集吗?数据大小

【问题讨论】:

  • 请给出重现您问题的示例代码,以便人们尝试并提出解决方案。见stackoverflow.com/help/mcve
  • 嗨@denis,我已经给出了我在帖子中使用的代码。你还想要什么?
  • 人们想要的,正如我提供的链接中广泛描述的那样,是示例数据。如果我复制粘贴您的代码,我将一无所获,因为我不知道 data_code。如果我提出一个解决方案,我无法测试它。我必须自己创建一个示例,但这应该是您在这里工作的一部分。创建一个伪造的data_code 集来重现问题并将其发布在您的问题中(避免使用外部链接)。
  • 抱歉,我无法与您分享 data_code,因为它包含客户数据。
  • 再一次,我/我们不要求您共享数据集:创建一个重现您的问题的假数据集。

标签: r statistics sample-size


【解决方案1】:

您需要对函数中可用的两个参数进行一些操作:perc.overperc.under

根据doc 来自SMOTE

参数 perc.over 和 perc.under 控制 少数类的过度抽样和多数类的抽样不足 类。

所以:

perc.over 通常是大于 100 的数字。使用这种类型的 值,对于原始数据集中属于 少数类, perc.over/100 该类的新示例将是 已创建

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

参数 perc.under 控制的 case 的比例 将随机选择最终“平衡”的多数类 数据集。这个比例是根据人数计算的 新生成的少数类案例。

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

在我们的示例中,仅生成了 1 个新案例,因此它将仅添加另一个案例,从而生成包含 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)

【讨论】:

  • 很好的解释。非常感谢
【解决方案2】:

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 值。

【讨论】:

    【解决方案3】:

    我知道我回答你的问题有点太晚了,但希望这个答案对其他人有所帮助!您使用的包是DMwR,它使用combination of SMOTE and under-sampling of the majority class

    我建议您使用smotefamily::SMOTE,因为它只对少数类进行采样,因此您不会丢失多数类的观察结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 2018-12-02
      相关资源
      最近更新 更多