参考文献
Python Data Science Handbook: Essential Tools for Working With Data By Jake VanderPlas Publisher: O'Reilly Media Release Date: August 2015
上の本を参考にして試してみました。
dotのインストール
brew install graphviz
dotを実行してcommand not found: dot
となる場合は
/usr/local/bin/dot
のパスを通すか/usr/local/bin/dot filename.dot ...
とします。
決定境界の可視化
def visualize_classifier(model, X, y, ax=None, cmap='rainbow'): ....
決定木の分類境界を色づけする関数を本を参考に作成。これを基にして決定木の基本的な性質を見ていけたらと思います。
データの生成
import numpy as np import matplotlib.pyplot as plt import seaborn as sns; sns.set() from sklearn.datasets import make_blobs X, y = make_blobs(n_samples=1000, centers=4,random_state=0, cluster_std=1.0) plt.scatter(X[:, 0], X[:, 1], c=y, marker='x', s=100, cmap='rainbow');
決定境界の可視化
visualize_classifier(DecisionTreeClassifier(), X, y)
決定木の出力
決定木のデータファイルを出力
from sklearn.tree import export_graphviz export_graphviz(tree, out_file='tree.dot')
としてデータを出力したのちコマンドラインで
/usr/local/bin/dot -Tpng tree.dot -o tree.png
と実行します。
出力画像
おまけ:非線形データの場合
決定木は基本的に非線形の形状の境界を作ることはできません。 わざと三角関数と対数を用いて非線形のデータを作成して同様のことを行います。
データ生成
X, y = make_blobs(n_samples=1000, centers=4,random_state=0, cluster_std=1.0) X =np.log(10*np.sin(X)**2) plt.figure(figsize=(6, 2)) plt.scatter(X[:, 0], X[:, 1], c=y, marker='x', s=100, cmap='rainbow');
決定境界の可視化
すでにだいぶごっちゃになってますが...。分類性能も低そう。
plt.figure(figsize=(6, 2)) visualize_classifier(DecisionTreeClassifier(), X, y)
決定木の可視化
graphviz
を用いて決定木を可視化してみた結果です。
三角関数、対数、二乗を行った結果決定木のサイズがさっきと比べて桁違いに大きくなってしまいました。
※決定木の出力が大きすぎたため画像をリサイズしてます