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.
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?
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?
quelle
randomForest
können kategoriale Prädiktoren mit bis zu 53 Ebenen verarbeitet werden. NachrichtenAntworten:
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.N 2N- 2 N
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
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 .0 1 [ 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
quelle
Sie könnten versuchen, diese eine Spalte anders darzustellen. Sie könnten dieselben Daten wie einen Datenrahmen mit geringer Dichte darstellen.
Minimaler brauchbarer Code;
Beachten Sie, dass jeder Wert in der ursprünglichen Spalte jetzt zu einer separaten Dummy-Spalte wird.
Ausführlicherer Beispielcode;
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/
quelle
Sie können stattdessen das Paket extraTrees verwenden. Extrem randomisierter Gesamtstrukturalgorithmus versucht keinen Haltepunkt / Split, sondern nur eine begrenzte zufällige Teilmenge von Splits.
quelle
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.
quelle