.. _decisiontreevisualizationrst: =============================== Visualiser un arbre de décision =============================== .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`PDF `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/astuces/decision_tree_visualization.ipynb|*` Les arbres de décision sont des modèles intéressants car ils peuvent être interprétés. Encore faut-il pouvoir les voir. .. code:: ipython3 from sklearn import datasets iris = datasets.load_iris() X = iris.data[:, :2] # we only take the first two features. y = iris.target .. code:: ipython3 from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier() clf.fit(X, y) .. parsed-literal:: DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=None, splitter='best') `scikit-learn `__ implémente une méthode qui permet d’exporter de graphe au format `DOT `__ : `export_graphviz `__. Ce graphe peut être visualiser avec l’outil `graphviz `__ ou des modules comme `pydot `__ mais cela passe par l’installation `graphviz `__. .. code:: ipython3 from sklearn.tree import export_graphviz dot = export_graphviz(clf, out_file=None) print("\n".join(dot.split('\n')[:10]) + "\n...") .. parsed-literal:: digraph Tree { node [shape=box] ; 0 [label="X[0] <= 5.45\ngini = 0.667\nsamples = 150\nvalue = [50, 50, 50]"] ; 1 [label="X[1] <= 2.8\ngini = 0.237\nsamples = 52\nvalue = [45, 6, 1]"] ; 0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ; 2 [label="X[0] <= 4.7\ngini = 0.449\nsamples = 7\nvalue = [1, 5, 1]"] ; 1 -> 2 ; 3 [label="gini = 0.0\nsamples = 1\nvalue = [1, 0, 0]"] ; 2 -> 3 ; 4 [label="X[0] <= 4.95\ngini = 0.278\nsamples = 6\nvalue = [0, 5, 1]"] ; ... La libraire `viz.js `__ est une version javascript de `graphviz `__. Avec un wrapper disponible `RenderJsDot `__, cela devient : .. code:: ipython3 from jyquickhelper import RenderJsDot RenderJsDot(dot) .. raw:: html
C’est encore lisible mais cela risque de ne plus le devenir pour de gros arbres. On utilise alors la librairie `vis.js `__ et le wrapper `RenderJsVis `__. .. code:: ipython3 from jyquickhelper import RenderJsVis RenderJsVis(dot=dot, height="400px", layout='hierarchical') .. raw:: html