
友だちPython ep1. dtreeviz
はじめに
友だちPython シリーズのご紹介
友だちPython シリーズは、Python の小ネタを短文でお届けします。
小さなエピソードを重ねてPythonと仲良しになれたら、と願ってシリーズ名を付けました。
話題
AI・データサイエンスのための 図解でわかる数学プログラミング
この記事は、書籍「AI・データサイエンスのための 図解でわかる数学プログラミング 初版」(ソーテック社)のコードで生じたエラー対処を取り扱います。
エラーの概要
第2章、2-6「決定木によって行動の原因を推定してみよう」の「決定木を描画する」コード(78ページ)でエラーが生じました。
決定木の樹形図等を可視化するライブラリ「dtreeviz」を実行すると、いくつかの問題事象が重なって、複雑なエラーになりました。
実行環境
・dtreeviz のバージョン: 2.2.1
・VS code の Jupyter Notebook で実行
問題の詳細
問題事象1
「dtreeviz.treesが見つからない」

ImportError: cannot import name 'dtreeviz' from 'dtreeviz.trees'
問題事象2
「moduleオブジェクトを呼び出せない」

TypeError: 'module' object is not callable
問題事象3
「リストのインデックスは整数かスライスでなければならない。numpyのfloat64ではない」

TypeError: list indices must be integers or slices, not numpy.float64
改善後のコード
# でコメントアウトした部分に問題がありました。
次行に修正後のコードを記載しました。
# 決定木を描画する
# from dtreeviz.trees import dtreeviz # 事象1修正前
import dtreeviz
# indexの抽出
x_0 = df_info.resample('M').count()
x_0 = x_0.drop(x_0.columns.values, axis=1)
time_index = x_0.index
# 決定木を描画
# viz = dtreeviz( # 事象2修正前
viz = dtreeviz.model(
clf,
# data_e, # 事象3修正前
# data_o, # 事象3修正前
data_e.astype(int),
data_o.astype(int),
feature_names=time_index,
target_name='Class',
class_names=['FALSE', 'TRUE'])
# viz # 事象2修正前
viz.view()
実行結果
きれいなビジュアルの樹形図を見ることができました。
なお、決定木による分類結果が書籍の結果と異なるため、樹形図が書籍と異なる内容になりました。

ちなみに、scikit-learn の plot_tree の樹形図は次のようになります。
# 決定木を描画する sklearnのplot_tree
from sklearn.tree import plot_tree
plt.figure(figsize=(10,5))
plot_tree(clf, feature_names=time_index, class_names=['False', 'True'],
filled=True);

(参考)エラーの解読
事象1、2
dtreeviz は バージョン 2.0.0 以降、API が変わりました。
書籍はこれよりも前のバージョンで動作確認したのだと思われます。
事象3
dtreevizに渡す変数のうち、float型のものを astypeでint型に変換したら、正常に動くようになりました。
(int型がdtreevizの必須要件なのかは未調査です)
おわり
ブログの紹介
noteで3つのシリーズ記事を書いています。
ぜひ覗いていってくださいね!
1.のんびり統計
統計検定2級の問題集を手がかりにして、確率・統計をざっくり掘り下げるブログです。
雑談感覚で大丈夫です。ぜひ覗いていってくださいね。
統計検定2級公式問題集CBT対応版に対応しています。
2.Python機械学習プログラミング実践記
書籍「Python機械学習プログラミング PyTorch & scikit-learn編」を学んだときのさまざまな思いを記事にしました。
この書籍は、scikit-learnとPyTorchの教科書です。
よかったらぜひ、お試しくださいませ。
3.データサイエンスっぽいことを綴る
統計、データ分析、AI、機械学習、Pythonのコラムを不定期に綴っています。
「統計」「Python」「数学とPython」「R」のシリーズが生まれています。