Visualiser l'arbre de décision dans scikit-learn
j'essaie de concevoir un arbre de décision simple en utilisant scikit-learn en Python (j'utilise le Notebook Ipython D'Anaconda avec Python 2.7.3 sur Windows OS) et de le visualiser comme suit:
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")
Cependant, j'obtiens l'erreur suivante:
AttributeError: 'NoneType' object has no attribute 'close'
j'utilise le billet de blog suivant comme référence: lien du blog
stackoverflow question ne semble pas fonctionner pour moi aussi: Question
Quelqu'un pourrait-il m'aider à visualiser l'arbre décisionnel de scikit-learn?
6 réponses
sklearn.tree.export_graphviz
ne retourne rien, et donc, par défaut renvoie None
.
en faisant dotfile = tree.export_graphviz(...)
vous écrasez votre objet de fichier ouvert, qui avait été précédemment assigné à dotfile
, donc vous obtenez une erreur lorsque vous essayez de fermer le fichier (comme il est maintenant None
).
pour le corriger, changez votre code en
...
dotfile = open("D:/dtree2.dot", 'w')
tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
...
Si, comme moi, vous avez un problème d'installation de graphviz, vous pouvez visualiser l'arbre par
- exportation avec
export_graphviz
comme indiqué dans les réponses précédentes - ouvrir le
.dot
fichier dans un éditeur de texte - copier le morceau de code et le coller @ webgraphviz.com
voici un liner pour ceux qui utilisent jupyter et sklearn(18.2+) vous n'avez même pas besoin de matplotlib
pour cela. La seule exigence est graphviz
pip install graphviz
que de courir (selon le code en question X est une pandas DataFrame)
from graphviz import Source
from sklearn import tree
Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
cela l'affichera au format SVG. Le Code ci-dessus produit L'objet Source de Graphviz ( source_code - pas effrayant) qui serait rendu directement dans jupyter.
Certaines choses que vous êtes susceptible de faire avec elle
L'afficher dans jupter:
from IPython.display import SVG
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
SVG(graph.pipe(format='svg'))
Enregistrer en tant que fichiers png:
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
graph.format = 'png'
graph.render('dtree_render',view=True)
Obtenir l'image png, de l'enregistrer et de le voir:
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)
si vous allez jouer avec cette lib voici les liens vers exemples et userguide
Sinon, vous pouvez essayer d'utiliser pydot pour produire le fichier png à partir de dot:
...
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")
...
Vous pouvez copier le contenu de la export_graphviz fichier et vous pouvez coller le même dans le webgraphviz.com du site.
Vous pouvez consulter l'article sur la Façon de visualiser l'arbre de décision en Python avec graphviz pour plus d'informations.
Si vous rencontrez des problèmes avec l'accaparement de la source .dot directement vous pouvez également utiliser Source.from_file
comme ceci:
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')