0

我在 R 中第一次使用 smote

我在大多数类为 0 - 7952346 和少数类为 1- 27230 的火车数据上使用 smote,我想进行下采样,以便我有 1 接近 30000 和 0 接近这个范​​围 180000-200000。

我无法做到这一点,有人可以帮我解决这个问题,我尝试使用不同的参数,但没有得到想要的正确结果。

table(train$ModelLabel)

      0       1 
7952346   27230 

train2 <- SMOTE(ModelLabel ~ .,train, perc.over=100,perc.under = 600)
table(train2$ModelLabel)

     0      1 
163380  54460 

train2 <- SMOTE(ModelLabel ~ .,train, perc.over=5,perc.under = 600)
table(train2$ModelLabel)

    0     1 
 8166 28591 

train2 <- SMOTE(ModelLabel ~ .,train, perc.over=5,perc.under = 10)
table(train2$ModelLabel)

    0     1 
  136 28591 

train2 <- SMOTE(ModelLabel ~ .,train, perc.over=25,perc.under = 0)
table(train2$ModelLabel)

    0     1 
    0 34037 

train2 <- SMOTE(ModelLabel ~ .,train, perc.over=25,perc.under = 400)
table(train2$ModelLabel)

    0     1 
27228 34037 
4

1 回答 1

0

如果你看一下 SMOTE 的代码:

SMOTE
function (form, data, perc.over = 200, k = 5, perc.under = 200, 
    learner = NULL, ...) 
{
    [....]
newExs <- smote.exs(data[minExs, ], ncol(data), perc.over, 
        qk)
    if (tgt < ncol(data)) {
        newExs <- newExs[, cols]
        data <- data[, cols]
    }
    selMaj <- sample((1:NROW(data))[-minExs], as.integer((perc.under/100) * 
        nrow(newExs)), replace = T)
   [...]

    newdataset <- rbind(data[selMaj, ], data[minExs, ], newExs)

所以这是一个非常奇怪的计算,但是当我尝试时,我发现 perc.over 的工作方式非常奇怪。底线是如果你想使用这个包,也许试试:

train =data.frame(matrix(rnorm((7952346+27230)*10),ncol=10))
oversample = SMOTE(ModelLabel ~ .,data=train, perc.over=120,perc.under = 0)
table(oversample$ModelLabel)

    0     1 
    0 54460

newdata = rbind(
oversample[sample(nrow(oversample),30000),],
train[sample(which(train$ModelLabel==0),180000,replace=TRUE),]
)
     0      1 
180000  30000 
于 2020-03-07T00:08:19.583 回答