ナイーブベイズ分類をIrisデータセットへの実装
こんにちは、ワタルです。
はじめに
このエントリでは、機械学習のサンプルデータとしてよく用いられるIrisのデータに対して、ナイーブベイズ分類を実装してみます。 サンプルデータは、Iris(アヤメ)という植物のデータで、3種類のアヤメについて、それぞれ50サンプルのデータに4つの特徴量が含まれています。
ナイーブベイズ分類をとてもかんたんに表現すると、それぞれの分類先に属する確率を計算し、確率が最も大きいクラスにそのサンプルを分類します。
数字は適当ですが、このようなイメージです。 例えば、Aさんがどのクラスに属するが分類してみたいとします。
Aさんが、クラス1に属する確率は70%、クラス2に属する確率は30%、クラス3に属する確率は50%と求めることが出来た時、Aさんはクラス1に属すると出力されます。
数学的な理解は、こちらのページがおすすめです。
第10回 ベイズ確率:機械学習 はじめよう|gihyo.jp … 技術評論社
それでは、実際に実装してみます。
おまじない
import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt import seaborn as sns #Gaussian Naive Bayes のためのコード from sklearn import datasets from sklearn import metrics from sklearn.naive_bayes import GaussianNB
Irisデータセットのインポート
from sklearn import datasets iris = datasets.load_iris() X = iris.data Y = iris.target
データセットの分割
#データを、テスト用とトレーニング用に分けます。 from sklearn.cross_validation import train_test_split X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)
ナイーブベイズ分類にて学習
#インスタンスの作成 model = GaussianNB() #訓練データで学習 model.fit(X_train,Y_train) >>> GaussianNB(priors=None)
予測精度の確認
#分割しておいたテストデータを用いて、精度を確認します predicted = model.predict(X_test) expected = Y_test print(metrics.accuracy_score(expected, predicted)) >>> 1.0
おぉ、1.0になりました。 ついでにお試しとして、データセットの分割具合を変えて、精度スコアを可視化してみましょう。
精度スコアの可視化
predict_score = [] #テストデータを10%から90%まで変化させて、そのスコアを出力します for size in np.arange(0.1, 1,0.1): X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0,test_size = size) model = GaussianNB() model.fit(X_train,Y_train) predicted = model.predict(X_test) expected = Y_test predict_score.append(metrics.accuracy_score(expected, predicted)) X_test_size = np.arange(0.1, 1,0.1) df_score = DataFrame(predict_score,columns=['predict_score'],index=X_test_size) df_score >>> predict_score 0.1 0.933333 0.2 0.966667 0.3 1.000000 0.4 0.933333 0.5 0.946667 0.6 0.944444 0.7 0.933962 0.8 0.933333 0.9 0.948148
#プロットします plt.plot(X_test_size,predict_score,color = 'b') plt.ylim(0.92,1.01) plt.xlabel("test_size") plt.ylabel("predict_score") plt.xticks( np.arange(0.0, 1.0, 0.1) ) plt.hlines([1], 0, 1, linestyles="dashed") plt.show() >>>
訓練データは多ければ多いほどよいわけではないことを体験することができましたね。
さいごに
今回は、機械学習のサンプルデータとしてよく用いられるIrisのデータに対して、ナイーブベイズ分類を実装し、テストデータの分け方によって精度が変わる事を確認してみました。
お疲れ様でした!
それじゃー、また。