graphvizで決定木を可視化

前回の記事でgraphvizをインストールしたので、早速決定木を可視化してみましょう。
サンプルなので、モデル自体は適当に作ります。(データもいつものirisです)


# ライブラリインポート
import graphviz
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
# データの読み込みとモデルの学習
iris = load_iris()
X = iris.data
y = iris.target
clf = DecisionTreeClassifier(min_samples_split=5)
clf.fit(X, y)

これで、モデルができたので可視化してみましょう。
参考にするコードはscikit-learnのサンプルがいいと思います。
ここではblogに挿入することを考慮して、pdfではなくpng画像に出力しました。


dot_data = export_graphviz(
                        clf,
                        class_names=iris.target_names,
                        feature_names=iris.feature_names,
                        filled=True,
                        rounded=True,
                        out_file=None
                    )
graph = graphviz.Source(dot_data)
graph.render("iris-tree", format="png")

結果がこちらです。
わかりやすく可視化できましたね。

macにgraphvizをインストールする

決定木の可視化などに使うgraphvizをMacにインストールする手順のメモです。
ついでにpythonライブラリもインストールします。

まず、本体の方はドキュメントにある通り、homebrewでインストールできます。


brew install graphviz

pythonライブラリの方はこちら。 pipコマンドでインストールします。


pip install graphviz

動作確認をかねて Quickstartのコードを動かしてみましょう。


>>> from graphviz import Digraph
>>> dot = Digraph(comment='The Round Table')
>>> dot  #doctest: +ELLIPSIS
>>> dot.node('A', 'King Arthur')
>>> dot.node('B', 'Sir Bedevere the Wise')
>>> dot.node('L', 'Sir Lancelot the Brave')
>>> dot.edges(['AB', 'AL'])
>>> dot.edge('B', 'L', constraint='false')
>>> print(dot.source)  # doctest: +NORMALIZE_WHITESPACE
>>> dot.render('test-output/round-table.gv', view=True)

これでpdfファイルを開いた時に3個の丸を含むグラフが表示されたらOKです。

(2020/3/21 追記)
このページへのアクセスが非常に多い理由が不明だったのですが、
conda でインストールして、うまく動かなかった人がいるのではないかと思ったので補足します。

condaの方にも、 graphviz と言うパッケージがあり、
conda install graphviz でインストールできますが、
これはgraphvizの本体が含まれないラッパーのみで、
しかも本体を別途 brew でインストールしてもパスが通らないことがあるようです。

conda で導入する場合は
conda install python-graphviz
を使います。

ほかのサイトでは、
brew で本体を入れた後に, graphviz と python-graphviz をそれぞれ入れている例を見かけますが、
試したところ、brewも無しで、
conda install python-graphviz
だけ、行えば動きました。