Hello there, ('ω')ノ
📌 1. k-NNとは?
k-NN(k-近傍法) は、データの分類や回帰に使われる「距離ベース」のアルゴリズムです。
「k個の近くのデータ(近傍)を見て、多数決 or 平均で予測する」というシンプルな仕組みです。
📌 k-NNの基本アイデア
- 新しいデータが与えられたら、その周囲の「k個のデータ」を探す
- 分類の場合: k個のデータの多数決でラベルを決定
- 回帰の場合: 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, (^^ゞ