Python環境を起動中... 初回のみ数秒かかります
Lesson 10 / 12

パターン認識と評価

このレッスンで学ぶこと

  • k近傍法(kNN)を scikit-learn で動かせる/自前実装で仕組みを説明できる
  • 距離計算(ユークリッド・マンハッタン・コサイン)を NumPy で書ける
  • 混同行列・適合率・再現率・F1・ROC/AUC を計算し、意味を説明できる
  • 交差検証(cross_val_score)で汎化性能を測れる

1. このユニットの範囲(重要)

E資格の「機械学習」科目のうち、2026年版シラバスで出題対象なのは パターン認識(k近傍法・距離計算)・過剰/過少適合・交差検証・性能指標です。 このレッスンはここに絞ります。

⚠ 範囲について: 線形回帰・ロジスティック回帰・SVM・決定木・ランダムフォレスト・主成分分析(PCA)・k-means などの古典的モデルは、 2026年版シラバスでは出題対象外(オプション)のため、本コースでは扱いません (これらをやさしく学びたい方は 機械学習入門コース へ)。 ここからは scikit-learn が動く(▶ 実行できる)ので、実際に手を動かしましょう。

2. パターン認識:k近傍法(kNN)

k近傍法は「近くにある k 個のデータの多数決」で分類する、最もシンプルな手法のひとつ。 学習は「データを覚えるだけ」、予測時に距離を測って近いものを探します。scikit-learn の KNeighborsClassifier で動かします。

sample_1.py
Ctrl+Enter
出力

ライブラリに頼らず kNN のアルゴリズムを自分で書くと、中身がはっきり分かります(コードの読み解きにも強くなります)。 やることは「① 距離を測る → ② 近い k 個を選ぶ → ③ 多数決」の3ステップだけ。上の KNeighborsClassifier同じ結果になることを NumPy だけで確かめます。

knn_scratch.py
Ctrl+Enter
出力
理論の確認: kNN は「近さ」で決めるので、特徴量のスケールに敏感です(大きな値の特徴に引っ張られる)。 本来は標準化してから使うのが定番。n_neighbors(k)はハイパーパラメータで、小さすぎると過学習、大きすぎると鈍くなります。
📘 理論の復習: k近傍法の理論は、E資格対策ページ 「機械学習の基礎 ― パターン認識(k近傍法)」 で復習できます。

3. 距離計算(ユークリッド・マンハッタン・コサイン)

kNN の「近さ」は距離で測ります。代表的な3つを NumPy で計算します。

sample_2.py
Ctrl+Enter
出力

💡 使い分け: ユークリッドは素直な直線距離、マンハッタンは軸に沿った移動量。 コサインは「大きさ」より「向き」の近さを見る(文章ベクトルの類似度などで定番)。 コサインは類似度なので、距離にするなら 1 − コサイン類似度 とします。

📘 理論の復習: 距離計算(ユークリッド・マンハッタン・コサイン・マハラノビス等)の理論は、E資格対策ページ 「機械学習の基礎 ― 距離計算」 で復習できます。

4. 評価指標(混同行列・適合率・再現率・F1・ROC/AUC)

分類の性能は「正解率」だけでは不十分です。混同行列から、適合率・再現率・F1 を読み、ROC/AUC で総合力を見ます。

sample_3.py
Ctrl+Enter
出力
理論の確認: 適合率=陽性と判定したうち本当に陽性だった割合、再現率=本当の陽性をどれだけ拾えたか。 F1 はその調和平均。ROC-AUC は判定しきい値を動かしたときの総合的な分離力(1に近いほど良い)。

⚠ 医療では「再現率(見逃しの少なさ)」が重要: 病気を見逃す(偽陰性)と被害が大きいため、医療スクリーニングでは再現率を高く保つことが優先されがちです。 一方で適合率が下がると「無駄な精密検査」が増える——このトレードオフを指標で見極めます。 正解率だけでは、不均衡データ(病気がまれ)でこの問題を見落とします。

📘 理論の復習: 性能指標(混同行列・適合率・再現率・F値・ROC/AUC など)の理論は、E資格対策ページ 「機械学習の基礎 ― 性能指標」 で復習できます。

5. 交差検証(cross_val_score)

1回の train/test 分割では「たまたま」の影響が残ります。交差検証はデータを k 個に分け、 順番にテスト役を回して k 回評価し、平均を取ります。より安定した汎化性能の見積もりが得られます。

データセット
↓ k個(ここでは5個)に分割し、検証役を1つずつ交代
学習データ 学習データ 学習データ 学習データ 検証データ モデル1
学習データ 学習データ 学習データ 検証データ 学習データ モデル2
学習データ 学習データ 検証データ 学習データ 学習データ モデル3
学習データ 検証データ 学習データ 学習データ 学習データ モデル4
検証データ 学習データ 学習データ 学習データ 学習データ モデル5
5分割交差検証:データを5つに分け、検証データ(青)を1つずつ交代させて5回学習・評価する。各回のスコアを平均し、安定した汎化性能を見積もる。
sample_4.py
Ctrl+Enter
出力

💡 過剰適合/過少適合との関係: 交差検証のスコアが訓練スコアより大きく低いなら過剰適合(過学習)のサイン。 どちらも低いなら過少適合(モデルが単純すぎ)。汎化性能を測る道具として交差検証は必須です。

📘 理論の復習: 交差検証・検証集合の理論は 「機械学習の基礎 ― 検証集合(交差検証)」、過剰適合/過少適合は 「機械学習の課題(過剰適合・過少適合)」 で復習できます。

6. 練習問題

問題 1

kNN の k を変えてみる

n_neighbors3 にして kNN を学習・予測し、正解率を表示してください。

exercise_1.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

X, y = load_breast_cancer(return_X_y=True)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42)

# n_neighbors=3 の kNN を作って学習・予測し、正解率を表示してください
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_tr, y_tr)
pred = knn.predict(X_te)
print("正解率:", round(accuracy_score(y_te, pred), 4))   # 0.9415

k=3 にすると、k=5 のときと正解率が少し変わります(このデータでは 0.9415)。 k はハイパーパラメータ。交差検証で良い値を選ぶのが定石です。

問題 2

マンハッタン距離を計算する

2点 a, bマンハッタン距離(各成分の差の絶対値の合計)を計算してください。

exercise_2.py
出力
ヒントを見る(答え+解説)
import numpy as np

a = np.array([2.0, 5.0, 1.0])
b = np.array([4.0, 1.0, 1.0])

# マンハッタン距離を計算してください(|差|の合計)
manhattan = np.abs(a - b).sum()

print("マンハッタン距離:", manhattan)   # 6.0 になるはず

差は [-2, 4, 0]、絶対値は [2, 4, 0]、合計 6.0。 ユークリッドなら √(4+16+0)=√20≈4.47 と違う値になります。

問題 3

再現率を計算する

予測 pred と正解 y_te から、再現率(recall)を計算して表示してください。

exercise_3.py
出力
ヒントを見る(答え+解説)
...
pred = knn.predict(X_te)

# 再現率を計算して表示してください
recall = recall_score(y_te, pred)
print("再現率:", round(recall, 4))   # 0.9907

recall_score(正解, 予測) の順で渡します。再現率が高い=陽性の見逃しが少ない。医療で重視される指標です。

7. まとめ

このレッスンのポイント

  • 本ユニットの範囲はパターン認識・距離・評価指標・交差検証(SVM/決定木/PCA/k-means等は範囲外)
  • kNN は「近い k 個の多数決」。スケールに敏感で、k はハイパーパラメータ
  • 距離:ユークリッド(直線)・マンハッタン(軸沿い)・コサイン(向き)
  • 評価:混同行列から適合率・再現率・F1、総合は ROC-AUC
  • 医療では再現率(見逃しの少なさ)が重視されやすい。正解率だけでは不十分
  • 交差検証でk回評価し平均を取る=安定した汎化性能の見積もり

自由に試してみましょう(k を変えて交差検証の平均スコアを比べる)。

free_practice.py
出力

完了するとコース一覧に進捗が記録されます