Smote - выберите Perc_under и Perc_Over - PullRequest
0 голосов
/ 06 марта 2020

Я использую smote в первый раз в R

Я использую smote для данных о поездах с классом большинства, который составляет 0 - 7952346, и классом меньшинства 1- 27230, я хочу уменьшить выборку так, чтобы у меня были 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 

1 Ответ

0 голосов
/ 07 марта 2020

Если вы посмотрите на код 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)

Так что это довольно странный расчет, но когда я попытался, я обнаружил, что per c .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 
...