こんにちは,しまさん(@shimasan0x00)です.
最近,決定木の可視化において従来のgraphvizではなく,dtreevizというライブラリを使ったほうがいい感じに可視化してくれるので使用している人が増えてきているようです.
しかし,他の記事をざっと見たところ「dtreevizすげえ」とか「dtreevizでこんな可視化できるんだぜ」のような記事が多く,日本語を扱って苦労した類の記事がなかったので書いておきます.
環境
- Windows10
- Python 3.7.6
- dtreeviz 1.1.3
スポンサーリンク
dtreevizをインストールする【Windows 10】
まず,WindowsではPythonのライブラリが簡単にインストールできるとか,そもそもインストールできるとか考えることはやめましょう.
必ず苦労することが最低保障されています.
私も殆どWindowsでPythonを触ることはなく,触ってもWSL2上の環境かMac,Linuxです.
まずはGraphvizを自分でインストールしてbinをシステム環境変数に設定します.
次にpygraphvizをpipでインストールを試みると,もちろんエラーでインストールなんてできないのでGitHubからwhlファイルを持ってきてインストールします.
その後dtreevizをpipでインストールします.
スポンサーリンク
とりあえず日本語扱ってみて豆腐を生成する
とりあえず日本語を含めてirisデータを可視化してみます.
すると以下のエラーメッセージとともに一応豆腐が生成されます.
... lib\site-packages\matplotlib\textpath.py:90: RuntimeWarning: Glyph 27178 missing from current font.
font.set_text(s, 0.0, flags=LOAD_NO_HINTING)
... lib\site-packages\matplotlib\textpath.py:203: RuntimeWarning: Glyph 32294 missing from current font.
glyph = font.load_char(ccode, flags=LOAD_NO_HINTING)
... lib\site-packages\matplotlib\backends\backend_agg.py:181: RuntimeWarning: Glyph 32294 missing from current font.
font.set_text(s, 0, flags=flags)

私は豆腐好きですけど,食べ物の豆腐が好きなだけでこの手のエラーはmatplotlibのときにたらふく食べたので嫌いです.
豆腐から日本語へ
私も色々ライブラリ周りのコード見てみたんですけど解決せず…って感じでしたが解決策は公式ドキュメントを見れば一発でした.
サンプルコードを置いておきます.
from sklearn.datasets import load_iris
from sklearn import tree
from dtreeviz.trees import dtreeviz
clf = tree.DecisionTreeClassifier(max_depth=2)
iris = load_iris()
clf.fit(iris.data, iris.target)
iris.feature_names = ['sepal 縦 (cm)',
'sepal 横 (cm)',
'petal 縦 (cm)',
'petal 横 (cm)']
viz = dtreeviz(
clf,
iris.data,
iris.target,
target_name='variety',
feature_names=iris.feature_names,
class_names=[str(i) for i in iris.target_names],
fontname='MS Gothic'
)
viz.view()
簡単な話でdtreevizにfontnameで渡してあげるだけで解決しました.
WindowsなのでMS Gothicととりあえずしていますが,その他のOSであればIPAのフォントを使用したり他の日本語対応のフォントを選んであげればいいかなと思います.
