Python, scikit-learn

【scikit-learn】決定木モデルの可視化


決定木のアルゴリズムは非常にシンプルで直観的にわかりやすく、予測を行う過程を有向グラフとして可視化することもできます。

本記事では、scikit-learnの決定木モデルを可視化する方法について書きます。

実際にプログラムを作成してみる

それでは、早速、決定木の可視化を行うプログラムを作成してみます。

プログラム作成の手順

ここでは、以下の手順で処理を実装します。

  1. 学習用のデータセットを用意する
  2. データセットを利用して決定木の学習(モデルの構築)を行う
  3. 構築した決定木のモデルを可視化する

なお、上記3の処理を行うには、後述する2つのライブラリが必要になるため、この後の説明を必ず読み、忘れずにインポートして下さい。

決定木モデルの構築方法

scikit-learnを利用して決定木のモデルを構築する方法(実験用データセット、及びモデル構築用クラスの使い方など)については、以下の記事で詳しく解説しています。

決定木のモデルをどのように構築すればよいかわからない方は、まずはこれらの記事から読んでみて下さい。

可視化処理の手順

scikit-learnを利用して構築した決定木のモデルを可視化するためには、以下の2ステップを行う必要があります。

  1. 決定木モデルをdot形式のデータへ変換
    scikit-learnのexport_graphvizメソッドを利用
  2. 生成した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")

このプログラムを実行すると以下の出力結果が得られます。

対象の決定木モデルのノード分岐の条件から実際に分岐したデータの件数、クラスのラベリングまで、詳細に記述されたグラフが完成しました。

知りたい情報が一目でわかるようになったため、予測結果の考察なども容易になります。