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?

21
demandé sur Community 2015-01-07 14:03:29

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()
...
15
répondu Ffisegydd 2015-01-07 11:13:04

Si, comme moi, vous avez un problème d'installation de graphviz, vous pouvez visualiser l'arbre par

  1. exportation avec export_graphviz comme indiqué dans les réponses précédentes
  2. ouvrir le .dot fichier dans un éditeur de texte
  3. copier le morceau de code et le coller @ webgraphviz.com
17
répondu FrancoisHawaii 2017-01-11 23:34:02

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

14
répondu singer 2018-01-19 12:48:40

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")
...
8
répondu CSquare 2015-01-23 10:06:59

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.

2
répondu saimadhu.polamuri 2017-04-25 18:28:08

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')
0
répondu louis_guitton 2018-09-24 10:07:59