筋肉で解決しないために。

日々出会うモノに対する考察をしたり、主に以下のテーマに関して書いています。 データサイエンス/人工知能/AI/機械学習/DeepLearning/Python//数学/統計学/統計処理

ナイーブベイズ分類を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()

>>>

f:id:watarumon:20180713152426p:plain

訓練データは多ければ多いほどよいわけではないことを体験することができましたね。

さいごに

今回は、機械学習のサンプルデータとしてよく用いられるIrisのデータに対して、ナイーブベイズ分類を実装し、テストデータの分け方によって精度が変わる事を確認してみました。

お疲れ様でした!

それじゃー、また。