kNN(k-Nearest Neighbor method)とは?k近傍法を分かりやすく解説!!

スポンサーリンク
基礎知識
この記事を読んで分かること
  • kNN(k-Nearest Neighbor method)とは何か
  • kNNのアルゴリズム
  • kNNのメリット・デメリット
  • pythonでのkNNの実装

kNN(k-Nearest Neighbor method)とは?

kNN(k-Nearest Neighbor method)は、覚えたデータを利用するというモデルです。

「学習データでパラメータの最適化を行う」という過程はなく、いきなり本番データの分析を行っていきます。

また、kNNは分類回帰のどちらの問題にも利用することができます。

 

kNNは、他の機械学習手法とは異なり学習フェーズが存在しません

事前に学習して作ったモデルを適応せず、推定フェーズで学習データと未知のデータの関係性を計算していきます。

ロボくん
ロボくん

kNNは、すぐに推定ができて様々な問題に適用できる汎用的な手法なんだよ。

kNN(k-Nearest Neighbor method)のアルゴリズム

kNNでは既存のデータを覚えておき、未知のデータと似ている既存のデータを利用する単純なアルゴリズムになっています。

既存のデータ(学習データ)をベクトル空間にプロットしておき、未知のデータと近いデータをk個取得して多数決を行うアルゴリズムです。

具体的には次のような動作をしていきます。

kNNのアルゴリズム

  1. 既存のデータ(学習データ)をベクトル空間にプロット
  2. 未知データと既存データの距離を計算する
  3. 未知データと近いデータをk個抽出する
  4. 抽出したk個のデータで多数決をして、結果として出力する

kNNのアルゴリズム

 

抽出する近傍点の数kはハイパーパラメータです。

2値分類のときはkを奇数にして多数決が同点にならないようにするのが一般的です。

 

ロボくん
ロボくん

kNNは既存の似ているデータで多数決を取る単純なモデルだね。

アルゴリズムがわかりやすいから、どうやって結果が得られたか後から説明することもできるね。

kNN(k-Nearest Neighbor method)のメリット・デメリット

kNNがどんな処理をしているのかわかってもらえたと思います。

次にkNNのアルゴリズムにはどんなメリットデメリットがあるか見ていきましょう。

kNNのメリット

  • 事前に学習する必要がない
  • アルゴリズムがシンプルなのであらゆる問題に適用しやすい
  • 予測結果がブラックボックス化されていないので理解しやすい

knnのアルゴリズムには学習フェーズが存在しないので、データを準備したらすぐに解析を始めることができます。

また、アルゴリズムがシンプルなので予測結果が人間にも分かりやすく、出力した結果を説明したり分析することができます。

予測結果がブラックボックスにならないというだけでも、他の機械学習手法とは違う大きなメリットになっています。

kNNのデメリット

  • データ量が多い場合、結果の計算に時間がかかってしまう
  • 大量のデータをメモリに保持する必要がある
  • 次元の高いデータではうまく機能しない

knnでは推定のフェーズですべての計算を行います。

推定データと学習データ全ての距離を計算する必要があるので計算量がO(N)でデータ量に伴って計算量がどんどん増えてしまいます。

また、全てのデータの距離を記憶しておく必要があるので、大量のメモリも必要となります。

学習データを木構造を用いて記憶することで効率的に計算することができますが、一般的に大規模なデータセットにkNNは向きません

kNNは「データ量を増やせば、未知のデータの近くには学習データが見つかる」という過程を前提としています。

しかし、高次元のデータでは必ずしも成立しないので、音声データ画像データに対しては他の手法を検討する必要があります。

kNN(k-Nearest Neighbor method)をpythonで実装

kNNを用いて学習した例をpythonで実装してみました。
機械学習のライブラリであるsklearnを用いて実装します。

必要ライブラリのインポート

from sklearn.datasets import make_moons
from sklearn.neighbors import kNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

データの生成

#データ生成
X, y = make_moons(noise=0.3)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

kNN(k-Nearest Neighbor method)のモデルで学習する

#kNNで分類する
model = kNeighborsClassifier()
model.fit(X_train, y_train)#学習
y_pred = model.predict(X_test)#推定
accuracy_score(y_pred, y_test)

結果は

0.9333333333

となり、93%の分類精度となりました。

まとめ

kNN(k-Nearest Neighbor method)とは何かをまとめると以下の3つの特徴を持つモデルです。

  • 未知のデータと学習データの距離を用いたモデル
  • 分類と回帰問題のどちらにも用いることができるモデル
  • シンプルなモデルが元になっているので、結果の透明性があるモデル

コメント

タイトルとURLをコピーしました