HOJI-CHAN’s diary

自己学習の備忘録

ナイーブベイズ

教師あり学習の一種であるナイーブベイズについて、少し簡単なメモを残しておきます。

分類器の目標は、特徴変数{ X_1,X_2,\cdots,X_n}が与えられた時に、このデータがどの分類に属すか({ C=0? or 1? or 2?})を判定することです。
(たとえば、irisデータの場合、{ X_i}に相当するものがsepal length sepal width, petal length, petal width
{C}に相当するものが、species。)

条件付き確率({ P(C=i|X_1,X_2\cdots,X_N)(i=0,1,2)}:すなわち、データが与えられた時に{C=i}である確率)をモデル化する手法の一つがナイーブベイズです。
(詳細は割愛しますが、モデル化の際にベイズの定理を用いていているものです。)

SVMも有名ですが、これは識別関数を求めにいくという部分で手法が異なります。

irisのデータで確認してみます。

from sklearn import datasets
from sklearn.cross_validation import train_test_split
from sklearn.naive_bayes import GaussianNB
import matplotlib.pyplot as plt

# import iris data 
iris = datasets.load_iris()
X = iris.data
Y = iris.target

#訓練データとテストデータを作成
X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=0.5,random_state=0)

nb=GaussianNB()
nb.fit(X_train,y_train)

y_pred=nb.predict(X_test)

fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)

ax1.scatter(X_test[:, 0], X_test[:, 1], c=y_pred)
ax1.set_xlabel('x1')
ax1.set_ylabel('x2')
ax1.set_title("Predict")

ax2.scatter(X_test[:, 0], X_test[:, 1], c=y_test)
ax2.set_xlabel('x1')
ax2.set_ylabel('x2')
ax2.set_title("Actual")
fig.tight_layout()

※実際は、特徴変数は2変数ではありませんが、簡単のため2軸でプロットしています。
f:id:HOJI-CHAN:20170905121635p:plain

正解率(=(正しく分類できた数)/(全体数))=94.667%

nb.score(X_test, y_test)