ETEを使ってPythonで決定木をシャレオツに表示


概要

PythonにはETEという木構造を可視化するためのライブラリがあります。これを使うと、下記のようなユニークな図が描けます。本記事ではこのモジュールの使い方について紹介したいと思います。
eteg
インストールは他ライブラリと同様に

pip install ete3

でOKです。

ETEオブジェクトの構成

以下は私がETEを使って作成した決定木(Irisで作成)のサンプル画像です。ETEを使うと、クラスの画像を表示したり、リーフのデータの特徴を棒グラフで表示したりと、表現の高い決定木が描けることが伝わるのではないでしょうか。
etesample
このサンプル画像には下記に示す5つの情報が含まれています。

  1. 決定木構造
  2. 分岐条件等の文字
  3. 円グラフ
  4. 写真
  5. 棒グラフ

一方、ETEではTreeオブジェクトに大きく3つの要素があり、それぞれが上記に示す各情報と次のように対応しています。

  1. Node:決定木構造
  2. Style:木の表示方法(サンプルでは横向きを指定)
  3. Face:それ以外(文字やグラフ等)

作成手順

オブジェクトの作成手順は①インスタンス作成、②Node定義、③Face追加、④表示方法指定です。以下順番に説明していきます。

インスタンス作成

インスタンス作成は、Treeクラスを呼び出して実行します。まずは何もないオブジェクトを作成してみます。

from ete3 import Tree

if __name__ == "__main__":
    
    Tree = Tree()
    Tree.show()

Tree.showと入力することで、ETEの専用ビューワーが開きます。何もないオブジェクトの場合、以下のように表示されるはずです。
キャプチャ3

Node定義

次に簡単な構造を指定してみましょう。インスタンス作成時に適当な構造を指定してみます。

from ete3 import Tree

if __name__ == "__main__":
    
    Tree = Tree('((A,B),C,D);')
    Tree.show()

Tree.showと入力することで、ちゃんと木構造が認識されていることが分かります。
キャプチャ

後付けで構造を定義したい場合にはsearch_nodesを使って親ノードを切り替えながら、add_childを使います。

from ete3 import Tree

if __name__ == "__main__":
    
    Tree = Tree()
    Tree.add_child(name='E')
    Tree.add_child(name='C')
    Tree.add_child(name='D')
    node = Tree.search_nodes(name='E')[0]
    node.add_child(name='A')
    node.add_child(name='B')
    Tree.show()

Tree.showとすれば、同様の木構造が得られます。
キャプチャ
その他、ファイルからの読み書きや各種フォーマットに対応しており、詳細は公式のチュートリアルを参考にしてみてください。

Face追加

上記で定義した木構造から特定のノードをsearch_nodes等を用いて選択し、別途定義した各種Faceを加えることで木に様々な要素を追加できます。

from ete3 import Tree, ImgFace, TextFace

if __name__ == "__main__":

    Tree = Tree('((A,B),C,D);')
    imgface = ImgFace("Iris-versicolor-21_1.jpg", height=50)
    textface = TextFace("Testmassage")
    
    node = Tree.search_nodes(name='A')[0]
    node.add_face(imgface, column=0, position="branch-right")
    node.add_face(textface, column=1, position="branch-top")
    node.add_face(textface, column=2, position="branch-right")
    
    Tree.show()

ImgFaceで画像を、TextFaceで文字列のFaceを定義しています。また、add_faceで追加するFaceと順番(column)と場所(position)を指定し、ノードAに追加しています。
Tree.showとすると、文字列や写真が追加されていることが分かります。
キャプチャ2
その他のFaceやオプション引数の説明に関しては、ETEマニュアルの該当ページを確認してみてください。

表示方法指定

TreeStyleを用いることで、木構造の表示オプションを指定できます。何はともあれやってみましょう。

from ete3 import Tree, ImgFace, TextFace, TreeStyle

if __name__ == "__main__":

    Tree = Tree('((A,B),C,D);')
    imgface = ImgFace("Iris-versicolor-21_1.jpg", height=50)
    textface = TextFace("Testmassage")
    
    node = Tree.search_nodes(name='A')[0]
    node.add_face(imgface, column=0, position="branch-right")
    node.add_face(textface, column=1, position="branch-top")
    node.add_face(textface, column=2, position="branch-right")
    
    ts = TreeStyle()
    ts.mode = "c"
    ts.show_leaf_name = True
    ts.show_scale = False
    ts.guiding_lines_type = 0
    Tree.show(tree_style=ts)

tsという変数をTreeStyleのインスタンスにし、細かい画面表示のオプションをしてしています。
Tree.showとすると、ちょっと不思議?な円型の木構造が表示されています。
キャプチャ4
その他の各種Faceや表示のためのオプション引数の説明に関しては、同様にETEマニュアルの該当ページを確認してみてください。

その他

ここでは紹介できませんが、上記で紹介した手順の内容以外にもNodeStyleClusterTree等、様々な要素があります。

まとめ

木構造をシャレオツ?に可視化できるライブラリ:ETEの使い方をご紹介しました。便利で可能性の高いツールだと思いますので、皆様も是非試してみてください。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA