【问题标题】:Create balanced dataset 1:1 using SMOTE without modifying the observations of the majority class in R使用 SMOTE 创建 1:1 平衡数据集,而不修改 R 中多数类的观察结果
【发布时间】:2020-11-02 09:23:37
【问题描述】:

我正在研究一个二元分类问题,我有一个不平衡的数据集。我想创建一个新的更平衡的数据集,每个类有 50% 的观察。为此,我在 R 中使用由DMwR library 提供的 SMOTE 算法。

在新的数据集中,我想保持多数类的观察值不变

但是,我遇到了两个问题:

  1. SMOTE 减少或增加多数类别的观察数量(我只想增加少数类别的数量)。
  2. SMOTE 生成的一些观测值包含 NA 值。

假设我有 20 个观察值:多数类中有 17 个观察值,少数类只有 3 个观察值。这是我的代码:

library(DMwR)
library(dplyr)

sample_data <- data.frame(matrix(rnorm(200), nrow=20))
sample_data[1:17,"X10"] <- 0
sample_data[18:20,"X10"] <- 1
sample_data[,ncol(sample_data)] <- factor(sample_data[,ncol(sample_data)], levels = c('1','0'), labels = c('Yes','No'))
newDataSet <- SMOTE(X10 ~., sample_data, perc.over = 400, perc.under = 100)

在我的代码中,我修复了 perc.over = 400 以创建 12 个少数类的新观察值,并修复了 perc.under = 100 以保持多数类没有变化。

但是,当我检查 newDataSet 时,我观察到 SMOTE 将多数类的数量从 17 减少到 12。此外,一些生成的观察值具有 NA 值。

得到的结果如下图所示:

【问题讨论】:

    标签: r machine-learning imbalanced-data smote


    【解决方案1】:

    根据?SMOTE

    对于原始数据集中属于少数类的每个案例, perc.over/100 将创建该类的新示例。

    此外:

    例如,如果为少数人生成了 200 个新示例 类, perc.under 的值 100 将随机选择 200 属于多数类的案例从原始数据集中到 属于最终数据集。

    因此,在您的情况下,您是:

    1. 创建 12 个新的Yes(除了原来的)。
    2. 随机选择12个No

    包含 NA 的新 Yes 可能与 SMOTEk 参数有关。根据?SMOTE

    k:一个数字,表示使用的最近邻居的数量 生成少数类的新示例。

    它的默认值为 5,但在您的原始数据中,您只有 3 个Yes。设置k = 2 似乎可以解决这个问题。

    最后的评论:为了实现您的目标,我将使用 SMOTE 仅增加少数类的观察数量(perc.over = 400 或 500)。然后,您可以将它们与多数类的原始观察结果结合起来。

    【讨论】:

    • 非常感谢您的回答。是的,我使用了您回复中建议的 SMOTE。我使用它在少数类中生成更多观察结果,然后将它们与初始数据集的原始多数类结合起来。像这样,我创建了一个新的平衡数据集,而不修改多数类的观察结果。谢谢!!
    猜你喜欢
    • 2016-08-07
    • 2021-06-28
    • 2023-03-15
    • 2013-07-12
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多