Rs randomForest kann nicht mehr als 32 Level verarbeiten. Was ist eine Problemumgehung?

22

Das randomForest-Paket von R kann nicht mit Faktoren mit mehr als 32 Ebenen umgehen. Bei mehr als 32 Ebenen wird eine Fehlermeldung ausgegeben:

Kann keine kategorialen Prädiktoren mit mehr als 32 Kategorien verarbeiten.

Aber die Daten, die ich habe, haben mehrere Faktoren. Einige von ihnen haben 1000+ Levels und einige von ihnen haben 100+. Es hat sogar "Staat" der Vereinigten Staaten, die 52 ist.

Also, hier ist meine Frage.

  1. Warum gibt es eine solche Einschränkung? randomForest weigert sich, auch für den einfachen Fall auszuführen.

    > d <- data.frame(x=factor(1:50), y=1:50)
    > randomForest(y ~ x, data=d)
      Error in randomForest.default(m, y, ...) : 
      Can not handle categorical predictors with more than 32 categories.
    

    Wie kann der randomForeestRegressor von scikit learn mit mehr als 32 Ebenen ausgeführt werden, wenn der Arbeitsspeicher begrenzt ist?

  2. Was ist der beste Weg, um mit diesem Problem umzugehen? Angenommen, ich habe X1, X2, ..., X50 unabhängige Variablen und Y ist abhängige Variable. Angenommen, X1, X2 und X3 haben mehr als 32 Ebenen. Was sollte ich tun?

    Was ich denke, ist Clustering-Algorithmus für jedes von X1, X2 und X3, wobei Abstand als Differenz in Y definiert ist. Ich werde drei Clustering ausführen, da es drei problematische Variablen gibt. Und ich wünschte, ich könnte in jedem Cluster ähnliche Ebenen finden. Und ich werde sie zusammenführen.

    Wie hört sich das an?

Minkoo Seo
quelle
Das Durchsuchen des Webs mit dem Paketnamen und der Fehlermeldung bietet einige Antworten.
Roland
5
@ Roland Eigentlich hat es mich hierher geführt ...
Isomorphismen
1
Sie können die Datenwissenschaft selbst ausprobieren, da mehrere statistische Köpfe Erfahrung mit der Programmierung von Daten mit vielen Dimensionen haben.
aeroNotAuto
2
UPDATE: Seit Version 4.6-9 randomForestkönnen kategoriale Prädiktoren mit bis zu 53 Ebenen verarbeitet werden. Nachrichten
Ben
Wie bestimmt die zufällige Gesamtstruktur von R die Anzahl der Ebenen? Ich denke Level bedeutet Kategorien.
26.

Antworten:

25

Es ist tatsächlich eine ziemlich vernünftige Einschränkung, da eine Aufteilung auf einen Faktor mit Pegeln tatsächlich eine Auswahl einer der möglichen Kombinationen ist. Selbst mit wie 25 ist der Kombinationsraum so groß, dass eine solche Folgerung nur einen geringen Sinn ergibt.N2N-2N

Die meisten anderen Implementierungen behandeln Faktor einfach als Ordnungszahl (dh Ganzzahlen von 1 bis ), und dies ist eine Option, mit der Sie dieses Problem lösen können. Tatsächlich ist RF oft klug genug, dies in willkürliche Gruppen mit mehreren Teilungen aufzuteilen.N

Die andere Möglichkeit besteht darin, die Darstellung zu ändern - möglicherweise hängt Ihr Ergebnis nicht direkt von der staatlichen Einheit ab, sondern beispielsweise von der Fläche, der Bevölkerung, der Anzahl der Kiefern pro Kopf oder anderen Attributen, die Sie stattdessen in Ihr Informationssystem einbinden können.

Es kann auch sein, dass jeder Staat eine so isolierte und nicht korrelierte Einheit ist, dass er für sich ein separates Modell benötigt.

Clustering basierend auf einer Entscheidung ist wahrscheinlich eine schlechte Idee, da Sie auf diese Weise Informationen aus der Entscheidung in Attribute schmuggeln, was häufig zu einer Überanpassung führt.


quelle
4
Es kann leicht bewegt werden, wenn auch auf etwas mühsame Weise. Wenn Sie beispielsweise zwischen 33 und 1024 Ebenen haben, erstellen Sie zwei Faktoren mit jeweils <= 32 Ebenen.
KalEl
15

Der Hauptgrund ist, wie randomForest implementiert wird. Die Implementierung von R folgt weitgehend den ursprünglichen Spezifikationen von Breiman. Was hier zu beachten ist, ist, dass für faktorielle / kategoriale Variablen das Teilungskriterium binär ist, wobei einige Beschriftungswerte links und die restlichen Beschriftungswerte rechts angezeigt werden.

Das heißt, es wird nach allen Kombinationen von Gruppierungsbezeichnungswerten in zwei Gruppen gesucht. Wenn Sie die linke Gruppe mit und die rechte Gruppe mit und für jedes Etikett eine Ziffer aufzählen, erhalten Sie eine Zahl im Bereich , was aus rechnerischer Sicht unzulässig ist .01[0;2M-1]

Warum funktionieren die Implementierungen von Weka und Python?

Die weka-Implementierung verwendet standardmäßig keine CART-Bäume. Es werden C45-Bäume verwendet, die dieses Berechnungsproblem nicht aufweisen, da sie für kategoriale Eingaben in mehrere Knoten aufgeteilt werden, einen für jeden Ebenenwert.

Die Implementierung der zufälligen Python-Gesamtstruktur kann keine kategorialen / Faktor-Variablen verwenden. Sie müssen diese Variablen in Dummy- oder numerische Variablen codieren.

Bei anderen Implementierungen sind möglicherweise mehrere Ebenen zulässig (einschließlich weka hier), da sie, selbst wenn sie CART verwenden, nicht unbedingt Twoing implementieren. Das heißt, sie ermöglichen es, die beste Aufteilung für eine Faktorvariable zu finden, indem nur eine Beschriftung gegen alle anderen Werte gruppiert wird. Dies erfordert bei weitem weniger Berechnung, da nur Teilungspunkte geprüft werden müssen.M

rapaio
quelle
2
Vielen Dank! Ergibt sich aus Ihrer Antwort, dass die Implementierung von R für die Behandlung von kategorialen Werten der von Python überlegen ist (ich erinnere mich, dass Max Kuhn erwähnt hat, dass das Gruppieren von kategorialen Variablen für RF geringfügig bessere Ergebnisse liefert als das Dummifizieren), oder zumindest, dass Random Forest in R vs ausgeführt wird Python Ich habe eine sehr gute Chance auf unterschiedliche Ergebnisse (Genauigkeiten etc ...)? Ist es Ihrer Erfahrung nach sinnvoll, beim Modellieren beide Gruppierungsvariablen (in R) zu versuchen und sie zu dummifizieren und dann zwei Ansätze zu vergleichen?
Sergey Bushmanov
2
Die Dummy-Codierung funktioniert, kann jedoch nur eine Kategorie gegen alle erzeugen. Nach der Codierung werden die Variablen einzeln getestet. Es ist also unmöglich, Twoing zu implementieren. Wenn diese Funktion helfen kann, gibt es meiner Meinung nach praktisch keine großen Unterschiede. Es gibt jedoch noch andere Dinge, die bei der Arbeit mit variabler Wichtigkeit Aufmerksamkeit erfordern könnten: Einige Implementierungen sind auf kategorial mit mehreren Ebenen ausgerichtet. Weitere Informationen finden Sie in den Beiträgen von Carolin Strobl: statistik.uni-dortmund.de/useR-2008/slides/Strobl+Zeileis.pdf . In R gibt es einige Implementierungen, die diese Vorspannung nicht haben.
Rapaio
2

Sie könnten versuchen, diese eine Spalte anders darzustellen. Sie könnten dieselben Daten wie einen Datenrahmen mit geringer Dichte darstellen.

Minimaler brauchbarer Code;

example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F"))
names(example) <- "strcol"

for(level in unique(example$strcol)){
      example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level,     1, 0)
}

Beachten Sie, dass jeder Wert in der ursprünglichen Spalte jetzt zu einer separaten Dummy-Spalte wird.

Ausführlicherer Beispielcode;

set.seed(0)
combs1 = sample.int(33, size= 10000, replace=TRUE)
combs2 = sample.int(33, size= 10000, replace=TRUE)
combs3 = combs1 * combs2 + rnorm(10000,mean=0,100)
df_hard = data.frame(y=combs3, first=factor(combs1), second=factor(combs2))

for(level in unique(df_hard$first)){
    df_hard[paste("first", level, sep = "_")] <- ifelse(df_hard$first == level, 1, 0)
}

for(level in unique(df_hard$second)){
    df_hard[paste("second", level, sep = "_")] <- ifelse(df_hard$second == level, 1, 0)
}

example$first <- NULL
example$second <- NULL

rf_mod = randomForest( y ~ ., data=example )

Obwohl dieser Code zeigt, dass Sie den Fehler tatsächlich nicht mehr erhalten, werden Sie feststellen, dass der randomForest-Algorithmus jetzt eine lange Zeit benötigt, bis er abgeschlossen ist. Dies ist auf eine CPU-Einschränkung zurückzuführen. Sie können diese Aufgabe jetzt auch durch Sampling reduzieren.

Weitere Informationen finden Sie in diesem Blogpost:

https://blog.cloudera.com/blog/2013/02/wie-sample-von-einem-großen-Datensatz-in-parallel-mit-r-on-hadoop/

Vincent Warmerdam
quelle
Der zweite Codeblock sieht verwirrend aus. Obwohl Sie df_hard im gesamten Text verwenden, setzen Sie in den letzten Zeilen "first" und "second" auf NULL und verwenden auch "example" als Daten für randomForest, für das dies keinen Sinn ergibt mir, da es keine verbindung zwischen beispiel und df_hard gibt.
Özgür,
Vincent, hast du nicht das Gefühl, dass ich am Ende so große Probleme haben werde, wenn ich Stufen in der Größenordnung von 100+ habe? Schlägst du vor, jede Spalte als Eingabe dem Zufall hinzuzufügen?
Hardik Gupta
Eine andere Alternative ist die Verwendung der Randomforest-Implementierung in H2O. Dies hat eine bessere Unterstützung für große Datensätze. Ich verstehe das Bit "Addiere jede Spalte als Eingabe zum Zufall" nicht.
Vincent Warmerdam
0

Sie können stattdessen das Paket extraTrees verwenden. Extrem randomisierter Gesamtstrukturalgorithmus versucht keinen Haltepunkt / Split, sondern nur eine begrenzte zufällige Teilmenge von Splits.

Soren Havelund Welling
quelle
1
extraTrees hat Einschränkungen, in dem Sinne, dass Ihre Eingabe eine numerische Datenmatrix sein muss, oder?
Hardik Gupta
0

Eine weitere Option: Abhängig von der Anzahl der Ebenen und der Anzahl der Beobachtungen in Ihren Daten können Sie einige Ebenen zusammenführen. Wenn Sie mit nur wenigen Beobachtungen viele Ebenen erreichen, kann dies die Varianz verringern. Hadley ‚s forcats: fct_lump dies tut.

Scott Kaiser
quelle