決定境界
CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 8/58。
決定境界とは、モデルの答えが変わる場所です。これを見るには、グラフ上のあらゆる位置でモデルに質問し、その位置を格子状に並べます。
np.meshgridはすべてのxとすべてのyを組み合わせます。組み合わせを行に平坦化し、すべてを予測してから、答えをグリッドの形状に戻します:
xx, yy = np.meshgrid(np.linspace(2, 16, 100), np.linspace(0.5, 6.5, 100))
grid = np.column_stack([xx.flatten(), yy.flatten()])
zz = model.predict(grid).reshape(xx.shape)
ax.contourf(xx, yy, zz, levels=[-0.5, 0.5, 1.5], colors=["C0", "C1"], alpha=0.3)contourfは各クラスコードの領域を塗りつぶします。levelsはコードの中間に境界線を配置し、colorsは点の色に合わせます。その後、点を上に重ねて描画します。
チャレンジ
簡単自動販売機は、サイズと重さでコインを仕分けします。スターターコードでは、coins.csvを使ってk-NNを学習させます(クラスコードは0から2)。draw_coins(ax)はコインを描画します。
- 100×100のグリッド
xx、yyを作成します。横方向は18~26 mm、縦方向は3~9 gです。 - すべての点を予測し、グリッドと同じ形の
zzに格納します。 - C0からC2の色でマップを塗りつぶし、コインを描画して表示します。
このようになります:
別の国のコインなので、領域も異なります。
Coddyがあなたのマップについて説明します。
自分で試してみよう
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
# 機械が測定した硬貨1枚につき1行:直径 (mm)、重さ (g)、セント単位の額面
coins = pd.read_csv("coins.csv")
X = np.column_stack([coins["diameter_mm"], coins["weight_g"]])
# クラスコード:10c は 0、20c は 1、50c は 2
y = coins["value_c"].map({10: 0, 20: 1, 50: 2})
names = ["10c", "20c", "50c"]
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X, y)
# ax に硬貨を描画する。クラスごとに色を分ける:C0、C1、C2
def draw_coins(ax):
for code in range(3):
ax.scatter(X[y == code, 0], X[y == code, 1], s=20, label=names[code])
ax.legend()
fig, ax = plt.subplots()
ax.set_title("Coin Sorter Map")
ax.set_xlabel("Diameter (mm)")
ax.set_ylabel("Weight (g)")
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師あり学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ