こんにちは。
決定木の可視化といえば、正直scikit-learnとgraphvizを使うやつしかやったことがなかったのですが、先日以下の記事をみて衝撃を受けたので、そこで使われていたライブラリ「dtreeviz」についてまとめます。
dtreevizの概要
dtreevizとは
より良い決定木の可視化を目指して作られたライブラリです。
- 解説記事 : How to visualize decision trees
- Github : GitHub - parrt/dtreeviz: A python machine learning library for structured data.
- Sample Imagesdtreeviz/testing/samples at master · parrt/dtreeviz · GitHub
多分百聞は一見に如かずだと思うので、Githubに掲載されているサンプル画像を載せます。
すごい。とにかくすごい。
そもそも良い決定木の可視化とはどういうものなのか?
詳しくは、解説記事に記載されているので、ここでは決定木を可視化することによって見たいポイントだけリストアップします。
- 決定木のノードの特徴と目標の値の分布
- 決定木のノードの特徴量の名前と特徴量の分割値
- 葉ノードの純度
- 葉ノードの予測値
- 決定木のノードのサンプル数
- 葉ノードのサンプル数
- 特定の特徴ベクトルが樹木を葉にどのように走らせるか(これは、特定の特徴ベクトルがなぜそれが行う予測を得るのかを説明するのに役立ちます)
このような決定木をベースに見られる重要な特徴量を見るために、「dtreeviz」がとても便利です。結構仕事で決定木とかを使うこともあるのですが、可視化があまりイケてなくて、どうしよっかなーと思っていたところにこのライブラリがきたので感動しました。
従来の決定木の可視化と比較して見ると、、、
通常決定木を可視化させようとすると、scikit-learnとgraphvizを使っての可視化になりますが、
もはや比較するまでもない感がありますが、解説記事中で紹介されているirisのデータで決定木を構築し、可視化させて見た結果を見比べると一目瞭然です。。。
なんというかテンションも上がります笑。色合いとかもモダンな感じですね。。。R・SAS・SPSSなどの可視化とも比較されているので、興味がある方はぜひ解説記事を見ていただければと思います。以下はSPSSの可視化の内容。scikit-learnよりはいい感じですね。
解説記事中でも紹介されていますが、「dtreeviz」のライブラリ自体は、以下の「A visual introduction to machine learning」にかなりの影響を受けて作成したみたいです。だいぶまえにこれを見たときに、可視化ってすげーなーって思った記憶があります。
「dtreeviz」の可視化結果の見方について
分類と回帰の両方においての可視化結果をサンプルデータを使いながら見ていきます。
特徴量と目標ラベル空間の可視化
以下は、Bostonのデータで、priceというターゲットに対してAGEという特徴量のみを使って回帰したものを可視化させた図です。
この図から、いくつかのことが読み取れます。
- 各ノードにおけるAGEの分岐点
- 各ノードで表示されているグラフの、x軸に平行な点線を見ることで、平均値がわかる
- 葉ノード以外のノードについては、x軸の範囲が常に一定
決定木の可視化から、特徴量がどこで分岐されていて、それが目標ラベルに対してどのような予測結果の影響を与えているかがわかります。
また、以下は、USER KNOWLEDGEというデータをPEGという一つの特徴量を使って分類したものを可視化させた図です。
この図からも、いくつかのことが読み取れます。
- 棒グラフが、各目標となるカテゴリの量を積み上げ式で表現している
- 葉ノードにおいて、円グラフのサイズがサンプル数のサイズを表していて、直感的にわかりやすい
解説記事によると、円グラフは、その評判の悪さを知りながら、解釈性の高さを意識して使っていると書かれていました。確かに、円グラフの大小を見ることでサンプル数の大きさを直感的に理解できるので、とてもわかりやすいです。
ある一つの観測結果の解釈の可視化
ある特徴量が特定の値を取ったときに、それがどのような結果に繋がるかの可視化もできるみたいです。以下の図みたいにできるそうですね。
分岐点を見ればまぁ同じことができるのですが、説明時にはとてもわかりやすいですね。。。
左から右方向での可視化
個人的には、これも確かにそうだなって思ったのですが、いつも上から下の図しか見てなかったので、左から右というのはありだなと思いました。
そのほか
シンプルなバージョンでの可視化や、試したが採用に至らなかった可視化なども紹介されています。
dtreevizの使い方
インストール
pipでライブラリはインストールできます。
$ pip install dtreeviz
加えて、以下のライブラリもbrewでインストールする必要があるみたいです。
$ brew install poppler $ brew install pdf2svg $ brew install graphviz --with-librsvg --with-app --with-pango
ちょっと一番最後のコマンドで以下のエラーでつまづいたのですが、以下のサイトを見たら解決できました。
コード
サンプルコードからやって見ました。
from sklearn.datasets import * from sklearn import tree from dtreeviz.trees import * import graphviz regr = tree.DecisionTreeRegressor(max_depth=2) boston = load_boston() regr.fit(boston.data, boston.target) viz = dtreeviz(regr, boston.data, boston.target, target_name='price', feature_names=boston.feature_names) viz
簡単ですね。。。実際に作成した画像は以下の通り。
わーい!
他にも使いながらいい感じの可視化を楽しんでみようと思います。