Scikit-learnのKNeighborsClassifierで学ぶk-NN!使い方を完全ガイド

Python

機械学習の分類問題に挑戦する際、どのアルゴリズムから学べば良いか迷うことはありませんか?そんな方には、直感的で理解しやすい**k-NN(k近傍法)**が最適です。

このガイドでは、Pythonの定番ライブラリScikit-learnのKNeighborsClassifierを使い、k-NNモデルを構築するための全手順を徹底的に解説します。

サンプルコードを交えながら、データ準備からモデル評価、パラメータ調整のヒントまでを網羅。この一本でKNeighborsClassifierの基本をマスターしましょう!

はじめに:k-NN(k近傍法)は機械学習の「多数決」

k-NNは、そのシンプルさと分かりやすさから、機械学習の入門アルゴリズムとして非常に人気があります。

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

k-NNの根底にある考え方は「データは、その近所にあるデータと同じ種類に違いない」というものです。未知のデータを分類する際、最も近くにいるk個のデータを見て、その中で最も多いクラス(多数派)に分類します。

まさに、クラス分けを「ご近所さんとの多数決」で決めるようなイメージです。このkの数がモデルの挙動を決める重要な鍵となります。

なぜk-NNが最初のモデルとして優れているのか

  • 直感的で理解しやすい: 複雑な数式がなく、アルゴリズムの動作をイメージしやすいため、機械学習の基本コンセプトを掴むのに最適です。
  • 実装が簡単: Scikit-learnを使えば、数行のコードですぐにモデルを試すことができます。
  • 汎用性が高い: 様々な種類の分類問題に対して、安定した性能を発揮することが多いです。

k-NNモデル構築の全手順

それでは、実際に手を動かしながらモデル構築のステップを追いかけていきましょう。

Step 1: 必要なライブラリの準備

まず、Pythonでk-NNモデルを扱うために必要なライブラリをインポートします。

# データ分析の定番ライブラリ
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Scikit-learnの機能をインポート
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

Step 2: データセットの読み込みと確認

今回は練習用として有名な「Iris(アヤメ)データセット」を使用します。がく片と花びらのサイズから、3つの品種(setosa, versicolor, virginica)のいずれかに分類します。

# データをロード
iris = load_iris()
X = iris.data
y = iris.target

# どのようなデータか確認
print(f'特徴量 (X) の形状: {X.shape}')
print(f'ターゲット (y) のクラス: {np.unique(y)}')

Step 3: 学習データとテストデータへの分割

モデルの性能を正しく評価するため、データを「学習用(訓練用)」と「評価用(テスト用)」に分割します。これは、モデルが未知のデータにどれだけ対応できるか(汎化性能)を測るために不可欠なステップです。

# データを7:3の割合で分割 (random_stateで再現性を担保)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Step 4: モデルの初期化と学習

いよいよKNeighborsClassifierの登場です。モデルのインスタンスを作成し、学習データ(X_train, y_train)を使って学習させます。

# k=3としてモデルを初期化
knn_model = KNeighborsClassifier(n_neighbors=3)

# 訓練データを使ってモデルを学習
knn_model.fit(X_train, y_train)

k-NNにおける.fit()は、複雑な計算をするのではなく、訓練データをメモリ上に記憶するというシンプルな処理を行っています。

Step 5: テストデータでの予測と評価

学習済みのモデルを使い、未知のデータであるX_testの品種を予測し、その結果がどれだけ正しかったかを評価します。

# テストデータで予測を実行
y_pred = knn_model.predict(X_test)

# 1. 正解率 (Accuracy) を計算
accuracy = accuracy_score(y_test, y_pred)
print(f'正解率: {accuracy:.4f}')

# 2. 混同行列で結果を可視化
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

# 3. さらに詳細なレポートを出力
print(classification_report(y_test, y_pred, target_names=iris.target_names))

この評価により、モデル全体の正解率だけでなく、各クラスごとの精度や、どのクラスを間違えやすいかといった詳細な分析が可能になります。

【コピペOK】ここまでの全コード

ここまでの流れを一つのセルで実行できるようにまとめました。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# 1. データの準備
iris = load_iris()
X, y = iris.data, iris.target

# 2. データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 3. モデルの学習
knn_model = KNeighborsClassifier(n_neighbors=3)
knn_model.fit(X_train, y_train)

# 4. 予測と評価
y_pred = knn_model.predict(X_test)
print(f"正解率: {accuracy_score(y_test, y_pred):.4f}")
print("\n分類レポート:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 混同行列の可視化
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix')
plt.show()

モデルの精度を左右する重要パラメータ

KNeighborsClassifierには、モデルの挙動を微調整するためのパラメータがいくつかあります。特に重要な3つを覚えておきましょう。

n_neighbors: kの数(参照するご近所の数)

最も重要なパラメータです。前述の通り、参照する近傍データの数を指定します。この値によってモデルの複雑さが変わります。

weights: 距離による重み付け

  • 'uniform' (デフォルト): k個の近傍データをすべて平等に扱います。
  • 'distance': 距離が近いデータほど影響が大きくなるように、重み付けをして多数決を行います。より近いご近所さんの意見を重視するイメージです。

metric: 距離の計算方法

データ間の「近さ」をどのように計算するかを指定します。

  • 'minkowski' (デフォルト): 最も一般的なミンコフスキー距離。
  • 'euclidean': ユークリッド距離。我々が普段考える直線距離です。
  • 'manhattan': マンハッタン距離。碁盤の目のように、各軸に沿って移動する距離です。

適切なkを見つけるためのヒント

最適なn_neighbors (k) の値はデータによって異なります。一般的には、ループを使っていくつかのkでモデルの精度を検証し、最も良い結果を出したkを採用するという方法が取られます。

経験則として、データ数の平方根 (sqrt(n)) をkの初期値の目安にすることがあります。また、多数決が同数になることを避けるため、奇数を選ぶのが一般的です。

まとめ:k-NNをマスターして分類タスクを得意にしよう

このガイドでは、KNeighborsClassifierを使ったk-NNモデル構築の全手順を解説しました。

  • k-NNは「近くのk個のデータによる多数決」で分類する直感的なアルゴリズム。
  • モデル構築は「データ準備 → 分割 → 学習 → 予測・評価」のステップで進む。
  • n_neighbors (kの値) がモデルの性能を決定づける最重要パラメータ。
  • weightsmetricといったパラメータで、モデルの挙動をさらに調整できる。

k-NNは、そのシンプルさゆえに応用が効きやすく、他の複雑なアルゴリズムを学ぶ上での素晴らしい基礎となります。ぜひこのガイドを参考に、様々なデータセットでk-NNモデルの構築に挑戦してみてください!

コメント

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