St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

決定木の可視化ライブラリ「dtreeviz」が凄かったのでまとめる

こんにちは。

決定木の可視化といえば、正直scikit-learnとgraphvizを使うやつしかやったことがなかったのですが、先日以下の記事をみて衝撃を受けました。そこで今回は、以下の解説記事中で紹介されていたライブラリ「dtreeviz」についてまとめます。

explained.ai

dtreevizの概要

dtreevizとは

より良い決定木の可視化を目指して作られたライブラリです。

多分百聞は一見に如かずだと思うので、Githubに掲載されているサンプル画像を載せます。

f:id:St_Hakky:20180930141746p:plain
f:id:St_Hakky:20180930141817p:plain
f:id:St_Hakky:20180930141831p:plain

すごい。とにかくすごい。

そもそも良い決定木の可視化とはどういうものなのか?

詳しくは、解説記事に記載されていますが、ここではそこで紹介されていた決定木を可視化することによって、見たいポイントをリストアップします。

  • 決定木の各ノードにおける特徴と目標の値の分布
  • 決定木の各ノードにおける特徴量の名前とその特徴量の分割値
  • 葉ノードの純度
  • 葉ノードの予測値
  • 決定木の各ノードのサンプル数
  • 葉ノードのサンプル数
  • ある特徴ベクトルが樹木を葉に向かってどのように走らせるか(これは、特定の特徴ベクトルによってなぜその予測値を得るのかを説明するのに役立ちます)

このような決定木をベースに見られる重要なポイントを見るために、「dtreeviz」がとても便利です。

結構仕事で決定木とかを使うこともあるのですが、可視化があまりイケてなくて、どうしよっかなーと思っていたところに、このライブラリがきたので感動しました。

従来の決定木の可視化と比較して見ると、、、

通常決定木を可視化させようとすると、scikit-learnとgraphvizを使っての可視化になりますが、それがあんまりいけてないんですよね、、、。

もはや比較するまでもない感がありますが、解説記事中で紹介されているirisのデータで決定木を構築し、可視化させて見た結果を見比べると一目瞭然です。。。

f:id:St_Hakky:20180930143950p:plain


なんというかテンションも上がります笑。色合いとかもモダンな感じですね。。。

解説記事では、R・SAS・SPSSなどの可視化とも比較されているので、興味がある方はぜひ解説記事を見ていただければと思います。以下はSPSSの可視化の内容。scikit-learnよりはいい感じですね。

http://explained.ai/decision-tree-viz/images/spss-tree.png


解説記事中でも紹介されていますが、「dtreeviz」のライブラリ自体は、以下の「A visual introduction to machine learning」にかなりの影響を受けて作成したみたいです。だいぶまえにこれを見たときに、可視化ってすげーなーって思った記憶があります。可視化でこんなに変わるんだなぁって思いますし、そうだからこそ、もっとこだわっていきたい。。。

www.r2d3.us

「dtreeviz」の可視化結果の見方について

分類と回帰の両方においての可視化結果をサンプルデータを使いながら見ていきます。

特徴量と目標ラベル空間の可視化

以下は、Bostonのデータで、priceというターゲットに対してAGEという特徴量のみを使って回帰したものを可視化させた図です。

http://explained.ai/decision-tree-viz/images/boston-TD-AGE.svg

この図から、いくつかのことが読み取れます。

  • 各ノードにおけるAGEの分岐点
  • 各ノードで表示されているグラフの、x軸に平行な点線を見ることで、平均値がわかる
  • 葉ノード以外のノードについては、x軸の範囲が常に一定

決定木の可視化から、特徴量がどこで分岐されていて、それが目標ラベルに対してどのような予測結果の影響を与えているかがわかります。

また、以下は、USER KNOWLEDGEというデータをPEGという一つの特徴量を使って分類したものを可視化させた図です。

http://explained.ai/decision-tree-viz/images/knowledge-TD-PEG.svg

この図からも、いくつかのことが読み取れます。

  • 棒グラフが、各目標となるカテゴリの量を積み上げ式で表現している
  • 葉ノードにおいて、円グラフのサイズがサンプル数のサイズを表していて、直感的にわかりやすい

解説記事によると、円グラフは、その評判の悪さを知りながら、解釈性の高さを意識して使っていると書かれていました。確かに、円グラフの大小を見ることでサンプル数の大きさを直感的に理解できるので、とてもわかりやすいです。

ある一つの観測結果の解釈の可視化

ある特徴量が特定の値を取ったときに、それがどのような結果に繋がるかの可視化もできるみたいです。以下の図みたいにできるそうですね。

http://explained.ai/decision-tree-viz/images/samples/knowledge-TD-3-X.svg

分岐点を見ればまぁ同じことができるのですが、説明時にはとてもわかりやすいですね。。。

左から右方向での可視化

個人的には、これも確かにそうだなって思ったのですが、いつも上から下の図しか見てなかったので、左から右というのはありだなと思いました。

http://explained.ai/decision-tree-viz/images/samples/wine-LR-3.svg

そのほか

解説記事中では、シンプルなバージョンでの可視化や、試したが採用に至らなかった可視化なども紹介されています。

将来的な部分

以下のランダムフォレストの特徴量をみるライブラリも追加されるみたいですね。

github.com

dtreevizの使い方

インストール

pipでライブラリはインストールできます。

$ pip install dtreeviz

加えて、以下のライブラリもbrewでインストールする必要があるみたいです。

$ brew install poppler
$ brew install pdf2svg
$ brew install graphviz --with-librsvg --with-app --with-pango

ちょっと一番最後のコマンドで以下のエラーでつまづいたのですが、以下のサイトを見たら解決できました。

xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance · Issue #569 · nodejs/node-gyp · GitHub

コード

サンプルコードからやって見ました。

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    

簡単ですね。。。実際に作成した画像は以下の通り。

f:id:St_Hakky:20180930172824p:plain

わーい!

他にも使いながらいい感じの可視化を楽しんでみようと思います。