Ich habe versucht zusammenzufassen, wie mehrere RF-Entscheidungsbäume in einer SVG-Datei mit dtreeviz und svgutils ausgegeben werden.
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/item 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()
Das erste Modell der 100 Entscheidungsbäume kann visualisiert werden.
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.)
Es wird verwendet, um die Verarbeitungszeit zu messen.
from tqdm import tqdm
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()
Beim Überprüfen des Temp-Ordners des Ausgabeziels trat das Problem auf, dass nur eine SVG-Datei des Entscheidungsbaummodells gespeichert wurde.
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
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
⇒ Erfolgreiche SVG-Ausgabe aller ermittelten Baummodelle
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.
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)
Alle Dateien wurden erfolgreich erfolgreich kombiniert.
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