[PYTHON] Ich habe versucht, alle Entscheidungsbäume des zufälligen Waldes mit SVG zu visualisieren

Überblick

Ich habe versucht zusammenzufassen, wie mehrere RF-Entscheidungsbäume in einer SVG-Datei mit dtreeviz und svgutils ausgegeben werden.

Wählen Sie ein beliebiges Modell aus RF aus und zeigen Sie es an

Ich habe den Link unten so wie er ist verwendet und ihn vorerst ausgeführt. [Versuchen Sie es mit dtreeviz für RandomForest](https://qiita.com/go50/itemLayout design.png 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

Das erste Modell der 100 Entscheidungsbäume kann visualisiert werden.

Speichern Sie alle Modelle als SVG-Dateien

Das obige Programm generiert eine SVG-Datei mit einem Modell. Durch Schleifenverarbeitung wurden alle in RF enthaltenen Entscheidungsbäume in SVG ausgegeben. (Verwenden Sie viz.save (), da es schwierig ist, alle 100 anzuzeigen.)

Importiere tqdm

Es wird verwendet, um die Verarbeitungszeit zu messen.

from tqdm import tqdm

Speichern Sie alle Modelle

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()

Auftreten des Vorfalls

Beim Überprüfen des Temp-Ordners des Ausgabeziels trat das Problem auf, dass nur eine SVG-Datei des Entscheidungsbaummodells gespeichert wurde. image.png

Anscheinend enthält die Namenskonvention für Ausgabedateien die Prozess-ID der Ausführungsumgebung. Es scheint, dass jedes Mal derselbe Dateiname generiert wird, die SVG-Datei jedes Mal aktualisiert wird und nur das letzte Modell gespeichert wird. Inhalt von Site-Paketen \ 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

Fehlerbehebung

Die Dateinamenskonvention, die mithilfe der Laufzeit generiert werden soll, wurde korrigiert. Importieren Sie die Datenzeit in site-packages \ dtreeviz \ tree.py

from datetime import datetime

Behoben 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

Führe es nochmals aus

⇒ Erfolgreiche SVG-Ausgabe aller ermittelten Baummodelle image.png

Konsolidieren Sie alle SVG-Dateien

Es ist sehr ärgerlich, die obigen Dateien einzeln anzusehen. Ich habe es mit svgutils in eine Datei integriert und ausgegeben. (Ich kann die Seite, auf die ich bei der Verwendung von svgutils verwiesen habe, nicht finden. Ich werde es verlinken, sobald ich es wiederentdeckt habe. )

Es ist so konzipiert, dass es entsprechend der Anzahl der Entscheidungsbäume so quadratisch wie möglich ist und das Layout auch dann sofort korrigiert werden kann, wenn die Tiefe des Entscheidungsbaums geändert wird.

レイアウト設計.png

Speichern Sie die 100 zuvor erstellten SVGs in einer bestimmten Datei und führen Sie das folgende Programm aus

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("Plotposition:[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("Modellkoordinaten: {},{}".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("Textkoordinaten: {},{}".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)

Ausgabeergebnis

Alle Dateien wurden erfolgreich erfolgreich kombiniert.

RF_output_svg.png

Die Dateigröße ist größer als erwartet (ca. 10 MB). Die Anzeige selbst in Chrom dauert einige Zeit. In einigen Fällen wird möglicherweise ein Fehler angezeigt, da nicht genügend Speicher für die Anzeige vorhanden ist, wenn andere Apps noch ausgeführt werden.

Recommended Posts

Ich habe versucht, alle Entscheidungsbäume des zufälligen Waldes mit SVG zu visualisieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, RandomForest zu verwenden
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Visualisieren Sie die Ergebnisse von Entscheidungsbäumen, die mit Python scikit-learn erstellt wurden
Ich habe versucht, CPython ein Post-Inkrement hinzuzufügen. Liste aller Änderungen
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, eine zufällige FizzBuzz-Spalte mit Blasensortierung zu sortieren.
Visualisieren Sie den Entscheidungsbaum mit einem Jupyter-Notizbuch
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, Boeing die Geigenleistung durch Posenschätzung vorzustellen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
[Python] Ich habe versucht, das Preisgeld von "ONE PIECE" über 100 Millionen Zeichen mit matplotlib zu visualisieren.
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, mit Hy anzufangen
Visualisieren Sie den Entscheidungsbaum von Scikit-Learn mit Plotlys Treemap
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, Googles allgemeine Objekterkennung NN, Inception-v3, mit Tensorboard zu visualisieren
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Da es der 20. Jahrestag der Gründung ist, habe ich versucht, die Texte von Parfüm mit Word Cloud zu visualisieren
Ich habe versucht, Runenfiguren mit Scikit-Learn handschriftlich zu erkennen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
Ich habe versucht, Slack über das Update von Redmine zu informieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, das Umfangsverhältnis mit 100 Millionen Stellen zu ermitteln
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, eine zufällige Zeichenfolge zu generieren