スポンサードリンク



こんにちは。sinyです。

この記事では、機械学習を使ったデータ分類について簡単な事例を交えて解説したいと思います。
今回は、よく機械学習の入門としても登場するアヤメデータ(irisデータとも言います)を使ってK近傍法と呼ばれるデータ分類手法を用いてアヤメデータを分類してみたいと思います。

アヤメと分類方法

今回利用するアヤメデータですが、アヤメは花の品種の1つで、3つの種類があります。

アヤメの種類
  • setosa(ヒオウギアヤメ)
  • Virginica
  • Versicolour(ブルーフラッグ)

また、アヤメの種類は以下の属性によって分類します。

アヤメ分類に利用する4つの属性
  • Sepal Length(がく片の長さ)
  • Sepal Width(がく片の幅)
  • Petal Length(花びらの長さ)
  • Petal Width(花びらの幅)

 

K近傍法とは?

K近傍法とは、未知のデータが与えられた場合に既存データのうち最も近くにあるK個のデータを使って多数決でデータを分類する、という大変シンプルなロジックです。

わかりやすく図にすると以下のようなイメージです。

既存のデータ点が、で、未知のデータがです。

K=1とした場合(上図左側)は、新規データから最も近い既存データに分類します。

続いてK=3とした場合(上図右側)は、新規データから最も近い既存データ3つ()を選択し、その多数決をとってに分類します。

多数決の結果、同数だった場合は重み(データ間の距離)によって判別します。

この手法は、学習モデルを作らないので非常にシンプルな学習ですが、データ量が多くなるについれて計算量が高くなるというデメリットがあります。

 

K近傍法を使ったアヤメデータの分類

今回は、PythonライブライのsklearnでK近傍法を使ってアヤメデータ分類してみます。

sklearnを使うとK近傍法のロジックを簡単に実装することができるので、入門者にもおすすめです。

 

 ※この記事ではPytnon環境の構築や、JupyterNotebook等の使い方については省略しています。
 ※本記事で記載しているコードについてはGITHUBにJupyterNotebook形式で公開しています。

 

まず最初に、必要なライブラリ、モジュールをインポートします。

 

モジュールの概要
  1. from sklearn import datasets 
    →データセットのインポート
  2. import numpy as np 
    →numpyのインポート
  3. from matplotlib.colors import ListedColormap 
    →グラフ描画でカラーマップを利用
  4. import matplotlib.pyplot as plt 
    →matplitolibをインポート
  5. import japanize_matplotlib 
    →matplotlibを日本語化
  6. from sklearn.preprocessing import scale 
    →前処理用のscaleメソッド
  7. from sklearn.model_selection import train_test_split 
    →訓練データ、テストデータに分類する機能
  8. from sklearn.neighbors import KNeighborsClassifier 
    →K近傍法の機能
  9. from sklearn.metrics import accuracy_score 
    →正解率の判定機能

続いて各種パラメータ値の設定を行い、アヤメデータ(IRIS)データをロードします。

 

ソースの説明
  • neighbors = 5     
        →K近傍法のクラス数を指定します(データをいくつのデータ点で分類するか?)
  • random_seed = 1 
        → テストデータをランダムに分割するためのランダムシード
  • test_proportion = 0.3  
        →テストデータの割合を指定。(0.3=30%)
  • iris = datasets.load_iris()  
        →irisデータをsklearnからロードする。
  • d1 、d2  
        →d1,d2に特徴量を指定する。今回のirisデータの特徴量は0,1,2,3の4つ

     Sepal Length(がく片の長さ)→0
     Sepal Width(がく片の幅)→1
     Petal Length(花びらの長さ)→2
     Petal Width(花びらの幅)→3

  • X = iris.data[:, [d1, d2]]   
        → d1,d2を使ってiris.dataから全行、d1,d2列の値だけを取得。
  • y = iris.target
        →iris.tagetで正解データ(ラベル)を取得。
  • X_std = scale(X)
        →入力データを平均0、標準偏差1のデータに正規化。

【補足】
入力データXの形状は(150, 2)になっていて、d1,d2で選択した入力データ(特徴量)のセットが150個あります。

続いて、sklearnのtrain_test_splitメソッドを使って、入力データX_stdと、正解データyを訓練データ(X_train,y_train)とテストデータ(X_test,y_test)に分割します。

次に、以下のコードでK近傍法のインスタンスを生成します。
sklearnを使うと複雑な計算式を実装しなくても1行でK近傍法のロジックを実装できます。

K近傍法のインスタンスを生成したら、fitメソッドに訓練用入力データ(X_train)と、訓練用正解ラベルデータ(y_train)を引数に指定して実行します。

学習が終わったら、分類結果を表示してみます。
正解率は、sklearnのaccuracy_scoreメソッドにaccurasy_score(正解ラベル,予測結果ラベル)の形で渡してあげると正解率を算出してくれます。

今回は、特徴量(d1,d2)として0[Sepal Length(がく片の長さ)]と1[Sepal Width(がく片の幅)]を選択してK近傍法によるクラス分類を実施してみましたが、結果は以下のようになりました。

  • クラスタ数=5,特徴選択=0,1
  • train dataの正解率:85.7%
  • test dataの正解率:68.9%

分類結果の可視化

最後にデータ分類結果を可視化して見ると、以下のようなクラス分けされた図になりました。


上図が、K近傍法を使って訓練データを分類した結果、下図がテストデータの分類結果になっています。
プロットされた点(×)がデータセットの種類毎のアヤメデータです。
グラフの見方は、背景色に対してプロットされた色が違う部分が「誤分類」されているデータです。

K近傍法によってX軸とY軸(特徴量に選択した2つのデータ)を0.2刻みで入力データに与えた場合に、K近傍法で分類された結果(アヤメの3種類のいづれかに分類される)によってデータ点を赤、青、緑に塗りつぶしています。

0.2刻みと細かいので、見た目上は背景色として色付けされています。

下図では、test dataの正解率が68.9%ということもあり、誤分類されているデータがぽつぽつとあるのがわかると思います。

さてさて、上記のクラス分類図ですがmatplotlibを使うと描くことができるのですが、コードがちょっと長いのと1つ1つ説明するのは時間がかかってしまうので、この記事では割愛します。

ソースコードだけ掲載します。
(コメントも多めにつけてあるので読んでもらえれば何をやってるかは大体わかると思います)

 

最適な近傍点を分析する

つづいて、K近傍法法で指定するK近傍法パラメータK(neighbors)の値を動的に変化させて、正解率をプロットしてみます。
※特徴量は0,1を選択したまま

結果は以下のようになりました。
K=10前後が一番結果がよく、それ以上やみくもに増やしても効果がないことがわかりますね。

特徴量を変えてみる

今度は分類に使う特徴量を変えてみます。

これまでは、特徴量としてがく片の長さ(=0列目のデータ)とがく片の幅(=1列目のデータ)を使っていましたが、花びらの長さと幅を使ってK近傍法による分類を実施してみます。

利用する特徴量は以下のソースコードで指定しているので、d1,d2の値を0,1→2,3に変更するだけでOKです。

neighbors の値は5のままで実行してみます。

結果は、以下の通り正解率が大幅に上昇しました。

選択する特徴量によって分類精度が大きく変わるということですね。
機械学習では、選択する特徴量によって精度が大きく変動する点がポイントになりそう

選択する特徴量によって分類精度が大きく変わるということですね。
機械学習では、このように選択する特徴量によって精度が大きく変動する点がポイントになりそうですね。

  • クラスタ数=5
  • 特徴選択=2,3
  • train dataの正解率:98.1%
  • test dataの正解率:95.6%

特徴量を2,3に変更した場合の分類結果を可視化したのが下図です(ラベルはガクの長さと幅のまま修正してません)。

だいぶきれいに分離されているのが図からもわかりますね!

ついでにこの場合にKの値を変動させたグラフもプロットしてみました。
最適なKは3前後くらいのようですね。
今回は、K=60過ぎまで一定で、それ以上になるとガクンと精度が落ちることもわかりました。

以上、K近傍法によるアヤメデータ分類でした。

機械学習に興味を持っている方は、本記事を参考にぜひデータ分類にチャレンジしてみてください!

 

おすすめの記事