k-NN(k近傍法)について説明し、Pythonでの分類タスクにおける簡単なモデル構築を紹介します。
k-NN(k近傍法)とは
あるグループAとグループBがあるとして、その人たちの属性がわかっているとき、どちらのグループに属するか分からない新しい人が来たケースを考えます。
ここでその人がAとBのどちらのグループに属するか考えるとき、その人と属性が近いk人を選び、その人たちがグループAに多いのかそれともグループBに多いのかを調べて、多い方を新しい人のグループにするのがk-NNによる分類方法です。k-NNのk
は決定に利用する人数に相当します。k-NNは怠惰学習やとも言われ、訓練データをそのまま覚えて学習させます。
k-NNのモデル構築
k-NNを使ってモデル構築をしてみます。sklearn.neibors
モジュールのKNeighborsClassifier
クラスを使用します。データ例としては乳がんに関するデータセットをload_breast_cancer
関数で取得し使用します。
ここではk
を1から10まで変化させ、訓練データとテストデータの正解率の変化を見ていまきす。k
が小さい時は正解率に差がありますが、6~8あたりで訓練とテストの正解率が近くなります。それ以上増やしてもモデル精度に大きな変化は見られません。精度に改善が見られない場合、あまりkを大きくする必要はないので、本ケースにおいては6~8程度に設定しておくのが良いと考えられます。
# インポート
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
# データセットの読み込み
cancer = load_breast_cancer()
# 訓練データとテストデータに分ける
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, stratify = cancer.target, random_state=0)
# 可視化のためのリスト作成
training_accuracy = []
test_accuracy = []
# 学習
for n_neighbors in range(1, 11):
model = KNeighborsClassifier(n_neighbors=n_neighbors)
model.fit(X_train, y_train)
training_accuracy.append(model.score(X_train, y_train))
test_accuracy.append(model.score(X_test, y_test))
# 可視化
plt.plot(range(1, 11), training_accuracy, label='Training')
plt.plot(range(1, 11), test_accuracy, label='Test')
plt.ylabel('Accuracy')
plt.xlabel('n_neighbors')
plt.legend()