読者です 読者をやめる 読者になる 読者になる

ゆるふわめも

in Kyoto or Tokyo

pythonで決定木の出力と決定境界の可視化

参考文献

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');

f:id:misos:20161112220359p:plain

決定境界の可視化

visualize_classifier(DecisionTreeClassifier(), X, y)

f:id:misos:20161112220548p:plain

決定木の出力

決定木のデータファイルを出力

from sklearn.tree import export_graphviz
export_graphviz(tree, out_file='tree.dot')

としてデータを出力したのちコマンドライン

/usr/local/bin/dot -Tpng tree.dot -o tree.png

と実行します。

出力画像

f:id:misos:20161112220757p:plain

おまけ:非線形データの場合

決定木は基本的に非線形の形状の境界を作ることはできません。 わざと三角関数対数を用いて非線形のデータを作成して同様のことを行います。

データ生成

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');

f:id:misos:20161112221130p:plain

決定境界の可視化

すでにだいぶごっちゃになってますが...。分類性能も低そう。

plt.figure(figsize=(6, 2))
visualize_classifier(DecisionTreeClassifier(), X, y)

f:id:misos:20161112221246p:plain

決定木の可視化

graphvizを用いて決定木を可視化してみた結果です。 三角関数対数、二乗を行った結果決定木のサイズがさっきと比べて桁違いに大きくなってしまいました。

f:id:misos:20161112221817p:plain ※決定木の出力が大きすぎたため画像をリサイズしてます