決定木のアルゴリズムは非常にシンプルで直観的にわかりやすく、予測を行う過程を有向グラフとして可視化することもできます。
本記事では、scikit-learnの決定木モデルを可視化する方法について書きます。
実際にプログラムを作成してみる
それでは、早速、決定木の可視化を行うプログラムを作成してみます。
プログラム作成の手順
ここでは、以下の手順で処理を実装します。
- 学習用のデータセットを用意する
- データセットを利用して決定木の学習(モデルの構築)を行う
- 構築した決定木のモデルを可視化する
なお、上記3の処理を行うには、後述する2つのライブラリが必要になるため、この後の説明を必ず読み、忘れずにインポートして下さい。
決定木モデルの構築方法
scikit-learnを利用して決定木のモデルを構築する方法(実験用データセット、及びモデル構築用クラスの使い方など)については、以下の記事で詳しく解説しています。
決定木のモデルをどのように構築すればよいかわからない方は、まずはこれらの記事から読んでみて下さい。
可視化処理の手順
scikit-learnを利用して構築した決定木のモデルを可視化するためには、以下の2ステップを行う必要があります。
- 決定木モデルをdot形式のデータへ変換
scikit-learnのexport_graphvizメソッドを利用 - 生成したdot形式のデータを画像データ(.jpg, .png)へ変換
pydotplusのgraph_from_dot_dataメソッドを利用
dot形式はデータ構造をグラフとして表現するためのデータ形式です。
sklearn.treeからパッケージからインポートしたexport_graphvizメソッドを利用することで決定木モデルをdot形式のデータに変換することができます。
ただ、dot形式のデータはあくまでもコード、つまり、文字列の集合であるため、これをグラフとして描画し、画像データとして保存する処理が必要です。
dot形式のデータから画像データへの変換はpydotplusというライブラリのgraph_from_dot_dataメソッドを利用して実現することができます。
pydotplusがまだインストールされていない場合、コマンドプロンプトで以下のコマンドを実行し、インストールして下さい。
pip install pydotplus
実装例
上記の手順に従ってプログラムを作成します。使用する言語はPythonです。
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import pydotplus as pdp
if __name__ == '__main__':
# データセットを読み込む
iris = load_iris()
x = iris.data
y = iris.target
feature_names = iris.feature_names
class_names = iris.target_names
# 決定木の学習を行う
tree = DecisionTreeClassifier(max_depth=3)
tree.fit(x, y)
# 決定木の可視化を行う
dot_data = export_graphviz(tree, out_file=None, feature_names=feature_names, class_names=class_names)
graph = pdp.graph_from_dot_data(dot_data)
graph.write_jpg("graph.jpg")
このプログラムを実行すると以下の出力結果が得られます。
対象の決定木モデルのノード分岐の条件から実際に分岐したデータの件数、クラスのラベリングまで、詳細に記述されたグラフが完成しました。
知りたい情報が一目でわかるようになったため、予測結果の考察なども容易になります。