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