k-NN (k 이웃)의 파이썬 구현

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()

좋은 웹페이지 즐겨찾기