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?
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()
...
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
Wenn wie bei mir ein Problem bei der Installation von graphviz auftritt, können Sie den Baum anhand von visualisieren
export_graphviz
wie in den vorherigen Antworten gezeigt.dot
-Datei in einem TexteditorAlternativ 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")
...
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 .
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')
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')
Die Quelle finden Sie hier
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.
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())