k近傍法(KNN)の基礎と応用
k近傍法(K-Nearest Neighbors、KNN)は、分類や回帰に使用されるシンプルな機械学習アルゴリズムです。新しいデータに対して、訓練データの中から距離が近いデータを探し、その近くにあるデータの情報をもとに予測を行います。
KNNは仕組みが分かりやすく、分類問題の基本を理解するうえで適した手法です。一方で、距離計算を利用するため、特徴量のスケールやデータ量の影響を受けやすい点にも注意が必要です。
k近傍法(KNN)の仕組みを図で理解する

KNNとは?
KNNは、新しいデータに対して、訓練データの中から最も近いk個のデータを探し、その多数決や平均によって予測を行うアルゴリズムです。
分類問題では、近くにあるデータのクラスを確認し、最も多いクラスを予測結果とします。
例えば、新しい花のデータが与えられたとき、その花に近い特徴を持つ既存データを探し、近くにある花の種類をもとに分類します。
KNNの基本的な流れ
KNNは次の流れで予測を行います。
- 新しいデータを用意する
- 訓練データとの距離を計算する
- 距離が近いk個のデータを選ぶ
- 分類問題では多数決でクラスを決める
- 回帰問題では近傍データの平均などで値を予測する
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を選ぶことが重要です。