[mathjax]
ナイーブベイズは文書データの分類に用いられる手法で,単純な理論ながら高いパフォーマンスを誇ることで知られています.【ナイーブベイズ:二項分布・多項分布に基づいたイベントモデル】では,spam分類を例に,カテゴリ数が二つの場合を解説しました.本記事では,カテゴリ数が一般の場合について,式展開を見ていきます.
ナイーブベイズ:二項分布・多項分布に基づいたイベントモデル
本記事は,以下の文献を参考にしています.
1. MAP推定
文書のカテゴリを,( c in mathbb{N}_C = { 1, ldots, C } )とします.ボキャブラリが(N)単語からなるとし,各単語に対応する特徴量(Bernoulliなら出現したか否かのブール代数,Multinominalであれば出現回数)を(w_n)とすれば,各文書は以下のようなベクトルで表すことができます.
$$
large
vec{w} = (w_1, ldots, w_N)
$$
さて,新しい文書(vec{w})に対して,カテゴリ(c)を推定したいとします.ナイーブベイズでは,事後確率(p(c|vec{w}))を最大化します.これを最大事後確率推定(maximum a posteriori, MAP)と呼びます.事後確率という名前が付いているのは,文書(vec{w})という証拠が観測された「後」に(c)の起こりやすさの度合いを表現しているのが事後確率であるからです.MAP推定の式は以下のようになります.
$$
large
hat{c} = arg max_{cinmathbb{N}_C} p(c|vec{w}) = arg max_{cinmathbb{N}_C}mathrm{Pr}(c)p(vec{w}|c)
$$
二つ目の等式は,ベイズの定理から導かれたものであり,(mathrm{Pr}(c))はカテゴリ(c)の事前確率, (p(vec{w}|c))は尤度と呼ばれています.事後確率を推定するには,事前確率(カテゴリ(c)の出やすさ)と尤度が分かっている必要があります.そして,ナイーブベイズでは,この事前確率と尤度を,訓練データから最尤推定により求めます.また,【ナイーブベイズ:二項分布・多項分布に基づいたイベントモデル】で言及した「ナイーブな仮定」,及びイベントモデル(Bernoulli, Multinomial)は,尤度を求める際に使われます.
2. カテゴリcの事前確率の求め方
カテゴリcの事前確率を,訓練データから最尤推定するとしましょう.最尤推定を用いると,サイコロを100回振って,6の目がそのうち15回出たならば,6の目が出る確率は(15/100)であると推定できます.そして前回の記事で言及したスムージング(平滑化)は,スムージング係数を用いて,この確率を( frac{15+alpha}{100+6alpha})のように求めることでした(分母の係数にかかるのはクラスの数です).
サイコロの例と同じように,ナイーブベイズでは,訓練データ1000件のうち,カテゴリcの文書が200件あったとすれば,カテゴリcの事前確率は(frac{200}{1000} = frac{1}{5} )であると推定します.カテゴリcの事前確率を(theta_c)とすれば,次のように一般化されます.
$$
large
hat{theta}_c = frac{l_c+alpha}{l+Calpha}
$$
ここで,(l)は総文書数,(lc)はカテゴリcに属する文書数,(C)はカテゴリの総数です.ラプラススムージングでは,(alpha=1)とします.
3. 尤度の求め方:イベントモデルとナイーブな仮定
3.1 Bernoulli event model
ベルヌーイイベントモデルでは,各単語が出たか(1)/否か(0)のみを特徴量として保持します.訓練データから最尤推定(=学習)するのは,カテゴリ(c)が単語(v)を生成する確率 (phi_{c, v} = mathrm{Pr}(w_v=1|c))です.
ナイーブな仮定(以下の一つ目の等式)を導入すると,尤度は次のように求まります.(w_v)は,単語(v)が出たか否かを格納するブール代数です.
$$
large
begin{align}
p(vec{w}|c) &= prod_{v=1}^V mathrm{Pr}(w_v|c) \
&= prod_{v=1}^V phi_{c,v}^{w_v} (1-phi_{c,v})^{1-w_v}
end{align}
$$
ベルヌーイ試行は,コインを投げて表/裏が出る事象をイメージすると良いでしょう.コイン投げという事象は,一回一回の試行が独立であるという点で,「ナイーブ」です.文書を生成するとき,まずはカテゴリ(c)を決めます(ちなみに,このカテゴリの決定過程をモデル化しているのが,カテゴリの事前確率です).ベルヌーイイベントモデルでは,カテゴリ(c)の中に(V)枚の異なるコインがあって,一つ一つコインを投げて表が出たら単語を文書に含める,といったような文書生成のモデル化をしています.
そして(phi_{c, v})は次のように訓練データから最尤推定+平滑化します.
$$
large
hat{phi}_{c, v} = frac{m_c^{(v)}+beta}{l_c+2beta}
$$
ここで,(m_c^{(v)})は,カテゴリcの文書のうち,単語(v)を含んでいるものの数を表します.
3.2 Multinomial event model
多項分布イベントモデルでは,各単語の出現回数をそのまま文書ベクトルに格納します.ベルヌーイと同じく,訓練データから最尤推定(=学習)するのは,カテゴリ(c)が単語(v)を生成する確率 (phi_{c, v} = mathrm{Pr}(v|c))です.
多項分布はベルヌーイに比べて少しイメージしづらいかもしれませんが,各面の出る確率が均等でない歪なサイコロを想像してください.サイコロに関しても,一回一回の試行が独立である,という点で「ナイーブ」です.サイコロを10回振ったとして,2の目が3回,4の目が5回,5の目が2回,といったように出る確率は何でしょうか?高校数学で次のように求められます.
$$
(面の出かたの順列の総数)times prod_{各面} (各面が出る確率)^{各面が出た回数}
$$
上の式と照らし合わせると,尤度が次のように定式化されることが分かりやすいと思います.(n^{(v)})はある文書において,単語(v)が出現した回数を表しています.
$$
large
begin{align}
p(vec{w}|c) &= prod_{v=1}^V mathrm{Pr}(w_v|c) \
& = frac{(sum_{v=1}^V n^{(v)})!}{prod_{v=1}^V n^{(v)}!} prod_{v=1}^V phi_{c, v}^{n^{(v)}}
end{align}
$$
こちらもサイコロによるモデル化との対応を考えてみましょう.(V)面を持つ歪なサイコロが(C)種類あります.カテゴリ(c)を最初に決めたら,対応するサイコロを選んで,文書長(文書に含まれる単語の総数)の回数だけサイコロを振ります.各面が出た回数に応じて,文書に単語を入れていきます.これが多項分布によるナイーブな文書生成のモデル化です.
そして(phi_{c, v})は次のように訓練データから最尤推定+平滑化します.
$$
large
hat{phi}_{c, v} = frac{n_c^{(v)}+beta}{sum_{v=1}^V n_c^{(v)}+Vbeta}
$$
ここで,(n_c^{(v)})はカテゴリ(c)の文書において単語(v)が出現した総数を示します.
4. まとめ
今回は,カテゴリ数が一般の場合についてナイーブベイズの式展開をおさらいしました.
以上に解説した,イベントモデルによる文書生成の過程モデリングは次のような図にまとめられます(引用元: Shuo, 2017).
ナイーブベイズでは,事後確率を最大化します(MAP推定).事後確率は,尤度と事前確率の積に比例しますから,事後確率を最大化するには,尤度×事前確率を最大化します(ちなみに,事前確率を考慮にいれず,尤度を最大化するのが最尤推定です).尤度は,訓練データから最尤推定した変数(phi_{c, v})から,ナイーブな仮定とイベントモデルの導入により推定します.事前確率は,訓練データからそのまま最尤推定します.最尤推定を補正するのが平滑化(スムージング)です.
次回は,この数式展開をもとに,ナイーブベイズのモデルをPythonで実装していきます.
ナイーブベイズ:Pythonによるスパムフィルタの実装