Part 1: 数学的な準備
Part 2: ベイズの定理
Part 3: ナイーブベイズの紹介
Part 4: 数学的な背景
Part 5: 確率を使った分類
Part 6: Gaussian Naive Bayes
Part 7: Scikit Learnを使ったGaussian Naive Bayes
まずは足し算で使われるΣの、かけ算バージョン、Πについてです。
$$\prod_{i=1}^4 i = 1\cdot 2\cdot 3\cdot 4, $$ これは連続的なかけ算を意味するので、 $$\prod_{i=1}^4 i = 24. $$
与えられた関数を最大にする入力(定義域)を次のような記号で書くことがあります。
$$\operatorname*{arg\,max}_x f(x) := \{x \mid \forall y : f(y) \le f(x)\}$$例えば、f(x)が 1−|x| なら、この関数を最大にするxは0になります。
$$\operatorname*{arg\,max}_x (1-|x|) = \{0\}$$統計に関して解説した付録のなかに、ベイズの定理を紹介したレクチャーがありますので、そちらを先にご覧ください。
ナイーブベイズ(Naive Bayes)は、スパムメールの分類などに実際に利用されている機械学習アルゴリズムです。ただ、その背景を完全に理解するには、数学的な記述が欠かせません。ここでは、細かいところを省略しながら、その本質をご紹介します。
yが目的変数、説明変数が x1 から xn まであるとします。ベイズの定理を使うと、与えられた説明変数を元に、そのサンプルがどのクラスに属するかの確率を次のような式で計算できます。
$$P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots x_n \mid y)} {P(x_1, \dots, x_n)}$$ナイーブベイズのナイーブは、各説明変数が互いに独立であるという仮定から来ています。 $$P(x_i | y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i | y)$$
この仮定のもとでは、すべての i について、式を次のように変形できます。
$$P(y \mid x_1, \dots, x_n) = \frac{P(y) \prod_{i=1}^{n} P(x_i \mid y)} {P(x_1, \dots, x_n)}$$それぞれの変数について、クラスごとの確率を求めればよいので、計算が楽になります。
ナイーブベイズでは、それぞれのクラスに属する確率が計算されるので、最終的には、そのサンプルを、確率が最も大きいクラスに分類します。ここで、arg maxの記号が出てくる分けです。
P(x1, ..., xn) は手元のデータセットに関しては一定の値なので、無視できます。
$$P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y)$$最終的には、もっとも大きな確率が割り当たるクラスに、サンプルを分類します。
$$\hat{y} = \arg\max_y P(y) \prod_{i=1}^{n} P(x_i \mid y),$$説明変数が連続値の場合、これを正規分布に従うものとしてモデル化すると、モデルの構築や計算が楽にです。サンプルデータのアヤメのデータも連続値ですので、後ほどの、Gaussian Naive Bayesを利用します。
$$p(x=v|c)=\frac{1}{\sqrt{2\pi\sigma^2_c}}\,e^{ -\frac{(v-\mu_c)^2}{2\sigma^2_c} }$$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 = datasets.load_iris()
X = iris.data
Y = iris.target
print(iris.DESCR)
まずは、インスタンスを作るところから
model = GaussianNB()
データを、テスト用とトレーニング用に分けます。
from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)
fitを使います。
model.fit(X_train,Y_train)
予測の精度を比較してみましょう。
predicted = model.predict(X_test)
expected = Y_test
metricsが便利です。
print(metrics.accuracy_score(expected, predicted))
There are plenty more resources and types of Naive Bayes Classifiers, For more resources on Naive Bayes, check out the following links: