SMOTE löst einen Fehler für ein Ungleichgewichtsproblem mit mehreren Klassen aus

9

Ich versuche, SMOTE zu verwenden, um das Ungleichgewicht in meinem Klassifizierungsproblem für mehrere Klassen zu korrigieren. Obwohl SMOTE gemäß dem SMOTE-Hilfedokument perfekt für das Iris-Dataset funktioniert, funktioniert es für ein ähnliches Dataset nicht. So sehen meine Daten aus. Beachten Sie, dass es drei Klassen mit den Werten 1, 2, 3 gibt.

> 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

Es hat die Form eines Datenrahmens, genau wie Iris:

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

Hier ist mein Code mit SMOTE und der Fehler, den er auslöst:

> 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
bräunen
quelle
Bitte versuchen Sie, Ihre Zielspalte (dh "Status") in einen Faktor umzuwandeln, und erwägen Sie, den folgenden Beitrag von @ xing als Antwort zu markieren.
Grünlich

Antworten:

13

Ich bin auf ein ähnliches Problem gestoßen und habe es gelöst, indem ich die Klassenwerte (in Ihrem Fall "Status") in den Faktortyp übertragen habe. Nach der Verwendung data$status=factor(data$status), newDatadruckt wie folgt:

     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

Keine Fehler!

xing
quelle
Schade, dass in der SMOTEDokumentation nicht erwähnt wird, dass es nur funktioniert, wenn die Etiketten ein Faktor sind!
Pop
Das war es für mich. Umrechnung in Faktor behoben.
Grünlich