[scikit-learn] 10. k近傍法によるクラス分類で決定境界を表示する(KNeighborsClassifier)

matplotlib

はじめに

sklearnのneighbors.KNeighborsClassifierでk近傍法によるクラス分類をすることができる。ここではsklearn.datasets.make_blobsで作成したデータに対してクラス分類を行い、決定境界を表示する方法について説明する。

解説

モジュールのインポートなど

バージョン

データの生成

make_blobsによりデータを作成する。make_blobsについては下記記事で解説した。

[scikit-learn] 1. make_blobsによる分類用データの生成
sklearnのdatasets.make_blobsでクラスタリング用のデータを作成することができる。データポイントはガウス分布に従い生成する。ここでは各種パラメータが生成データに及ぼす影響について説明する。

random_state=4とすることで上下に分離したデータ群を作成した。データを表示すると以下のようになる。

格子状データの作成

細かい間隔の格子状データをテストデータとして分類を行い、その分類結果を塗りつぶし等高線で表示することになる。ここではmeshgridとnp.arangeで間隔が0.05の格子状データを作成する。

k近傍法(k=1)の適用

n_neighborsは近傍点として扱うデータ数の数を指定する。ここでは1とした。
neighbors.KNeighborsClassifierで分類器を作成し、clf.fit(X, y)により訓練用データを分類器に学習させる。
clf.predict()で分類器による予測をテストデータに対して行う。ここではnp.concatenate((xx.ravel()[:,np.newaxis], yy.ravel()[:,np.newaxis]),axis=1)としたデータを入れる。データの形状は(12760, 2)となっている。
Zは1次元の配列で返るので、reshapeでxxと同じ形状にする。

結果の表示

ax.contourf(xx, yy, Z,levels,cmap="turbo",alpha=0.5)で塗りつぶし等高線の境界として、決定境界を表示することができる。
contourにすれば線のみを表示できる。

k=3の場合

近傍データ数を3とした時の決定境界は以下のようになる。

k=5の場合

近傍データ数を5とした時の決定境界は以下のようになる。

k=7の場合

近傍データ数を7とした時の決定境界は以下のようになる。

k=1,3,5,7の結果をまとめて表示

k=1,3,5,7の結果をまとめて表示すると以下のようになる。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

参考

Nearest Neighbors Classification — scikit-learn 0.24.1 documentation
sklearn.neighbors.KNeighborsClassifier — scikit-learn 0.24.1 documentation

コメント