K近傍法(クラス分類 )(KNeighbors Classifier)【Pythonとscikit-learnで機械学習:第4回】

クラス分類問題において、K近傍法による識別手法を実装・解説します。

本シリーズでは、Pythonを使用して機械学習を実装する方法を解説します。

また各アルゴリズムの数式だけでなく、その心、意図を解説していきたいと考えています。

K近傍法(KNeighbors Classifier)は、以下のscikit-learnマップの黒矢印に対応します。

[scikit-learnのマップ]

START→データが50以上→カテゴリーデータ→ラベルありデータ→データ数10万以下→Linear SVCがうまくいかない→[K近傍法]

K近傍法は識別平面の式を生成しないタイプのクラス分類手法です。

式を生成しないので、ノンパラパラメトリックモデルであり、怠惰学習と呼ばれたりもします。

実装例

まずはじめに実装例を紹介します。

使用するデータは第2回のカーネル近似と同じくXORの分類データです。

これに対してK近傍法を行うと、以下のような結果となります。

カーネル近似のときより、キレイに識別面ができ、平均正答率も高いです。

コードは以下の通りです。

コードに関してはカーネル近似やLinear SVCのときとほぼ同じです。

今回は正規化が既にされているのでしていませんが、正規化は必須です。

解説5の部分だけ異なります。

#解説 5:機械学習で分類する—————————————————
n_neighbors = 5
clf_result=neighbors.KNeighborsClassifier(n_neighbors, weights = ‘distance’)

識別器としてKNeighborsClassifierを使用します。

識別したい点から何点の近傍を考慮するのかを、n_neighbors = 5で設定しています。

またweightsは近傍にあった5点を評価するさいに、’uiform’だと点までの距離を考慮しないです。

一方weightsを’distance’にすると距離も考慮して、分類を決定します。

それでは「結局、K近傍法って何をやっていたの?」を説明します。

K近傍法の心

正確な情報は以下をご覧ください。

scikit-learnのNNeighborsの解説ページ

scikit-learnのKNeighbors Classifierの解説ページ

K近傍法では識別したいデータ点から、距離が近いK点の学習データを探します。

そしてK点のうち一番ラベルが多かったクラスを識別結果とします。

ただそれだけの手法です。

アルゴリズムは非常に単純ですが、割と精度が出る面白い手法です。

ただし、欠点があります。

それは識別平面が式で書けないことです。

(ノンパラメトリック手法と呼びます)

そのため、新たな点を分類したい場合、学習データすべてと距離を計算する必要があります。

多くの機械学習では、学習に時間がかかっても識別は一瞬でできるのですが、K近傍法では識別に時間がかかるという欠点があります。

(怠惰学習と呼びます)

また識別平面の式がないので、どのパラメータがどう重要なのかの意味付けが得られにくいです。

ですが、ただ分類したいだけなら非常に強力な手法なので頭に入れておくと良いと思います。

以上、Pythonとscikit-learnで学ぶ機械学習入門|第4回:クラス分類 -K近傍法-でした。

次回は、カーネルSVCについて解説します。

【目次】Python scikit-learnの機械学習アルゴリズムチートシートを全実装・解説
scikit-learnのアルゴリズムチートマップで紹介されている手法を、全て実装・解説してみました。 ...