2016-09-19 5 views
1

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: enter image description here

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.

Antwort

1

Dies ist eigentlich ein vollkommen gültiger Ansatz und sollte Ihrer Modellleistung nicht abträglich sein. Es macht das Modell ein wenig schwer zu lesen. Eine nette Ansatz ist pd.get_dummies, da dies zu verwenden kümmern sich um die Modellnamen für Sie:

import pandas as pd 
df = pd.DataFrame({'colors':colors}) 
df_encoded = pd.get_dummies(df) 
dt.fit(df_encoded, sizes) 

with open("dt.dot", 'w') as f: 
    export_graphviz(dt, out_file=f, 
        feature_names=df_encoded.columns) 

command = ["dot", "-Tpng", "dt.dot", "-o", "dt.png"] 
subprocess.check_call(command) 

enter image description here

+0

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

+0

Ich wollte sagen, dass die Reihenfolge beibehalten wird, während die Teilung für den Baum gewählt wird. – user1700890

+0

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

Verwandte Themen