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()
#学習データ/テストデータ分け 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)
アヤメの分類の場合、k値を増やす程精度は落ちていく。
重みつけの種類
uniformとdistanceの2つある。