ナイーブベイズとは
多クラス分類用。スパムメールの分類とかに使われているのが有名。
ベイズの定理を使ったクラスに属する確率算出
yを目的変数、x($x_{1}$〜$x_{n}$)を説明変数とすると、ベイズの定理を使うと、与えられたサンプルがどのクラスに属するかの確率を以下で計算できる。
P(y | x_{1},・・・x_{n}) = \frac{P(y) * P(x_{1},・・・x_{n} | y)} {P(x_{1},・・・x_{n})}
ちなみに、「ナイーブ」とは説明変数が互いに独立であるという仮定をすることから来てる。説明変数が互いに独立とは以下を意味する。
P(x_{i} | y, x_{1},・・・,x_{i+1},・・・,x_{n}) = P(x_{i} | y)
「yが起きた時の$x_{i}$は、他のxの状態に影響されませんよ」ってこと。
なんでこんなことをするかというと、ベイズの定義の右辺の分子の式が簡単になるから。
独立性を仮定することで、$P(x_{1},・・・x_{n} | y) = \prod_{i=1}^n (x_{i} | y)$と書けるので、
最終的なベイズの定理の式が以下となる。
P(y | x_{1},・・・x_{n}) = \frac{P(y) * \prod_{i=1}^n (x_{i} | y)} {P(x_{1},・・・x_{n})}
この時の分母の$P(x_{1},・・・x_{n})$は固定値になるので、クラスに属する確率の算出には考えなくてもOKなので無視しちゃえる。
P(y | x_{1},・・・x_{n}) \propto P(y) * \prod_{i=1}^n (x_{i} | y) \\
($\propto$は比例するって意味の記号です。)
これで、各クラスに分類される確率が出るので、それが一番高い確率だったクラスと判別すればクラスの推定が可能。
\hat{y} = {\arg \max}_{y} P(y) * \prod_{i=1}^n (x_{i} | y)
Gaussian Naive Bayes(ガウシアンナイーブベイズ)
説明変数が連続値の場合、これが正規分布に従うと仮定する手法を、特にGaussian Naive Bayesと呼ぶ。
その時のクラスに属する確率は、以下で表せる。
p(x = v | c) = \frac{1}{\sqrt{2 * \pi * \sigma_c^{2}}} * \mathrm{e}^{-\frac{(v - \mu_{c})^{2}}{2 * \sigma_c^{2}}}
やってみる(sklearn)
irisのデータセットを使って、ガウシアンナイーブベイズをやってみる。
do_gaussian_naive_bayes.py
from sklearn import datasets # データロード用
from sklearn.cross_validation import train_test_split # 学習/テストデータ作成用
from sklearn import metrics # 精度評価用
from sklearn.naive_bayes import GaussianNB # ガウシアンナイーブベイズ実行用
# データ用意
iris = datasets.load_iris()
X = iris.data
Y = iris.target
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)
# ガウシアンナイーブベイズ実行
model = GaussianNB() # インスタンス生成
model.fit(X_train, Y_train) # モデル作成実行
# 予測実行
predicted = model.predict(X_test) # 予測実行
metrics.accuracy_score(Y_test, predicted) # 精度計算
> 1.0
精度100%だった。