分類ができているかできていないかの確認はできるようになったと思います。
では、実際にどのように分類できているのかを「グラフ上のすべての点の分類を総当たりで調べる」という方法を用いてみてみましょう!
目次
グラフをマス目状に区切った点データにしよう
np.meshgrid命令を使って、グラフをマス目状に区切った点データにすることができます。
各点データの分類の値を調べてplt.pcolormesh命令を用いるとグラフ全体をマス目状に色で塗りつぶすことができます。
どのように表示されるのか3×3、8×8、100×100の3種類の粗さでデータを作成し、虹色のグラデーションで塗りつぶしてみましょう。
コード
#1 3種類の粗さのリスト
#2 点データを作成
#3 虹色で塗る
import matplotlib.pyplot as plt
import numpy as np
plt.subplots(1,3,figsize=(15, 5))
sizelist = [3,8,100] #1
for i in range(3):
size=sizelist[i]
X, Y = np.meshgrid(np.linspace(0, 10, size+1), #2
np.linspace(0, 10, size+1))
C = np.linspace(0,100,size*size).reshape(size, size)
plt.subplot(1, 3, i+1)
plt.pcolormesh(X, Y, C, cmap="rainbow") #3
plt.show()
参考資料:Python3年生機械学習のしくみ
実行結果
実行結果を見ると、マス目が細かくなるとどんどん滑らかになる様子がわかります。
分類の状態を描く関数
上記のプログラムを利用してグラフ上のすべての点を予測して、どの分類なのかを塗りつぶしていく関数を作成してみましょう。
少し難易度が高いかもしれませんがプログラムの内容をすべて理解する必要はありません!(機械学習の内容から少し外れてしまうので…)
コード
#1 点と塗りのカラーマップ
#2 モデルがあれば、表示範囲の点をすべて予測して色を塗る
#3 表示範囲を少し広げて分割し、調べる点(200x200)を用意する
#4 すべての点の値を、モデルで予測する
#5 予測結果の値(0〜2)の色(cmap_fills)で塗りつぶす
#6 境界を灰色で塗る
#7 targetの値(0〜2)の色(cmap_dots)で点を描画する
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
def plot_boundary(model, X, Y, target, xlabel, ylabel):
cmap_dots = ListedColormap([ "#e0884b", "#0080f1", "#d35fd3"]) #1
cmap_fills = ListedColormap([ "#ffdec2", "#c2e2ff", "#f8e7f8"])
plt.figure(figsize=(5, 5))
if model: #2
XX, YY = np.meshgrid( #3
np.linspace(X.min()-1, X.max()+1, 200),
np.linspace(Y.min()-1, Y.max()+1, 200))
pred = model.predict(np.c_[XX.ravel(), YY.ravel()]).reshape(XX.shape) #4
plt.pcolormesh(XX, YY, pred, cmap=cmap_fills, shading="auto") #5
plt.contour(XX, YY, pred, colors="red") #6
plt.scatter(X, Y, c=target, cmap=cmap_dots) #7
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.show()
参考資料:Python3年生機械学習のしくみ
この関数の使い方
【引数】
・学習済みモデル
・X軸に使う特徴量
・Y軸に使う特徴量
・分類の値
・X軸用ラベル
・Y軸用ラベル
を設定するとデータの散布図と学習済みモデルでどのような分類かを描ける。
おまけ
学習済みモデルをNone(なし)にすると散布図のみを描画できる
次回はこの仕組みを利用して実際にグラフを見てみましょう!