教師あり学習分類問題の決定境界の可視化

パーセプトロン,SVM,ロジスティック回帰,ランダムフォレストなど「決定境界を求める」という分類問題を解く際に下のような2次元グラフで決定境界を可視化できると嬉しい.
今回は決定境界を引くアルゴリズムをまとめた.
f:id:umashika5555:20170625062041p:plain

手順は以下の通りである.

  1. 学習モデルでサンプルを分類する.
  2. 2Dグラフの軸の範囲を決める
  3. 2Dグラフ上にグリッドポイントを作成する
  4. グリッドポイント全てに対して学習モデルを適用
  5. グリッポポイントの等高線のプロット


1. 学習モデルでサンプルを分類する
今回はIrisデータセットからガクの長さ, 花弁の長さを特徴量として用いる.
http://www.geocities.jp/umashika_ningen/blog1.html
現在下記のような状態(サンプルとそのラベルはわかっている.)
f:id:umashika5555:20170625064850p:plain
ここで学習モデルをサンプルに適用し, 決定境界を求める.
学習によって得られた境界線をy = WX + bと数式を得ることができる.


2. 2Dグラフの軸の範囲を決める
まずサンプルの中で最も大きい値と小さい値をみてそれにフィットするようなグラフの範囲を決める.
特徴量の変数がXとすると

x1_min , x1_max = X[:,0].min()-1, X[:,0].max()+1
x2_min , x2_max = X[:,1].min()-1, X[:,1].max()+1

というように最小値-1,最大値+1を軸の範囲にする.

3. 2Dグラフ上にグリッドポイントを作成する
グラフ上に格子点を打つ.

resolution = 0.02
xx1,xx2 = np.meshgrid(np.arange(x1_min,x1_max,resolution),np.arange(x2_min,x2_max,resolution))

4. グリッドポイント全てに学習モデルを適用
1.の時点で境界線は引けているわけなので各グリッドポイントに対して予測のみをすれば良い.

#classifierは学習したモデル
#各特徴量を1次元配列に変換して予測を実行
Z=classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)

5. グリッポポイントの等高線のプロット
決定境界をプロットする.

form matplotlib.pyplot as plt
#予測結果を元のグリッドポイントのデータサイズに変換
Z=Z.reshape(xx1.shape)
#グリッドポイントの等高線のプロット
plt.contourf(xx1,xx2,Z,alpha=0.4)