Pythonで機械学習-k-最近傍法-


k-最近傍法

今回のテーマは、k-最近傍法です。
機械学習の分類問題で、一番簡単なアルゴリズムです。

*ここでは、近傍の距離の求め方、アルゴリズム等には触れません。今後触れていけたらな思います。

予測は、訓練データの中から、テストデータに1番近い点つまり、最近傍点を見つける
kとは、近傍点の数を示す。
最も多く現れたクラスをその点に与える。多数派のクラスを採用する。

KNeighbors分類器は、近傍点の数は3,5程度の大きさで十分である。
距離の計算は、ユークリッド距離を用いるのが一般的

k最近傍法は、アルゴリズムは理解しやすい
処理速度が遅く、多数の特徴量を扱うことができないため、実際には殆ど使われていない

k-最近傍法の精度グラフ

sklearn.neighbors.KNeighborsRegressor

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import accuracy_score

cancer = load_breast_cancer()
 
train_X, val_X, train_y, val_y = \
train_test_split(cancer.data, cancer.target, random_state=0)
 
training_accuracy = []
test_accuracy = []
 
neighbors_settings = range(1,11)
for n_neighbors in neighbors_settings:
    clf = KNeighborsClassifier(n_neighbors=n_neighbors)
    clf.fit(train_X, train_y)
    
    training_accuracy.append(accuracy_score(clf.predict(train_X), train_y))
    test_accuracy.append(accuracy_score(clf.predict(val_X), val_y))
     
plt.plot(neighbors_settings, training_accuracy, label="training accuracy")
plt.plot(neighbors_settings, test_accuracy, label="test accuracy")
plt.ylabel("accuracy")
plt.xlabel("n_neighbors")
plt.legend()

結果

おまけ

コード

import numpy as np
import mglearn
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston

boston = load_boston()
X, y = mglearn.datasets.load_extended_boston()

mglearn.plots.plot_knn_classification(n_neighbors=1)

結果

2~4最近傍

2最近傍

3最近傍

4最近傍

感想

k-最近傍法の理論(考え方)は、分かりやすいと思います。
ただ、ここでは数理的な理論には触れていない

理解しやすさと引き換えに、多数の特徴量が扱えないなどの制限があり、利用されていないようです。

参考書


Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎