k近傍法の応用 | 分類アルゴリズム | Pythonによる機械学習を学ぶ

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

k近傍法(KNN)の基礎と応用

k近傍法(K-Nearest Neighbors、KNN)は、分類や回帰に使用されるシンプルな機械学習アルゴリズムです。新しいデータに対して、訓練データの中から距離が近いデータを探し、その近くにあるデータの情報をもとに予測を行います。

KNNは仕組みが分かりやすく、分類問題の基本を理解するうえで適した手法です。一方で、距離計算を利用するため、特徴量のスケールやデータ量の影響を受けやすい点にも注意が必要です。

k近傍法(KNN)の仕組みを図で理解する

k近傍法(KNN)の仕組みを図で理解する

KNNとは?

KNNは、新しいデータに対して、訓練データの中から最も近いk個のデータを探し、その多数決や平均によって予測を行うアルゴリズムです。

分類問題では、近くにあるデータのクラスを確認し、最も多いクラスを予測結果とします。

例えば、新しい花のデータが与えられたとき、その花に近い特徴を持つ既存データを探し、近くにある花の種類をもとに分類します。

KNNの基本的な流れ

KNNは次の流れで予測を行います。

  1. 新しいデータを用意する
  2. 訓練データとの距離を計算する
  3. 距離が近いk個のデータを選ぶ
  4. 分類問題では多数決でクラスを決める
  5. 回帰問題では近傍データの平均などで値を予測する

KNNの特徴

  • 仕組みがシンプルで理解しやすい
  • 分類にも回帰にも利用できる
  • 訓練時の計算は比較的少ない
  • 予測時に距離計算が必要になる
  • 特徴量のスケールに影響されやすい

kの値の影響

KNNでは、近くにある何個のデータを参考にするかを表すkの値が重要です。

kの値 特徴 起こりやすい問題
小さい値 近くの少数のデータだけで判断する ノイズに影響されやすく、過学習しやすい
大きい値 多くの近傍データを参考にする 細かな違いを捉えにくく、アンダーフィッティングしやすい
適切な値 局所的な傾向と安定性のバランスが取れる 汎化性能が高くなりやすい

適切なkの値はデータによって異なるため、交差検証などを使って調整します。

距離の考え方

KNNでは、データ同士の近さを距離で判断します。

よく使われる距離の例は次の通りです。

距離 特徴
ユークリッド距離 直線的な距離を計算する一般的な方法
マンハッタン距離 縦横方向の移動量を合計する方法
コサイン類似度 ベクトルの向きの近さを測る方法

特徴量のスケーリングが重要

KNNは距離を使うため、特徴量のスケールが異なると結果に大きく影響します。

例えば、年齢が「20〜80」、年収が「300万〜1000万」のように大きくスケールが異なる場合、年収の影響が強くなりすぎることがあります。

そのため、KNNを使う場合は、正規化や標準化によって特徴量のスケールを揃えることが重要です。

PythonによるKNNの実装例

Pythonでは、scikit-learnのKNeighborsClassifierを使ってKNNを簡単に実装できます。

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# Irisデータセットをロード
data = load_iris()
X = data.data
y = data.target

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42
)

# KNNモデルを作成
knn = KNeighborsClassifier(n_neighbors=3)

# モデルを学習
knn.fit(X_train, y_train)

# テストデータで予測
y_pred = knn.predict(X_test)

# 精度を計算
accuracy = accuracy_score(y_test, y_pred)

print(f"KNNの精度: {accuracy:.3f}")

この例では、Irisデータセットを使って花の種類を分類しています。n_neighbors=3は、近い3個のデータを参考にして分類するという意味です。

最適なkの値を選ぶ方法

kの値は、モデルの性能に大きく影響します。

そのため、複数のkを試し、交差検証によって最も性能が良い値を探すことがよく行われます。

from sklearn.model_selection import GridSearchCV

param_grid = {
    'n_neighbors': range(1, 20)
}

grid_search = GridSearchCV(
    KNeighborsClassifier(),
    param_grid,
    cv=5
)

grid_search.fit(X_train, y_train)

best_k = grid_search.best_params_['n_neighbors']

print(f"最適なkの値: {best_k}")

このコードでは、kの値を1から19まで試し、交差検証によって最も良い値を探しています。

KNNの評価方法

KNNの分類性能を評価する際には、正解率だけでなく、混同行列やF1スコアなども確認するとよいです。

混同行列による評価

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)

print(cm)

混同行列を使うと、どのクラスを正しく分類できたか、どのクラスで誤分類が起きたかを確認できます。

KNNの応用例

KNNは、次のような分野で利用されます。

分野 応用例
画像認識 似た画像を探し、カテゴリを分類する
レコメンデーション 似たユーザーや商品をもとに推薦する
医療診断 似た患者データから診断を支援する
異常検知 周囲のデータから大きく離れた点を検出する

KNNのメリット

  • 仕組みが直感的で分かりやすい
  • 分類と回帰の両方に使える
  • 複雑な学習処理が少ない
  • データの分布を仮定しない

KNNの注意点

  • データ量が多いと予測時の計算コストが大きくなる
  • 特徴量のスケールに強く影響される
  • 高次元データでは距離の意味が弱くなることがある
  • kの値によって結果が大きく変わる
  • 不要な特徴量が多いと精度が低下しやすい

まとめ

KNNは、新しいデータに近いk個のデータをもとに予測を行うシンプルなアルゴリズムです。

分類や回帰に利用でき、仕組みも直感的に理解しやすい一方で、kの値や距離の計算方法、特徴量のスケーリングが結果に大きく影響します。

特にKNNでは、正規化や標準化などの前処理を行い、適切なkを選ぶことが重要です。