Shikata Ga Nai

Private? There is no such things.

31. k近傍法(k-NN)を使ってみよう!

Hello there, ('ω')ノ

📌 1. k-NNとは?

k-NN(k-近傍法) は、データの分類や回帰に使われる「距離ベース」のアルゴリズムです。
「k個の近くのデータ(近傍)を見て、多数決 or 平均で予測する」というシンプルな仕組みです。

📌 k-NNの基本アイデア

  1. 新しいデータが与えられたら、その周囲の「k個のデータ」を探す
  2. 分類の場合: k個のデータの多数決でラベルを決定
  3. 回帰の場合: k個のデータの平均値を予測値とする

「似たものは同じカテゴリに属する」 という考え方!


📌 2. k-NNのアルゴリズムの仕組み

✅ 分類タスク(Classification)の場合

例えば、以下のような2クラスのデータ(○: クラスA, ×: クラスB)があるとします。

○  ○  ○  ○  ○  ○
       ◎(?)← 新しいデータ
×  ×  ×  ×  ×  ×

📌 k=3(近い3つのデータを見る)

  • 近くの3点のクラスを調べる(○○×)
  • 多数決をとる → クラスA(○)が多い → 「○」と分類!

📌 k=5(近い5つのデータを見る)

  • 近くの5点のクラスを調べる(○○×××)
  • 多数決をとる → クラスB(×)が多い → 「×」と分類!

「k」の値を変えると結果が変わるため、最適なkを選ぶことが重要!


✅ 回帰タスク(Regression)の場合

例えば、「部屋の広さ → 家賃」の関係を学習する場合、
📌 新しいデータ(部屋の広さ 50㎡ の家賃)を予測する

  • 近くのk個のデータの家賃を平均する → 予測値!

分類は「多数決」、回帰は「平均値」で予測!


📌 3. kの値の決め方

k(近傍の数) は、モデルの性能に大きく影響します。

📌 kが小さい場合(例: k=1, k=3)

  • 柔軟にデータを分類できるが、過学習しやすい!
  • 外れ値(ノイズ)の影響を受けやすい

📌 kが大きい場合(例: k=10, k=20)

  • 平滑化されて安定するが、詳細な分類ができない(精度が落ちる)
  • 計算コストが増える

一般的には「k ≈ √(データ数)」が目安!


📌 4. Pythonでk-NNを実装

✅ ① 分類タスク(Irisデータセット)

まずは、Irisデータセットを使って 花の種類を分類するk-NNモデル を作成します!

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

# データの読み込み
iris = load_iris()
X, y = iris.data, iris.target

# データを学習用・テスト用に分割(8:2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# k-NNモデルの作成(k=5)
knn_model = KNeighborsClassifier(n_neighbors=5)
knn_model.fit(X_train, y_train)

# 予測
y_pred = knn_model.predict(X_test)

# 精度を評価
print(f"Accuracy: {accuracy_score(y_test, y_pred):.2f}")

Irisデータセットで花の種類を分類!
k=5 に設定し、5つの近傍で分類を行う!


✅ ② 回帰タスク(住宅価格予測)

次に、カリフォルニア住宅価格データセット を使って、k-NN回帰を実装します。

from sklearn.datasets import fetch_california_housing
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error
import numpy as np

# データの読み込み
data = fetch_california_housing()
X, y = data.data, data.target

# データを学習用・テスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# k-NN回帰モデルの作成(k=5)
knn_reg = KNeighborsRegressor(n_neighbors=5)
knn_reg.fit(X_train, y_train)

# 予測
y_pred = knn_reg.predict(X_test)

# RMSE(平均二乗誤差)を計算
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print(f"RMSE: {rmse:.2f}")

k-NN回帰を使って住宅価格を予測!
k=5 の近傍データの平均で価格を予測!


📌 5. k-NNのメリット・デメリット

✅ メリット

シンプルで直感的に理解しやすい!
学習フェーズが不要(データを保存するだけ)
少量のデータなら高精度な予測が可能!

✅ デメリット

データ量が増えると計算コストが高くなる!(全データと距離計算するため)
次元が増えると精度が下がる(次元の呪い)
kの値を適切に選ばないと、過学習 or 汎化性能の低下が起こる!

少量データならk-NN、大量データならランダムフォレストやXGBoostが適切!


🎯 まとめ

k-NNは「近くのデータ」を使って分類・回帰を行うシンプルな手法!
分類は「多数決」、回帰は「平均値」で予測!
kの値を適切に選ぶことで、精度を向上できる!
Pythonでk-NNを実装し、分類・回帰の両方を試そう!

Best regards, (^^ゞ