1

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

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

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

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

下图显示了获得的结果:

在此处输入图像描述

4

1 回答 1

1

根据?SMOTE

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

而且:

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

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

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

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

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

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

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

于 2020-07-13T13:16:25.103 回答