Best Practices für die Codierung kategorialer Funktionen für Entscheidungsbäume?

13

Bei der Codierung kategorialer Merkmale für die lineare Regression gilt die Regel: Die Anzahl der Dummies sollte eins weniger sein als die Gesamtzahl der Ebenen (um Kollinearität zu vermeiden).

Gibt es eine ähnliche Regel für Entscheidungsbäume (eingesackt, verstärkt)? Ich frage dies, weil eine Standardpraxis in Python darin zu bestehen scheint, nEbenen in nDummies (sklearns ' OneHotEncoderoder Pandas' pd.get_dummies) zu erweitern, was mir suboptimal erscheint.

Was würden Sie als Best Practices für die Codierung kategorialer Funktionen für Entscheidungsbäume vorschlagen?

Sergey Bushmanov
quelle

Antworten:

12

Es scheint, als ob Sie verstehen, dass Sie nEbenen haben können, im Gegensatz zu n-1, weil Sie sich im Gegensatz zur linearen Regression keine Sorgen um die perfekte Kolinearität machen müssen.

(Ich komme aus einer R-Perspektive, aber ich gehe davon aus, dass es in Python dasselbe ist.) Das hängt von ein paar Dingen ab, wie 1) welches Paket Sie verwenden und 2) wie viele Faktorstufen Sie haben.

1) Wenn Sie das randomForestPaket von R verwenden und dann <33 Faktorstufen haben, können Sie diese in einer Funktion belassen, wenn Sie möchten. Dies liegt daran, dass in der zufälligen Gesamtstrukturimplementierung von R überprüft wird, welche Faktorstufen auf einer Seite der Aufteilung und welche auf der anderen Seite liegen sollten (z. B. können 5 Ihrer Ebenen auf der linken Seite zusammengefasst und 7 gruppiert sein zusammen rechts). Wenn Sie das kategoriale Feature in nDummies aufteilen , steht dem Algorithmus diese Option nicht zur Verfügung.

Wenn das von Ihnen verwendete Paket keine kategorialen Funktionen verarbeiten kann, müssen Sie natürlich nur nDummy-Variablen erstellen .

2) Wie oben erwähnt, kann die zufällige Gesamtstrukturimplementierung von R nur 32 Faktorstufen verarbeiten. Wenn Sie mehr als diese haben, müssen Sie entweder Ihre Faktoren in kleinere Teilmengen aufteilen oder für jede Ebene eine Dummy-Variable erstellen.

Tchotchke
quelle
1
Vielen Dank! Verstehe ich Sie richtig: Wenn ich nicht in R modelliere, wo kategoriale Features in randomForestautomatisch codiert werden, sollte ich mich für nDummies entscheiden, da Kollinearität für RF kein Problem darstellt.
Sergey Bushmanov
3
Mehr als 32-stufige binär codierte Kategorien haben ein leicht unterschiedliches Verhalten im Baum, da RF nur aus diesen binären Spalten auswählt, anstatt die einzelne Spalte des Faktors mit vielen Ebenen auszuwählen. Dieser subtile Unterschied bedeutet, dass die Aufteilung in die Binärspalten weniger informativ ist als die Aufteilung in die Faktorspalte, da es nur eine Wahl (0/1) gegenüber (1 / {2,3}, {2,1} / 3 gibt ) etc.
Sycorax sagt Reinstate Monica
@ user777 Es ist kein Problem, über 32 Variablen zu haben. Es ist ein Problem, in Python keine "gruppierten" Kategorievariablen zu haben sklearn... Praktisch gibt es Hinweise (praktische Erfahrung, Forschung usw.), dass "dummisierte" Variablen schlechter abschneiden als "gruppierte" kategoriale Variablen [in R]
Sergey Bushmanov
1
Theoretisch könnten wir erwarten, dass die Nicht-Gruppe etwas schlechter abschneidet, da Sie dem Modell weniger Flexibilität geben. Wenn es im gruppierten Fall wirklich besser wäre, dieses Feature als nicht gruppiert zu behandeln, wäre das Modell in der Lage, dies zu tun (indem eine Gruppe auf die eine und der Rest auf die andere Seite gelegt wird). In der Praxis wäre ich jedoch überrascht, wenn es große Unterschiede gäbe (insbesondere im Fall von RF, wo Sie so viele Bäume erstellen)
Tchotchke
2
Ich finde die randomForest-Implementierung, die Features mit vielen Faktorstufen (> 15) verwendet, wie erwähnt langsam, aber auch, um eine mittelmäßige Modellleistung zu erzielen. Ich denke, eine sehr hohe Anzahl möglicher Teilungen wird die beabsichtigte Dekorrelation der Bäume im Ensemble verringern. extraTrees und Rborist versuchen nur eine Teilstichprobe von katagorischen Teilungen in jedem Knoten. Das kann zur Dekorrelation und sicherlich zur Geschwindigkeit beitragen. Somit ist eine Reihe von Lösungen zwischen "randomForest try any split" und "sklern dummy-variable only try 1-vs-rest split" möglich. Auch unterschiedliche Cluster der vielen Ebenen in weniger Ebenen können sich als nützlich erweisen.
Soren Havelund Welling
4

Es gibt einen anderen Ansatz für den Umgang mit kategorialen Variablen, der als Ziel- / Auswirkungscodierung bezeichnet wird.

In diesem Schema besteht die Idee darin, das Feature mithilfe einer einzelnen Float-Spalte zu codieren, in der der Wert der Durchschnitt der Zielvariablen über alle Zeilen ist, die die Kategorie gemeinsam nutzen. Dies ist besonders nützlich für baumbasierte Modelle, da es eine Ordnungsbeziehung innerhalb des Features auferlegt (dh Werte rechts von der Kategorie haben eine höhere mittlere Antwort als Werte links) und es einfacher macht, den Prädiktorraum aufzuteilen.

Hier ist eine nette Erklärung des Themas:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

Und hier ist ein Link zu dem Artikel, der ursprünglich die Codierung vorgeschlagen hat: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

Es gibt einige weitere Details, um eine Schätzung des Mittelwerts in Kategorien mit niedrigen Zählwerten zu vermeiden, und es gibt auch ein anderes Modell, CatBoost, das eine Lösung für die durch diese Codierung eingeführte Verzerrung vorschlägt. Nach meiner Erfahrung ist dies jedoch eine einfache und sehr nützliche Methode, um kategoriale Variablen mit hoher Kardinalität zu codieren .

Ludecan
quelle