はじめに
本記事では、scikit-learnを使った分類モデルの最初の一歩として「K近傍法(KNN)」を紹介します。
KNNはもっとも直感的でシンプルな分類アルゴリズムの一つであり、「似ているデータに注目して予測する」という考え方で動作します。
理論よりも「とにかく動かして学ぶ」ことを目的に、簡単なコードで分類モデルの作成・予測・評価までを一通り体験しましょう。
K近傍法(KNN)とは?
- 考え方: 新しいデータが来たとき、訓練データの中から「近いもの(=特徴が似ている)」を探して、そのラベルをもとに予測を行う。
- 特徴: 学習自体は非常に軽量(実質的にデータを記憶するだけ)だが、予測時に計算コストがかかる。
- パラメータ:
n_neighbors(いくつの近傍を見るか)が最重要。
過去に以下リンク先でK近傍法について仕組みや使い方等を図を用いて説明しているので参考にしてください。
↓↓↓
主要6モデルをやさしく解説!線形回帰・ロジスティック回帰・KNN・SVM・決定木・ランダムフォレストとは?
↑↑↑
実装:IrisデータでKNNを使ってみる
ステップ1:ライブラリの読み込みとデータ準備
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# データ読み込み
iris = load_iris()
X, y = iris.data, iris.target
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)ステップ2:モデルの作成と学習
# k=3とする
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)ステップ3:予測と評価
# テストデータに対する予測
pred = model.predict(X_test)
# 精度を確認
accuracy = model.score(X_test, y_test)
print("正解率:", accuracy)予測結果を可視化してみる(matplotlib)
2つの特徴量だけを使って、分類結果を可視化してみましょう。
import matplotlib.pyplot as plt
import numpy as np
# 2次元だけ使う(1つ目と2つ目の特徴量)
X = iris.data[:, :2]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
# メッシュグリッドの生成
h = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolor='k')
plt.title("KNN Classifier (k=5)")
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.show()実務で気をつけたいポイント
1. kの選び方
- 小さすぎるとノイズに敏感 → 過学習のリスク
- 大きすぎると大まかすぎる → 汎化しすぎて性能低下
グリッドサーチなどで最適なkを探す方法もあります(後日解説)。
2. 特徴量のスケーリング
KNNは距離をもとに動くアルゴリズムなので、単位やスケールが大きく異なる特徴量が混在すると不適切な結果になります。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)おわりに
K近傍法(KNN)は簡単に使えるにも関わらず、分類の考え方を理解するのに非常に役立ちます。今回はIrisデータを使って、分類の基本の流れを体験しました。
次回は、ロジスティック回帰を使って、より汎用性の高い分類手法に進みましょう。
練習問題
Q1. K近傍法において、n_neighbors の値が小さすぎると起きやすい現象は?
- A. 過学習(overfitting)
- B. 精度の計算ができなくなる
- C. 学習が非常に遅くなる
Q2. KNNが予測を行う際、何をもとにクラスを決定しているか?
- A. ランダムな値
- B. 最も遠いデータ点
- C. 近傍点の多数決
Q3. 可視化で使った特徴量は何と何?(Irisデータセットより)
- A. がく片の長さ・幅
- B. 花弁の長さ・幅
- C. がく片の幅と花弁の長さ
🔗 機械学習シリーズ 関連リンク
▶ 入門〜分類編
- 【入門】scikit-learnとは?機械学習の全体像と学習の流れ
- 【準備】sklearnのインストールとデータセットの扱い方
- 【分類①】K近傍法(KNN)を使ってシンプルな分類をしてみよう
- 【分類②】ロジスティック回帰でスパム判定をしてみよう
- 【分類③】決定木・ランダムフォレストの特徴と可視化方法
- 【分類④】混同行列・精度・再現率・F1スコアの正しい使い方
- 【モデル比較】SVM・決定木・ランダムフォレストの精度と解釈性の違い

コメント