SMOTE arroja un error por un problema de desequilibrio de varias clases

9

Estoy tratando de usar SMOTE para corregir el desequilibrio en mi problema de clasificación de varias clases. Aunque SMOTE funciona perfectamente en el conjunto de datos de iris según el documento de ayuda de SMOTE, no funciona en un conjunto de datos similar. Así es como se ven mis datos. Tenga en cuenta que tiene tres clases con valores 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

Tiene la forma de un marco de datos, igual que el iris:

> class(data)
[1] "data.frame"

Aquí está mi código usando SMOTE y el error que arroja:

> 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
bronceado
fuente
intente convertir su columna de destino (es decir, "estado") para factorizar y considere marcar la publicación de @ xing a continuación como la respuesta.
Verdoso

Respuestas:

13

He encontrado un problema similar y lo resolví transfiriendo los valores de la clase ("estado" en su caso) al tipo de factor. Después de usar data$status=factor(data$status), newDataimprime de la siguiente manera:

     looking risk every status
7          0    0     0      1
2          0    0     0      1
7.1        0    0     0      1
12         0    0     0      1
4          0    0     0      1
12.1       0    0     0      1
11         0    0     0      3
8         NA   NA    NA      3
9         NA   NA    NA      3
10        NA   NA    NA      3
111       NA   NA    NA      3
121       NA   NA    NA      3
13        NA   NA    NA      3

¡Sin errores!

xing
fuente
¡Es una pena que no se mencione en la SMOTEdocumentación que funciona solo si las etiquetas son factor!
Pop
Eso fue todo por mí. convirtiendo a factor lo arregló.
Verdoso