2

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

4

3 回答 3

3

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

根据来自的文档SMOTE

参数 perc.over 和 perc.under 分别控制少数类的过采样量和多数类的欠采样量。

所以:

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

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

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

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

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

我建议使用大于 100 的值perc.over,甚至更高的值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)
于 2019-02-11T08:09:57.490 回答
0

包的替代DMwR方案是减少样本大小的smotefamily包。

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

这在Richard Richard的博客文章中得到了很好的解释。

示例代码(前两列具有特征):

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

于 2019-11-01T12:05:28.963 回答
0

我知道我回答你的问题有点太晚了,但希望这个答案对其他人有帮助!您正在使用的包DMwR结合 了 SMOTE 和多数类的欠采样

我建议您smotefamily::SMOTE仅在少数类样本上使用它,这样您就不会丢失多数类的观察结果。

于 2020-05-04T04:38:11.713 回答