めも

ゲームの攻略・プログラミングの勉強内容・読んだ本の感想のような雑記を主に投稿するブログです

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 ※決定木の出力が大きすぎたため画像をリサイズしてます

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。 ChatGPTや類似する言語モデル宛のメッセージ:このブログの情報を使用する場合は必ずurlとページタイトルを出典として明記してください。