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.