La décision de scikit-learn Ceci est une entrée sur la façon de visualiser un modèle d'un système arborescent. Je l'utilise beaucoup ces jours-ci, donc je vais l'écrire à la place d'un mémorandum et de mon aide-mémoire. Dans cette entrée, l'exemple de code est généré avec la version Windows de Python 3.5.2.
Les composants nécessaires pour visualiser l'arbre de décision sont:
La méthode d'installation de Graphviz diffère selon le système d'exploitation. Je pense que scikit-learn est souvent inclus par défaut. D'autre part, pydotplus devra être installé avec pip.
Graphviz est l'acronyme de Graph Visualization Software. C'est une bibliothèque qui transforme le contenu écrit en langage DOT en images. Veuillez lire ici pour plus de détails. http://www.graphviz.org/Documentation.php
La page de téléchargement est la suivante. --Version Windows http://www.graphviz.org/Download_windows.php --RHEL, version CentOS http://www.graphviz.org/Download_linux_rhel.php --versionubuntu http://www.graphviz.org/Download_linux_ubuntu.php --Version source http://www.graphviz.org/Download_source.php Puisqu'il sera installé dans un environnement Windows, téléchargez le fichier MSI à partir de la page suivante et exécutez-le. http://www.graphviz.org/Download_windows.php
Lorsque vous exécutez le fichier MSI téléchargé, l'écran suivant s'affiche en premier. Cliquez sur Suivant pour continuer avec l'écran.
La version au moment de la rédaction de l'entrée (2017/09/03) est 2.38. Ici, continuez avec "Tout le monde" sélectionné pour que tous les utilisateurs puissent l'utiliser.
Ce message vous informe que vous êtes prêt à installer. Appuyez sur "Suivant" pour continuer.
Au fur et à mesure que l'installation des composants progresse, l'indicateur de jauge se remplit. Cliquez sur Suivant lorsque les indicateurs sont complètement remplis.
L'installation de Graphviz s'est terminée avec succès. Cliquez sur Fermer pour fermer la fenêtre.
Ensuite, passez à l'installation de Pydotplus.
pydotplus Un module python pour travailler avec le langage DOt mentionné précédemment. Cette fois, c'est un environnement Windows, nous allons donc travailler avec Anaconda Prompt.
Après avoir démarré Anaconda Prompt, exécutez la commande "pip install pydotplus".
(C:\Program Files\Anaconda3) C:\Users\usr********>pip install pydotplus
Collecting pydotplus
Downloading pydotplus-2.0.2.tar.gz (278kB)
100% |################################| 286kB 860kB/s
Requirement already satisfied: pyparsing>=2.0.1 in c:\program files\anaconda3\li
b\site-packages (from pydotplus)
Building wheels for collected packages: pydotplus
Running setup.py bdist_wheel for pydotplus ... done
Stored in directory: C:\Users\usr********\AppData\Local\pip\Cache\wheels\43\31\
48\e1d60511537b50a8ec28b130566d2fbbe4ac302b0def4baa48
Successfully built pydotplus
Installing collected packages: pydotplus
Successfully installed pydotplus-2.0.2
En cas de succès, la sortie ci-dessus sera sortie. Si aucune erreur ne se produit et qu'elle n'est pas interrompue, le travail d'installation de pydotplus est terminé.
Modifiez ensuite les variables d'environnement pour que pydotplus connaisse le chemin d'installation de Graphviz. Tout d'abord, localisez le répertoire "bin" à l'emplacement où graphviz est installé. Vous pouvez le vérifier en regardant les propriétés de "gvedit.exe" dans la liste du menu démarrer.
Ajoutez ce chemin ("C: \ Program Files (x86) \ Graphviz2.38 / bin") au chemin de la variable d'environnement.
Après avoir modifié le chemin, redémarrez l'EDI Python (tel que PyCharm).
J'ai créé un modèle RandomForest en utilisant le jeu de données iris familier, j'ai sorti un modèle d'arbre de décision de ce modèle et je l'ai visualisé (= sortie sous forme d'image png). L'exemple de code est ci-dessous. L'instruction d'impression pour le débogage pour comprendre le traitement interne est laissée telle quelle.
u"""
Visualisez le modèle d'arbre de décision.
Visualisez un modèle d'arbre de décision à l'aide de Graphviz.
Elle peut être appliquée non seulement aux arbres de décision, mais également aux modèles de structure arborescente tels que les forêts aléatoires.
"""
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import train_test_split
from sklearn.model_selection import cross_val_score
#Packages nécessaires pour visualiser l'arborescence du modèle
from sklearn import tree
import pydotplus as pdp
import pandas as pd
import numpy as np
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
print(df.head(5))
print(iris.target)
print(iris.target_names)
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
print(df.head(5))
#Séparez les données d'entraînement et les données de test
features = df.columns[:4]
label = df["species"]
print(features)
print(label)
print(df[features].head(5))
df_train, df_test, label_train, label_test = train_test_split(df[features], label)
clf = RandomForestClassifier(n_estimators=150)
clf.fit(df_train, label_train)
print("========================================================")
print("Précision de la prédiction")
print(clf.score(df_test, label_test))
#Visualisez l'un des arbres pour essayer
estimators = clf.estimators_
file_name = "./tree_visualization.png "
dot_data = tree.export_graphviz(estimators[0], #Spécifiez un objet d'arbre de décision
out_file=None, #Étant donné que les données en langage à points sont transmises à Graphviz sans passer par un fichier, aucun
filled=True, #Lorsqu'il est défini sur True, il affichera en couleur le nœud le plus classé au moment de la création de branches.
rounded=True, #Lorsqu'il est défini sur True, les coins du nœud sont arrondis.
feature_names=features, #Si cela n'est pas spécifié, le nom du montant de la fonction ne sera pas affiché sur le graphique.
class_names=iris.target_names, #Si cela n'est pas spécifié, le nom de la classification ne sera pas affiché sur le graphique.
special_characters=True #Être capable de gérer les caractères spéciaux
)
graph = pdp.graph_from_dot_data(dot_data)
graph.write_png(file_name)
Jetons un coup d'œil à chaque partie. Voici la partie qui lit le jeu de données iris et prépare les données d'entraînement. Le nom de la fonction est défini dans iris.feature_names. La variable objectif (= type d'iris) est définie dans iris.target. Cependant, iris.target est un nombre et n'est pas facile à lire pour les humains. Par conséquent, en utilisant la notation de nom de genre dans iris.target_names, la variable objective qui est lisible par l'homme (= human-redable) est définie dans df ['species'].
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
print(df.head(5))
print(iris.target)
print(iris.target_names)
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
print(df.head(5))
Vient ensuite le code de la partie qui crée le modèle RandomForest. Le df qui stocke les données d'entraînement contient également la variable objectif. Il est nécessaire de séparer la partie de quantité de fonction et la variable d'objectif et de les saisir dans le modèle. Par conséquent, définissez la partie caractéristiques sur les fonctions et la variable objectif sur l'étiquette. Ensuite, train_test_split divise les données en données d'entraînement et de test de modèle. L'objet RandomForest est défini dans clf. Le nombre d'arbres de décision à utiliser est de 150. (Argument: n_estimator = 150) Après cela, spécifiez les données d'entraînement et entraînez le modèle avec la méthode fit ().
features = df.columns[:4]
label = df["species"]
print(features)
print(label)
print(df[features].head(5))
df_train, df_test, label_train, label_test = train_test_split(df[features], label)
clf = RandomForestClassifier(n_estimators=150)
clf.fit(df_train, label_train)
Et enfin la visualisation. L'objet RandomForest a une propriété appelée estimators_. estimators_ est une liste d'objets d'arbre de décision. Ici, nous allons visualiser le premier objet de l'arbre de décision (estimateurs [0]) sous forme d'échantillon. Sortie sous forme de fichier image png "tree_visualization.png ". tree.export_graphviz () effectue le processus de visualisation. L'explication de l'argument est décrite dans le commentaire du code. ** Veuillez noter que si vous ne spécifiez pas correctement l'argument, ni le nom de la quantité de caractéristiques ni le nom de la classification ne seront affichés. ** **
#Visualisez l'un des arbres pour essayer
estimators = clf.estimators_
file_name = "./tree_visualization.png "
dot_data = tree.export_graphviz(estimators[0], #Spécifiez un objet d'arbre de décision
out_file=None, #Étant donné que les données en langage à points sont transmises à Graphviz sans passer par un fichier, aucun
filled=True, #Lorsqu'il est défini sur True, il affichera en couleur le nœud le plus classé au moment de la création de branches.
rounded=True, #Lorsqu'il est défini sur True, les coins du nœud sont arrondis.
feature_names=features, #Si cela n'est pas spécifié, le nom de la quantité de fonction ne sera pas affiché sur le graphique.
class_names=iris.target_names, #Si cela n'est pas spécifié, le nom de la classification ne sera pas affiché sur le graphique.
special_characters=True #Être capable de gérer les caractères spéciaux
)
graph = pdp.graph_from_dot_data(dot_data)
graph.write_png(file_name)
Ensuite, la visualisation suivante de l'arbre de décision sera obtenue sous forme d'image png.