nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

GraphViz'sで可視化する (Windows)

はじめに

Windowsで、GraphViz'sで可視化する場合は大変です。

環境

  • Python 3.6

手順

(1) Anaconda Promptで、以下のようにgraphvizとpydotをインストール

conda install graphviz

pip install pydotplus

(2) graphvizを公式ホームページからインストールしてください。

(3) システム環境パスを通すか、もしくは直接コードにパスを埋め込みます。(本例は後者)

u"""
    決定木系モデルを視覚化する。
    Graphviz を用いて、決定木のモデルを視覚化する。
    決定木だけでなく、ランダムフォレストなど木構造のモデルに適用できる。

"""

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection  import train_test_split
from sklearn.model_selection import cross_val_score

# モデルの木構造の視覚化に必要なパッケージ
from sklearn import tree
import pydotplus as pdp

import pandas as pd
import numpy as np

# パスを手動で追加します (システムの環境設定を通してもうまくいかなかったため、パスを仕方なく追加しました。)
# InvocationException: GraphViz's executables not found
import os     
os.environ["PATH"] += os.pathsep + "C:/Users/uv2ut/Anaconda3/Library/bin/graphviz"

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

# 学習データとテストデータを分ける

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("予測の精度")
print(clf.score(df_test, label_test))

# 試しに木の一つを視覚化する
estimators = clf.estimators_
file_name = "./tree_visualization.png"
dot_data = tree.export_graphviz(estimators[0], # 決定木オブジェクトを一つ指定する
                                out_file=None, # ファイルは介さずにGraphvizにdot言語データを渡すのでNone
                                filled=True, # Trueにすると、分岐の際にどちらのノードに多く分類されたのか色で示してくれる
                                rounded=True, # Trueにすると、ノードの角を丸く描画する。
                                feature_names=features, # これを指定しないとチャート上で特徴量の名前が表示されない
                                class_names=iris.target_names, # これを指定しないとチャート上で分類名が表示されない
                                special_characters=True # 特殊文字を扱えるようにする
                                )
graph = pdp.graph_from_dot_data(dot_data)

# 以下の命令で、ipynbと同じフォルダに、fileNameの画像ファイルが保存されます。
graph.write_png(file_name)
from IPython.display import Image
Image(graph.create_png())

表示イメージ

f:id:nprogram:20190404063519p:plain

リンク

あとがき

システム環境設定のパスが重要らしい

仮想環境を利用しているときは下記のgraphvizのフォルダパスをPathに追加します。

C:\Users\ユーザー名\Anaconda3\envs\仮想環境名\Library\bin\graphviz

仮想環境を利用していないときは下記のgraphvizのフォルダパスをPathに追加します。

C:\Users\ユーザー名\Anaconda3\Library\bin\graphviz