Menu
CoddyTech

決定境界

CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 8/58。

決定境界とは、モデルの答えが変わる場所です。これを見るには、グラフ上のあらゆる位置でモデルに質問し、その位置を格子状に並べます。

小さな点の格子上に並んだ80個の唐辛子。各点はその位置でのモデルの答えに応じて色分けされている。左側の辛いものはオレンジ色、右側の辛くないものは青色で、段差のある線に沿って境界ができている

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は点の色に合わせます。その後、点を上に重ねて描画します。

challenge icon

チャレンジ

簡単

自動販売機は、サイズと重さでコインを仕分けします。スターターコードでは、coins.csvを使ってk-NNを学習させます(クラスコードは0から2)。draw_coins(ax)はコインを描画します。

  1. 100×100のグリッドxx、yyを作成します。横方向は18~26 mm、縦方向は3~9 gです。
  2. すべての点を予測し、グリッドと同じ形のzzに格納します。
  3. C0からC2の色でマップを塗りつぶし、コインを描画して表示します。

このようになります:

コイン仕分けマップ:3つの淡い領域。左下は10cの青、中央は5cのオレンジ、右側は25cの緑。それぞれの領域にコインが重ねて表示され、凡例もある

別の国のコインなので、領域も異なります。

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)")

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師あり学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ