[PYTHON] J'ai essayé de visualiser tous les arbres de décision de la forêt aléatoire avec SVG

Aperçu

J'ai essayé de résumer comment générer plusieurs arbres de décision RF dans un fichier SVG en utilisant dtreeviz et svgutils.

Sélectionnez et affichez n'importe quel modèle de RF

J'ai utilisé le lien ci-dessous tel quel et l'ai exécuté pour le moment. [Essayez dtreeviz pour RandomForest](https://qiita.com/go50/item![Layout design.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/ 0/465379 / d58f187f-3c25-82d6-e904-47dfc64147af.png) s/38c7757b444db3867b17)

from sklearn.datasets import load_iris
from sklearn import tree
from dtreeviz.trees import dtreeviz
from sklearn.ensemble import RandomForestClassifier

iris = load_iris()
clf = RandomForestClassifier(n_estimators=100 , max_depth = 2)
clf.fit(iris.data, iris.target)

estimators = clf.estimators_
viz = dtreeviz(
    estimators[0],
    iris.data, 
    iris.target,
    target_name='variety',
    feature_names=iris.feature_names,
    class_names=[str(i) for i in iris.target_names],
) 
viz.view()

Random_forest_1.png

Le premier modèle des 100 arbres de décision peut être visualisé.

Enregistrer tous les modèles sous forme de fichiers SVG

Le programme ci-dessus générera un fichier svg avec un modèle. Par traitement en boucle, tous les arbres de décision contenus dans RF étaient sortis en SVG. (Utilisez viz.save () car il est difficile d'afficher les 100)

Importer tqdm

Il est utilisé pour mesurer le temps de traitement.

from tqdm import tqdm

Enregistrer tous les modèles

for estimator in tqdm(estimators):
    viz = dtreeviz(
    estimator,
    iris.data, 
    iris.target,
    target_name='variety',
    feature_names=iris.feature_names,
    class_names=[str(i) for i in iris.target_names],
    ) 
    viz.save()

se produire l'incident

Lorsque j'ai vérifié le dossier Temp de la destination de sortie, le problème était que seul un fichier SVG du modèle d'arbre de décision était enregistré. image.png

Apparemment, la convention de dénomination du fichier de sortie inclut l'ID de processus de l'environnement d'exécution. Il semble que le même nom de fichier soit généré à chaque fois, le fichier SVG est mis à jour à chaque fois et seul le dernier modèle est enregistré. Contenu des packages de site \ dtreeviz \ tree.py

 def save_svg(self):
        """Saves the current object as SVG file in the tmp directory and returns the filename"""
        tmp = tempfile.gettempdir()
        svgfilename = os.path.join(tmp, f"DTreeViz_{os.getpid()}.svg")
        self.save(svgfilename)
        return svgfilename

Corrections de bogues

Correction de la convention de dénomination des fichiers à générer en utilisant le temps d'exécution. Importez les données dans les packages de site \ dtreeviz \ tree.py

from datetime import datetime

Correction de save_svg ()

    def save_svg(self):
        """Saves the current object as SVG file in the tmp directory and returns the filename"""
        tmp = tempfile.gettempdir()
        #svgfilename = os.path.join(tmp, f"DTreeViz_{os.getpid()}.svg")
        now = datetime.now()
        svgfilename = os.path.join(tmp, f"DTreeViz_{now:%Y%m%d_%H%M%S}.svg")
        self.save(svgfilename)
        return svgfilename

Courez à nouveau

⇒ Sortie SVG réussie de tous les modèles d'arbres déterminés image.png

Consolider tous les fichiers svg

C'est très ennuyeux de regarder les fichiers ci-dessus un par un. Je l'ai intégré dans un fichier à l'aide de svgutils et l'ai sorti. (Je ne trouve pas le site auquel j'ai fait référence lors de l'utilisation de svgutils .. Je le lierai dès que je le redécouvrirai. )

Il est conçu pour être aussi carré que possible en fonction du nombre d'arbres de décision et afin que la mise en page puisse être corrigée immédiatement même si la profondeur de l'arbre de décision est modifiée.

レイアウト設計.png

Enregistrez les 100 SVG créés à l'avance dans un fichier spécifique et exécutez le programme suivant

import svgutils.transform as sg
import glob
import math
import os

def join_svg(cell_w, cell_h):
    SVG_file_dir = "./SVG_files"
    svg_filename_list = glob.glob(SVG_file_dir + "/*.svg")

    fig_tmp = sg.SVGFigure("128cm", "108cm")
    N = len(svg_filename_list)
    n_w_cells = int(math.sqrt(N))

    i = 0
    plot_list, txt_list = [], []

    for target_svg_file in svg_filename_list:
        print("i : {}".format(i))
        pla_x = i % n_w_cells
        pla_y = int(i / n_w_cells)
        print("Position du tracé:[x,y] : {},{}".format(pla_x, pla_y))
        print(target_svg_file)
        fig_target = sg.fromfile(target_svg_file)
        plot_target = fig_target.getroot()
        plot_target.moveto(cell_w * pla_x, cell_h * pla_y, scale=1)
        print("Coordonnées du modèle: {},{}".format(cell_w * pla_x, cell_h * pla_y))
        plot_list.append(plot_target)
        txt_target = sg.TextElement(25 + cell_w * pla_x, 20 + cell_h * pla_y,
                                    str(i), size=12, weight="bold")
        print("Coordonnées du texte: {},{}".format(25 + cell_w * pla_x, 20 + cell_h * pla_y))
        txt_list.append(txt_target)
        print(i)
        i += 1

    fig_tmp.append(plot_list)
    fig_tmp.append(txt_list)

    ouput_dir = SVG_file_dir + "/output"

    try :
        fig_tmp.save(ouput_dir + "/RF.svg")

    except FileNotFoundError:
        os.mkdir(ouput_dir)
        fig_tmp.save(ouput_dir + "/RF.svg")
 
join_svg(400, 300)

Résultat de sortie

Tous les fichiers ont été combinés avec succès.

RF_output_svg.png

La taille du fichier est plus grande que prévu (environ 10 Mo). L'affichage prend du temps, même en chrome. Dans certains cas, vous pouvez obtenir une erreur en raison d'une mémoire insuffisante à afficher si d'autres applications sont toujours en cours d'exécution.

Recommended Posts

J'ai essayé de visualiser tous les arbres de décision de la forêt aléatoire avec SVG
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'utiliser RandomForest
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz
J'ai essayé de visualiser les données de course du jeu de course (Assetto Corsa) avec Plotly
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Visualisez les résultats des arbres de décision réalisés avec Python scikit-learn
J'ai essayé d'ajouter un post-incrément à CPython. Liste de toutes les modifications
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
J'ai essayé de trier une colonne FizzBuzz aléatoire avec un tri à bulles.
Visualisez l'arbre de décision avec le notebook Jupyter
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de visualiser Boeing de la performance du violon par estimation de pose
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
[Python] J'ai essayé de visualiser le prix en argent de "ONE PIECE" plus de 100 millions de caractères avec matplotlib.
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de commencer avec Hy
Visualisez l'arbre de décision scikit-learn avec Treemap de Plotly
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de visualiser la reconnaissance générale d'objets de Google NN, Inception-v3 avec Tensorboard
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
Comme c'est le 20e anniversaire de la formation, j'ai essayé de visualiser les paroles de Parfum avec Word Cloud
J'ai essayé la reconnaissance manuscrite des caractères des runes avec scikit-learn
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
J'ai essayé de déplacer GAN (mnist) avec keras
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-
J'ai essayé d'informer Slack de la mise à jour de Redmine
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de détecter rapidement un mouvement avec OpenCV
J'ai essayé de trouver le rapport de circonférence par 100 millions de chiffres
J'ai essayé d'intégrer Keras dans TFv1.1
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé de générer une chaîne de caractères aléatoire