web-dev-qa-db-de.com

Entscheidungsbaum in Scikit-Learn visualisieren

Ich versuche, einen einfachen Decision Tree mit Scikit-Learn in Python zu entwerfen (ich verwende Anaconda Ipython Notebook mit Python 2.7.3 unter Windows) und visualisiere es wie folgt:

from pandas import read_csv, DataFrame
from sklearn import tree
from os import system

data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]

dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)

dotfile = open("D:/dtree2.dot", 'w')
dotfile = tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
system("dot -Tpng D:.dot -o D:/dtree2.png")

Ich erhalte jedoch die folgende Fehlermeldung:

AttributeError: 'NoneType' object has no attribute 'close'

Ich verwende den folgenden Blogbeitrag als Referenz: Blogpost-Link

Die folgende Stackoverflow-Frage scheint für mich auch nicht zu funktionieren: Frage

Könnte mir jemand helfen, wie ich den Entscheidungsbaum in Scikit-Learn visualisieren kann?

27
Ravi

sklearn.tree.export_graphviz gibt nichts zurück und standardmäßig None.

Mit dotfile = tree.export_graphviz(...) überschreiben Sie Ihr offenes Dateiobjekt, das dotfile zuvor zugewiesen wurde. Sie erhalten also eine Fehlermeldung, wenn Sie versuchen, die Datei zu schließen (da sie jetzt None ist).

Um dies zu beheben, ändern Sie Ihren Code in

...
dotfile = open("D:/dtree2.dot", 'w')
tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
...
20
Ffisegydd

Hier ist ein Liner für diejenigen, die jupyter und sklearn (18.2+) verwenden. Dazu benötigen Sie nicht einmal matplotlib. Einzige Voraussetzung ist graphviz

pip install graphviz

als ausführen (gemäß Code in Frage X ist ein Pandas DataFrame)

from graphviz import Source
from sklearn import tree
Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))

Dadurch wird es im SVG-Format angezeigt. Der obige Code erzeugt das Source object von Graphviz ( source_code - nicht unheimlich). 

Einige Dinge, die Sie wahrscheinlich damit anfangen werden

Zeigen Sie es in Jupter an:

from IPython.display import SVG
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
SVG(graph.pipe(format='svg'))

Speichern als PNG:

graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
graph.format = 'png'
graph.render('dtree_render',view=True)

Holen Sie sich das PNG-Bild, speichern Sie es und zeigen Sie es an:

graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
png_bytes = graph.pipe(format='png')
with open('dtree_pipe.png','wb') as f:
    f.write(png_bytes)

from IPython.display import Image
Image(png_bytes)

Wenn Sie mit dieser Bibliothek spielen, finden Sie hier die Links zu Beispielen und Userguide

20
singer

Wenn wie bei mir ein Problem bei der Installation von graphviz auftritt, können Sie den Baum anhand von visualisieren

  1. exportieren mit export_graphviz wie in den vorherigen Antworten gezeigt
  2. Öffnen Sie die .dot-Datei in einem Texteditor
  3. Kopieren Sie den Code und fügen Sie ihn ein @ webgraphviz.com
17
FrancoisHawaii

Alternativ können Sie versuchen, pydot zum Erstellen der PNG-Datei aus Punkt zu verwenden:

...
tree.export_graphviz(dtreg, out_file='tree.dot') #produces dot file

import pydot
dotfile = StringIO()
tree.export_graphviz(dtreg, out_file=dotfile)
pydot.graph_from_dot_data(dotfile.getvalue()).write_png("dtree2.png")
...
8
CSquare

Sie können den Inhalt der export_graphviz-Datei kopieren und auf der Site webgraphviz.com einfügen. 

Weitere Informationen finden Sie im Artikel How to visualisieren Sie den Entscheidungsbaum in Python mit graphviz

2

Wenn Sie Probleme mit dem direkten Zugriff auf die Quelldatei haben, können Sie Source.from_file auch folgendermaßen verwenden:

from graphviz import Source
from sklearn import tree
tree.export_graphviz(dtreg, out_file='tree.dot', feature_names=X.columns)
Source.from_file('tree.dot')
0
louis_guitton

Das folgende funktioniert auch gut:

from sklearn.datasets import load_iris
iris = load_iris()

# Model (can also use single decision tree)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=10)

# Train
model.fit(iris.data, iris.target)
# Extract single tree
estimator = model.estimators_[5]

from sklearn.tree import export_graphviz
# Export as dot file
export_graphviz(estimator, out_file='tree.dot', 
                feature_names = iris.feature_names,
                class_names = iris.target_names,
                rounded = True, proportion = False, 
                precision = 2, filled = True)

# Convert to png using system command (requires Graphviz)
from subprocess import call
call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])

# Display in jupyter notebook
from IPython.display import Image
Image(filename = 'tree.png')

enter image description here

Die Quelle finden Sie hier

0
Jeril

Ich kopiere und ändere einen Teil Ihres Codes wie folgt:

from pandas import read_csv, DataFrame
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from os import system

data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]

dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)

Nachdem Sie sichergestellt haben, dass Sie über dtree verfügen, was bedeutet, dass der obige Code gut ausgeführt wird, fügen Sie den folgenden Code hinzu, um den Entscheidungsbaum zu visualisieren:

Denken Sie daran, zuerst graphviz zu installieren: pip install graphviz 

import graphviz 
from graphviz import Source
dot_data = tree.export_graphviz(dtree, out_file=None, feature_names=X.columns)
graph = graphviz.Source(dot_data) 
graph.render("name of file",view = True)

Ich habe es mit meinen Daten versucht, die Visualisierung funktionierte gut und ich bekam sofort eine PDF-Datei.

0
vuminh91

Einfacher Weg hier mit pydotplus (graphviz muss installiert sein):

from IPython.display import Image  
from sklearn import tree
import pydotplus # installing pyparsing maybe needed

...

dot_data = tree.export_graphviz(best_model, out_file=None, feature_names = X.columns)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
0
Alexey Shrub