Я пытаюсь использовать SMOTE для исправления дисбаланса в моей проблеме классификации нескольких классов. Хотя SMOTE отлично работает с набором данных iris согласно справочному документу SMOTE, он не работает с аналогичным набором данных. Вот как выглядят мои данные. Обратите внимание, что у него есть три класса со значениями 1, 2, 3.
> data
looking risk every status
1 0 1 0 1
2 0 0 0 1
3 0 0 0 2
4 0 0 0 1
5 0 0 0 1
6 3 0 0 1
7 0 0 0 1
8 0 0 0 1
9 0 1 0 1
10 0 0 0 1
11 0 0 0 3
12 0 0 0 1
13 0 0 0 1
14 0 0 0 1
15 0 0 0 2
Он находится в форме фрейма данных, как и радужная оболочка:
> class(data)
[1] "data.frame"
Вот мой код с использованием SMOTE и ошибка, которую он выдает:
> newData <- SMOTE(status ~ ., data, perc.over = 600,perc.under=100)
Error in scale.default(T, T[i, ], ranges) : subscript out of bounds
In addition: Warning messages:
1: In FUN(newX[, i], ...) :
no non-missing arguments to max; returning -Inf
2: In FUN(newX[, i], ...) :
no non-missing arguments to max; returning -Inf
3: In FUN(newX[, i], ...) :
no non-missing arguments to max; returning -Inf
4: In FUN(newX[, i], ...) : no non-missing arguments to min; returning Inf
5: In FUN(newX[, i], ...) : no non-missing arguments to min; returning Inf
6: In FUN(newX[, i], ...) : no non-missing arguments to min; returning Inf
Ответы:
Я столкнулся с подобной проблемой, и я решил ее, переведя значения класса («status» в вашем случае) в тип фактора. После использования
data$status=factor(data$status)
,newData
отпечатков следующим образом :Нет ошибок!
источник
SMOTE
документации не упоминается, что это работает, только если метки являются факторами!