k-NN回帰の仕組みから学ぶ!PythonとScikit-learnのKNeighborsRegressorの使い方

Python

KNeighborsRegressorを使ってみたけど、n_neighborsって結局何なんだろう?」 「機械学習のコードはシンプルだけど、中で何が起きているか分からないと、なんだか不安…」

もしあなたがこのように感じているなら、この記事はきっとお役に立てるはずです。

この記事では、k-NN(k-近傍法)回帰のシンプルな**「仕組み」を、身近な例で直感的に理解することから始めます。その上で、PythonのライブラリScikit-learnを使った具体的な「使い方」**までを一直線に解説します。

理論と実践が結びつくことで、きっと自信を持ってKNeighborsRegressorを使いこなせるようになります。

k-NN(k-近傍法)回帰の仕組みを直感的に理解しよう

KNeighborsRegressorの核心は、k-NN(k-近傍法)という非常にシンプルで直感的なアルゴリズムです。まずはこの仕組みを理解することから始めましょう。

コンセプトは「ご近所さんの値を参考にする」

k-NNの考え方は、私たちの日常的な判断とよく似ています。

例えば、あるエリアで**「新しい家の価格」を知りたいとします。あなたならどう考えますか?きっと、その家の「ご近所にある、似たような家の価格」**をいくつか参考にしますよね。

  • すぐ隣の家は3,500万円だった。
  • 向かいの家は3,200万円だった。
  • 少し先の角の家は3,600万円だった。

これらの情報から、「じゃあ、新しい家も大体3,400万円くらいかな?」と予測するでしょう。k-NNは、まさにこの「ご近所さんを参考にする」という考え方をコンピュータで実現したアルゴリズムなのです。

k-NN回帰の3つのステップ

この「ご近所さんを参考にする」プロセスは、もう少し具体的に以下の3ステップに分解できます。

  1. Step 1: 予測したい点との「距離」を計算する 新しいデータ(価格を知りたい家)と、すでにデータがある全ての学習データ(近所の家々)との「近さ(距離)」を計算します。
  2. Step 2: 最も距離が近い「k個」のデータを見つける 計算した距離が最も近い順にデータ(ご近所さん)を並べ、上位k個を選び出します。この「k」が、何軒のご近所さんを参考にするか、という数になります。
  3. Step 3: k個のデータの数値の「平均」をとって予測値とする 選び出したk個のデータが持つ数値(家の価格など)を単純に平均します。この平均値が、新しいデータの予測結果となります。

この**「平均をとる」という部分が、数値を予測する「回帰」**のキモです。

分類(Classifier)と回帰(Regressor)での仕組みの違い

Scikit-learnにはKNeighborsRegressorの他にKNeighborsClassifierというモデルもあります。この2つは、最後のステップが少し違うだけです。

  • 回帰 (Regressor)
    • 目的:数値を予測する(例:家の価格、気温)
    • 仕組み:k個の近傍データの平均値を計算する。
  • 分類 (Classifier)
    • 目的:カテゴリを予測する(例:犬か猫か、スパムメールか否か)
    • 仕組み:k個の近傍データで一番多いカテゴリによる多数決で決める。

今回は数値を予測するKNeighborsRegressorの使い方を見ていきましょう。

Scikit-learnでKNeighborsRegressorを使ってみよう【基本編】

それでは、仕組みを理解したところで、実際にPythonコードでKNeighborsRegressorを動かしてみましょう。

必要なライブラリのインポート

まずは、KNeighborsRegressor本体と、データを扱うためのnumpyをインポートします。

import numpy as np
from sklearn.neighbors import KNeighborsRegressor

サンプルデータの準備

学習用の簡単なデータ(特徴量Xと正解の数値y)を用意します。

# 特徴量 (入力データ)
X = np.array([[1], [2], [3], [4], [7]])

# 目的変数 (正解データ)
y = np.array([10, 20, 30, 40, 70])

モデルの初期化・学習・予測 – fitとpredictの基本フロー

KNeighborsRegressorの使い方は、たった3行で完結します。

# 1. モデルの初期化 (k=3 を指定)
# ここでの n_neighbors が、仕組みで学んだ「k」にあたります。
knn_reg = KNeighborsRegressor(n_neighbors=3)

# 2. モデルの学習
knn_reg.fit(X, y)

# 3. 新しいデータ ([5]) を予測
predicted_value = knn_reg.predict([[5]])

print(f"データ[5]の予測値: {predicted_value[0]}")

実行結果

データ[5]の予測値: 46.666666666666664Code language: CSS (css)

実行コードの裏側で何が起きているか

なぜ 46.66... という予測値が出たのでしょうか?先ほどの仕組みに当てはめて考えてみましょう。

  1. 距離の計算: 予測したいデータ [5] と学習データ X の各点との距離を計算します。
  2. k個の選択: n_neighbors=3 なので、[5]に最も近い3つのデータ点を探します。それは [4], [7], [3] です。
  3. 平均の計算: それらに対応する y の値 [40], [70], [30] の平均を計算します。 (40 + 70 + 30) / 3 = 140 / 3 = 46.66...

このように、コードの裏側では、先ほど学んだ仕組みが忠実に実行されていることがわかりますね。

予測精度を左右する!KNeighborsRegressorの重要パラメータ

KNeighborsRegressorの予測結果は、パラメータによって変化します。特に重要な2つを理解しておきましょう。

n_neighbors:最適な「ご近所さん」の数は?

これは、参考にするご近所さんの数(k)を決める最重要パラメータです。

  • kを小さくする (例: n_neighbors=1)
    • すぐ隣の1つのデータだけを参考にするため、非常に局所的な判断になります。学習データにノイズ(外れ値)があると、その影響を強く受けてしまいます(過学習しやすい)。
  • kを大きくする (例: n_neighbors=10)
    • より広範囲のデータを参考にするため、予測結果は滑らかになります。しかし、大きくしすぎると、予測したい点から遠いデータの影響も受けてしまい、データの細かい特徴を捉えきれなくなる可能性があります。

最適なkの値はデータによって異なるため、いくつかの値を試してモデルの性能を比較することが一般的です。

weights:距離に応じて影響度を変える

これは、見つけてきたk個のご近所さんをどう扱うかを決めるパラメータです。

  • weights='uniform' (デフォルト)
    • k個の近傍データを平等に扱います。つまり、単純な平均を取ります。
  • weights='distance'
    • 予測したい点に近いデータほど影響が大きく、遠いデータほど影響が小さくなるように重み付けをして平均を計算します。より直感に合った予測が期待できます。

【実践編】モデルを訓練して評価するまでの一連の流れ

最後に、より実践的な手順として、データを分割してモデルの性能を評価するまでの流れを見てみましょう。

データセットの準備と分割 (train_test_split)

モデルの未知のデータに対する性能を測るため、データを学習用とテスト用に分割します。

from sklearn.model_selection import train_test_split

# もう少し多めのデータを用意
X_all = np.arange(1, 21).reshape(-1, 1)
y_all = X_all.flatten() * 2 + np.random.randn(20) * 5 # y = 2x にノイズを加える

# データを学習用(80%)とテスト用(20%)に分割
X_train, X_test, y_train, y_test = train_test_split(X_all, y_all, test_size=0.2, random_state=42)

モデルの学習とテストデータでの予測

学習用データでモデルを訓練し、テスト用データで予測を行います。

# モデルをk=5, 重み付けありで初期化
model = KNeighborsRegressor(n_neighbors=5, weights='distance')

# 学習用データでモデルを学習
model.fit(X_train, y_train)

# テストデータを使って予測を実行
y_pred = model.predict(X_test)

モデルの性能を評価する(平均二乗誤差など)

テスト用の正解データ y_test と、モデルの予測 y_pred がどれくらい近いかを指標で評価します。回帰では、**平均二乗誤差(Mean Squared Error)**がよく使われます。この値が小さいほど、良いモデルと言えます。

from sklearn.metrics import mean_squared_error

# 平均二乗誤差を計算
mse = mean_squared_error(y_test, y_pred)

print(f"モデルの平均二乗誤差 (MSE): {mse}")

この評価指標を参考にしながら、n_neighborsなどのパラメータを調整していくのが、モデル改善の基本的なアプローチです。

まとめ

今回は、KNeighborsRegressorについて、その背景にあるk-NN回帰の仕組みから、Scikit-learnを使った具体的な実装方法、そしてモデルの評価までを解説しました。

  • k-NN回帰の仕組みは「ご近所さんの平均値」で予測するシンプルなもの
  • Scikit-learnではfitで学習、predictで予測するだけと非常に簡単
  • n_neighbors(参考にする近傍の数)が予測結果を大きく左右する
  • 仕組みを理解することで、各パラメータがモデルにどう影響するかを深くイメージできる

アルゴリズムの仕組みを理解すると、コードの裏側で何が起きているかが分かり、パラメータ調整の方針も立てやすくなります。ぜひ、この記事を参考にKNeighborsRegressorをあなたのプロジェクトで活用してみてください。

コメント

タイトルとURLをコピーしました