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?
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()
...
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
Si, comme moi, vous rencontrez un problème pour installer graphviz, vous pouvez visualiser l’arbre en
export_graphviz
comme indiqué dans les réponses précédentes.dot
dans un éditeur de texte.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")
...
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.
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')
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.