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.