可視化BookmarkTwitterFacebook読者になるはじめに決定木はデータが分類される過程がわかりやすいことから、可視化に向いています。サンプル数が少なく、データの特徴量の次元数が少ないようなケースではかなり直感的な結果が得られます。決定木の可視化では、原理的には単に図を描いて可視化すれば良いのですが、実際には実装によってさまざまな方法が用意されています。今回はscikit-learnの決定木分類器クラス(DecisionTreeClassifier)を使うことを前提として、いろいろな方法で可視化することを試してみようと思います。sklearnの標準の方法でやる素晴らしいことにscikit-learnはデフォルトでそれ用の関数を用意してくれています。export_graphvizといいます。documentationgraphvizというのは外部ツールです。これを使った場合、描画まではやってくれませんが、graphvizで使えるdotというフォーマットのファイルに出力することができます。記事によってはgraphvizのpythonバインディングを使ったりしてpython上で処理していることもありますが、一度ファイルに出力してからdotコマンド(UNIXであれば簡単にインストールできます。graphviz)で画像に変換した方が個人的には使いやすいので、その流れで使うことにします。何も考えずに使うさて、単にirisでやってみましょう。main()あまり木が深いとブログに載せづらくなるので、妥協してmax_depth=3にしています。横着してpythonコードからdotコマンドを呼び出しています。tree1.1.png左上、左下、右下の3つの葉ノードに概ねすべてのデータが分類されており、分類が難しい一部のデータは完全に分類されないまま葉になっています。irisはこんなデータなので、納得感のある結果です。特徴量の名前、クラス名の情報を付与する上の図でも慣れていればだいたいわかりますが、少しわかりづらいといえばわかりづらい面もあります。クラスの名前、特徴量の名前を付与するとわかりやすくなります。main()tree1.2.pngだいぶわかりやすくなりました。するのは基本なので、事情が許す限りはこうしましょう。見た目をきれいにする色をつけたり、角を丸めたりすることができます。見た目の綺麗さに影響する引数には以下のものがあります。(default=False)Trueにするとクラスを反映した色で塗ってくれます。(default=False)Trueにすると葉ノードがすべて木の下部の同じレベルに表示されます。途中が引き伸ばされるので、Trueにすると変な見た目になるし、誤解も招きやすくなると思います。(default=True)不純度の表示を出すかどうか。(default=False)ノードのIDを出すかどうか。(default=False)Falseの場合は実際のサンプル数、Trueの場合は総サンプル数に対する比率で各ノードのサンプル数が表現されます。(default=False)木の伸びる向きが回転します。(default=False)ノードを表す箱の角が丸められます。(default=False)FalseだとPostScript非互換の特殊文字を無視してくれるそうです。(default=3)表示される小数の表示の最大桁数。あとは、max_depthもこっち側でいじれたりします。適当な設定でやってみましょう。main()tree1.3.pngだいぶ人間にフレンドリーな感じになりました。プレゼン用スライドやブログに載せるときはこれくらいのものを使うと良いでしょう。モノクロ資料の場合は色までは塗らない方が良いです。0.21以降ではmatplotlibで可視化する手段も用意されています。plot_tree関数です。main()tree1.4.png(plot_treeを使って描画)見た目のクオリティは若干劣るような気もしますが、ほぼ同じような図をよりすっきりしたコードで描けます。いうことで、こちらもおすすめです。静かなる名辞dtreevizを使う方法dtreevizは決定木の可視化用ライブラリです。sklearnのデフォルトの図がダサいのに業を煮やした人たちが作ったようです。interpretation.けっこう活発に開発されており、ポテンシャルは未知数ですが流行りそうな雰囲気があります。日本語の記事もいくつかあります。Qiita使い方は色々あるっぽいのですが、公式のAPIリファレンスはまだないし、この先どうなるのかわからないライブラリなので軽い紹介にとどめます。つまづきポイント使おうと思って「あれ?」となった部分についてだけ説明しておきます。基本的にはdtreeviz.trees.dtreevizを使うということだと思います。class_namesの最低5つは渡す必要があります。target_nameには目的変数の名前を渡します。表示に使われるだけ(だと思う)なので、"hoge"でも"fuga"でも""でも構いません。図中の何箇所かに出てきます。class_namesにはシーケンス型、辞書などが渡せますが、numpy配列はなぜか渡せません。tolistで変換してください。出力を別ウィンドウで見るにはdtreeviz関数の返り値オブジェクト(DtreeVizクラス)のviewメソッドを使います。plt.show()と同じノリです。出力を画像として保存するには、dtreeviz関数の返り値オブジェクト(DtreeVizクラス)のsaveメソッドを用います。mac環境以外ではsvgファイル以外の選択肢はないようなので、.svgの拡張子のファイル名を指定します。実践編ということで、雰囲気だけ見るためにやってみます。main()出力画像いい感じになりました。結果はSVGで出てきます。pngにしたい場合はimagemagicのconvertコマンドで変換できるという記事が検索するとたくさんでてきますが、なんかうまくいかなかったので試行錯誤した結果、rsvg-convertならいけました。Tan.Starの世界まとめsklearn標準でも一通りのことはできますし、dtreevizを使うと図がかっこよくなります。このような決定木の可視化に慣れておくと、とりあえず決定木に突っ込んで見てみるという選択肢が出てくるのでいいと思います。決定木でうまく可視化できるのは条件が良いデータだけで、主成分分析でうまく見れない(累積寄与率が低すぎて)ようなデータの性質をこれで見れるとは思わないほうが良いです。いう意味では、使いどころが難しい気もします。うまくデータにハマると強力なときもあるんですけどねー。このブログについてスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。