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
r
classification
unbalanced-classes
oversampling
bronceado
fuente
fuente
Respuestas:
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)
,newData
imprime de la siguiente manera:¡Sin errores!
fuente
SMOTE
documentación que funciona solo si las etiquetas son factor!