SMOTE renvoie une erreur pour un problème de déséquilibre multi-classes


10

J'essaie d'utiliser SMOTE pour corriger le déséquilibre dans mon problème de classification multi-classes. Bien que SMOTE fonctionne parfaitement sur le jeu de données iris conformément au document d'aide SMOTE, il ne fonctionne pas sur un jeu de données similaire. Voici à quoi ressemblent mes données. Notez qu'il a trois classes avec les valeurs 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

Il se présente sous la forme d'une trame de données, identique à l'iris:

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

Voici mon code utilisant SMOTE et l'erreur qu'il génère:

> 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

veuillez essayer de convertir votre colonne cible (c'est-à-dire "état") en facteur et envisagez de marquer le message de @ xing ci-dessous comme réponse.
verdâtre

Réponses:


13

J'ai rencontré un problème similaire, et je l'ai résolu en transférant les valeurs de classe ("statut" dans votre cas) en type de facteur. Après utilisation data$status=factor(data$status), newDataimprime comme suit:

     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

Aucune erreur!


Dommage qu'il ne soit pas mentionné dans la SMOTEdocumentation qu'il ne fonctionne que si les étiquettes sont facteur!
Pop

C'était tout pour moi. la conversion en facteur l'a corrigé.
2017 verdâtre
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.