機械学習: K近傍方の実装

1.  はじめに ~K近傍方

・あるデータが与えられたとき、そのデータに最も近い距離のK個の平均からデータを予測する
・最も近い距離は、ユークリッド距離を用いる
・クラス分類で使われ、機械学習の中でも簡単

2.  ~pythonでK近傍方の実装

使用するライブラリをインポート

import mglearn
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

今回もsklearnからアヤメのデータを読み込みデータフレームとして可視化します。

iris = load_iris()
iris
df = pd.DataFrame(iris.data, columns = iris.feature_names)
df['target'] = iris.target
df.head()

f:id:shiba147:20190929095949p:plain
データの中身を確認します

df.shape
(150, 5)

数値データだけではわかりにくいのでプロットします

mglearn.discrete_scatter(iris.data[:, 0], iris.data[:, 3], iris.target)

f:id:shiba147:20190929100404p:plain
三色の点は、アイリスの種類を表しています
次に学習用データとテストデータに分類してfit関数を呼び出して学習させます

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, stratify=iris.target)
clf = KNeighborsClassifier(n_neighbors=2).fit(X_train, y_train)
clf.predict(X_test)

f:id:shiba147:20190929100910p:plain
次に近傍数が2の場合はどれくらい予測できているのかを確認します

clf.predict(X_test) == y_test

f:id:shiba147:20190929101044p:plain
高い精度で予測できていることが分かります
次は、score関数を用いて近傍数が20の場合はどれくらい学習出来ているか確認します

clf_20 = KNeighborsClassifier(n_neighbors=20).fit(X_train, y_train)
clf.score(X_test, y_test)

f:id:shiba147:20190929101304p:plain
かなり高い精度であることが確認できます
近傍数が1~20までの場合をfor文で実行してみたいと思います

for n_neighbors in range(1, 21):
    clf = KNeighborsClassifier(n_neighbors=n_neighbors).fit(X_train, y_train)
    print("Test set accuracy : n_neighbors={}, {:.3f}".format(n_neighbors, clf.score(X_test, y_test)))

f:id:shiba147:20190929173637p:plain
今回は、pythonでK近傍方を実装してみました。