ひよこメモ

備忘ブログ Ruby, Rails, AWS, html5, css3, javascript, vim,

k-最近傍法(KNeighborClassifier)

classifier(クラシファイア 分類器):様々なデータを分類していくシステム。
データセット:機械学習においてこの様々なデータの塊のこと。
データポイント:複数の特徴量をまとめたデータ。(行)
特徴量:データポイントを構成する特徴(列)

k-最近傍法。k nearest neighbor。k-NN。
k-最近傍法は「教師あり学習」であり、比較的シンプルな分類器である。

①既存のデータセットをベクトル空間(座標)上に描画する。
ベクトル空間(vector space線形空間):n次元の場合n個のベクトルで表されるもの。
 →2次元の場合2個のベクトルで表されるもの。2次元の座標軸。
ベクトル:向きと大きさをもつ量のこと。数字が縦or横に一直線に並んだもの。平面や空間を走るやじるし。
 大きさをスカラーという。スカラーに向きが加わるとベクトル(vector)と呼ぶ。
 スカラーは「|a|」などの表記。ベクトルABの大きさ=線分ABの長さ。つまり「大きさ」と「長さ」は同じ意味を表す。
 スカラー倍:長さ4のベクトルに10を掛ける。(10a) この10aの大きさは10*4=40である。このようにベクトルにスカラー(長さ・大きさ)を掛けることをスカラー倍と言う。

②kの数を予め決めておく。(k=1, k=3など)
②未知のデータポイントをベクトル空間上に置く。
③未知のデータポイントから距離が最も近い既存データポイントを取得しクラスを記録する。
 距離の算出には一般的にユークリッド距離が用いられる。(難しいから後回し。)
④③をk回繰り返し、記録したクラスから多数決を行い、未知のデータポイントのクラスを決定する。

k-最近傍法を実際にやってみる。
前提:
sk-learnはfit()で訓練データを学習しpredict()で未知のデータを予測する。
kの指定はKNeighborsClassifierの引数n_neighborsで指定する。

#参考:https://qiita.com/fujin/items/128ed7188f7e7df74f2c

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #描画ライブラリ

from sklearn.datasets import load_iris # アヤメ(花)のデータセット

iris = load_iris()
X = iris.data
y = iris.target
pd.DataFrame(X, columns=iris.feature_names).head()

f:id:hiyotama:20210303125441p:plain

#学習データ/テストデータ分け
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# k-NN
list_k = []
list_score = []
for k in range(1, 31):
  knc = KNeighborsClassifier(n_neighbors=k)
  knc.fit(X_train, y_train) #ここで最も近い既存データをk個取得し学習している。

  score = knc.score(X_test, y_test)
  list_k.append(k)
  list_score.append(score)

# 描画
plt.ylim(0.9, 1.0)
plt.xlabel("k")
plt.ylabel("score")
plt.plot(list_k, list_score)

f:id:hiyotama:20210303125543p:plain

アヤメの分類の場合、k値を増やす程精度は落ちていく。

重みつけの種類
uniformとdistanceの2つある。