Hier ist mein Code:scikit Entscheidungsbaum und Splits für kategorische Variablen
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn import preprocessing
import os
import subprocess
def categorical_split():
colors = ['blue', 'green', 'yellow', 'green', 'red']
sizes = ['small', 'large', 'medium', 'large', 'small']
size_encoder = preprocessing.LabelEncoder()
sizes = size_encoder.fit_transform(sizes).reshape(-1, 1)
color_encoder = preprocessing.LabelEncoder()
colors = size_encoder.fit_transform(colors).reshape(-1, 1)
dt = DecisionTreeClassifier(random_state=99)
dt.fit(colors, sizes)
with open("dt.dot", 'w') as f:
export_graphviz(dt, out_file=f,
feature_names='colors')
command = ["dot", "-Tpng", "dt.dot", "-o", "dt.png"]
subprocess.check_call(command)
categorical_split()
Es generiert den folgenden Entscheidungsbaum:
Seit Entscheidungsbaum in Scikit-Learn kann kategorische Variablen direkt nicht umgehen, ich musste LabelEncoder verwenden. In der Grafik sehen wir Splits wie c<=1.5
. Diese Art von Split zeigt an, dass kategoriale Variablen wie ordinale Variablen behandelt werden und Split die Reihenfolge erhält. Wenn meine Daten nicht geordnet sind, ist diese Art von Ansatz schädlich. Ist es da rum? Wenn Sie vorhaben, One-Hot-Encoding vorzuschlagen, können Sie bitte ein Beispiel (Code) angeben, wie es helfen soll.
Vielen Dank für Ihre Antwort! Stimmen Sie meiner Vermutung zu, dass scikit-learn kategorische Variablen als Ordnungszahl behandelt und die Ordnung bei der Konstruktion des Baums erhält? – user1700890
Ich wollte sagen, dass die Reihenfolge beibehalten wird, während die Teilung für den Baum gewählt wird. – user1700890
vielleicht, ich denke, mein Punkt ist, dass jeder kategorische Wert allein durch ein Paar von Ungleichungen isoliert werden kann. Sie erhalten keine Gruppierungen Ihrer kategorialen Variablen, so dass Ihr Baum mehr Blätter hat, als Sie mit der Gruppierung benötigen würden, aber Sie bekommen dies auch nicht mit einer einzigen heißen Kodierung ... es ist nur eine unglückliche Schwäche der Tatsache, dass scikit learn behandelt kategoriale Variablen nicht richtig – maxymoo