2016-07-27 9 views
0

ich den folgenden Code in einem ‚Text‘ binäres Klassifikationsproblem mit:export_graphviz und Visualisierung eines DT

def visualize_tree(tree,feature_names): 
    dot_data = StringIO() 
    export_graphviz(tree, 
        out_file=dot_data, 
        feature_names=feature_names, 
        special_characters=True)   
    graph = pydot.graph_from_dot_data(dot_data.getvalue(),) 
    graph.write_pdf("iris.pdf") 

vec = CountVectorizer(lowercase=True, tokenizer=tokens2, binary=True, ngram_range=(1,2)) 
x = vec.fit_transform(X_train) 
clf1 = DecisionTreeClassifier() 
clf1.fit(x, y_train)  
visualize_tree(clf1, vec.get_feature_names()) 

Wenn ich es verwenden ohnefeature_names=feature_names, es wird ein schöner Baum wie diese erzeugen: enter image description here

Allerdings, wenn ich feature_names=feature_names, fügen sie zusätzliche Details zu dem Baum hinzuzufügen, gibt es mir den folgenden ‚semi Baum‘ !:

enter image description here Alles in einer Zeile ohne Pfeile! Irgendeine Idee warum? Gibt es alternative Möglichkeiten, die ich ausprobieren kann?

+0

sehr seltsam, können Sie ein minimales Beispiel erstellen Wo passiert das? passiert es immer noch, wenn Sie in DecisionTreeClassifier 'max_depth = 2' setzen? – maxymoo

+0

Es erstellt keinen Baum, auch wenn ich Max_depth = 2 im DecisionTreeClassifier gesetzt habe! – Ophilia

+0

können Sie versuchen, 'out_file = 'tree.dot'' zu ändern und dann die PDF-Datei über die Befehlszeile mit' 'dot -Tpdf tree.dot -o tree.pdf'' zu generieren? – maxymoo

Antwort

1

Anstatt pydot verwenden, können Sie nur graphviz über die Befehlszeile verwenden, wenn Sie sein Phantasie wollen Sie es von Ihrem Code mit subprocess anrufen:

import subprocess 

export_graphviz(model, 
       out_file='tree.dot', 
       feature_names=feature_names) 

subprocess.call(['dot', '-Tpdf', 'tree.dot', '-o' 'tree.pdf']) 
Verwandte Themen