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

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!


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.