web-dev-qa-db-fra.com

Visualisation de l'arbre de décision dans scikit-learn

J'essaie de concevoir un simple arbre de décision à l'aide de scikit-learn en Python (j'utilise Ipython Notebook d'Anaconda avec Python 2.7.3 sous Windows) et le visualise 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 Blogpost

La question de stackoverflow suivante ne semble pas également fonctionner pour moi: Question

Quelqu'un pourrait-il m'aider à visualiser l'arborescence de décision dans scikit-learn?

27
Ravi

sklearn.tree.export_graphviz ne retourne rien et renvoie donc par défaut None.

En faisant dotfile = tree.export_graphviz(...), vous écrasez votre objet de fichier ouvert, qui avait été précédemment affecté à dotfile. Vous obtenez donc une erreur lorsque vous essayez de fermer le fichier (car il est maintenant None).

Pour résoudre ce problème, changez votre code en

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

Voici une couche 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 run (selon le code en question, X est un 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 Source object ( code_source - pas effrayant) de Graphviz qui serait rendu directement dans jupyter. 

Certaines choses que vous êtes susceptible de faire avec

Affichez-le 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 au format png:

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

Obtenez l'image png, enregistrez-la et affichez-la:

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 guide utilisateur

20
singer

Si, comme moi, vous rencontrez un problème pour installer graphviz, vous pouvez visualiser l’arbre en

  1. l'exporter avec export_graphviz comme indiqué dans les réponses précédentes
  2. Ouvrez le fichier .dot dans un éditeur de texte.
  3. Copiez le morceau de code et collez-le @ webgraphviz.com
17
FrancoisHawaii

Vous pouvez également utiliser pydot pour produire le fichier png à partir de point:

...
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

Vous pouvez copier le contenu du fichier export_graphviz et le coller dans le site webgraphviz.com

Vous pouvez consulter l'article sur Comment visualiser l'arbre de décision en Python avec graphviz pour plus d'informations. 

2
saimadhu.polamuri

Si vous rencontrez des problèmes pour récupérer directement le fichier source .dot, 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
louis_guitton

Je copie et change une partie de votre code comme ci-dessous:

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)

Après vous être assuré que vous avez dtree, ce qui signifie que le code ci-dessus fonctionne correctement, vous ajoutez le code ci-dessous pour visualiser l’arbre de décision:

N'oubliez pas d'installer graphviz en premier: 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)

J'ai essayé avec mes données, la visualisation a bien fonctionné et j'ai immédiatement visualisé un fichier PDF.

0
vuminh91