機械学習 はじめよう

第2回 確率の初歩

この記事を読むのに必要な時間:およそ 7.5 分

ナイーブベイズによる文書分類

最後に,ここまでで解説した事後確率と独立性の仮定を使って得られる,文章をカテゴリごとに分類するためのモデルを紹介しましょう。

X を「文章のカテゴリ⁠⁠,Y1, Y2, …… を「文章に単語が含まれるかどうか」を表す確率変数とします。Y の添え字ごとに対応する単語はあらかじめ決まっているものとします。

gihyo.jpには「デベロッパステージ」⁠アドニミストレータステージ」⁠WEB+デザインステージ」というコーナーがありますので,これを文書のカテゴリとして考えましょう。

簡単のため「デベロッパステージ」「アドニミストレータステージ」の2つのカテゴリに制限し,各ステージの記事の割合を X の確率とすれば良さそうです。実際の値は,次のようになっていました。

p(X=dev) = 0.652
p(X=admin) = 0.348

ただし,確率変数 X=dev は「デベロッパステージ」を,X=admin は「アドミニストレータステージ」を指すものとします。

ここで条件付き確率を使うと,⁠デベロッパステージでは⁠プログラム⁠という言葉をよく使いそうだけど,アドニミストレータステージではあまり使わなさそう」といった情報を数値化することができます。

そこで,文章に⁠プログラム⁠が含まれる確率(=Y1)を各ステージごとに調べてみました。

p(Y1=1|X=dev) = 0.271
p(Y1=1|X=admin) = 0.136

条件付き確率 p(Y1=1|X=dev) は「デベロッパステージの文章で,⁠プログラム⁠が含まれる確率」です。X=admin の方も同様です。

確かに p(Y1=1|X=dev) > p(Y1=1|X=admin) となっていますね。

同じように,確率変数 Y2「文章に⁠アプリケーション⁠が含まれる」として,その確率を求めておきましょう。

p(Y2=1|X=dev) = 0.172
p(Y2=1|X=admin) = 0.523

それでは「⁠⁠アプリケーション⁠は含まれているが⁠プログラム⁠は含まれていない文書」があったときに,それがどのカテゴリの文書かを判断したいとします。

この条件に対応する確率変数は Y1=0, Y2=1 ですが,カテゴリを表す X の値はまだわかっていません。ここで,p(X=dev|Y1=0, Y2=1) と p(X=admin|Y1=0, Y2=1) を求めれば,その確率の大きい方が「信用できる X の値」をさしている,と判断することができます。

文章を書くときに,中身を書いてからカテゴリを考える,なんてことは普通ありませんよね。つまり,p(X|Y1, Y2) はまさに事後確率であり,これを計算することは,実際にそこにあるもの(観測値)から隠れた情報(例えば「この文章はデベロッパーステージに載せるつもりで書いたよ!⁠⁠)を推測する手段であるわけです。

この一連の流れが,統計的機械学習の代表的な考え方の一つになっています。

ベイズの公式を使うと事後確率を求める式を得られますが,乗法定理を使って同時分布を2通りに展開した方が,魔法を使ったわけではないことが目に見えてわかりやすいでしょう。

p(X, Y1, Y2)
= p(X|Y1, Y2) p(Y1, Y2)
= p(Y1, Y2|X) p(X)

第2式と第3式から,p(X|Y1, Y2) は次の式で求めることができます。

画像

式の右辺を計算できるか考えてみましょう。

分子にある p(Y1, Y2|X) について,Xが与えられているときに Y1, Y2 が独立である(これを「条件付き独立」と言います)と仮定すると,先ほどの同様の議論から p(Y1, Y2|X) = p(Y1|X) p(Y2|X) が成り立ちます。

p(X) と p(Y1|X) たちはわかっていましたから,これで右辺の分子は求めることができました。

次に分母の p(Y1, Y2) ですが,これは分子を「Xについて周辺化」することで求められます。

具体的には,乗法定理から p(Y1, Y2|X) p(X) = p(X, Y1, Y2) が言え,ここから加法定理を使ってXを消すと p(Y1, Y2) になります。最初のほうで「機械学習では加法定理と乗法定理を繰り返し繰り返し使う」⁠加法定理は周辺化とも言う」と言及していたことを思い出してくれました?

ただし,この分母の p(Y1, Y2) には X が入っていない( X によらない)ので,⁠p(X|Y1, Y2) が一番大きい X を求めたい」だけであれば,実は分子だけを比較するので事足ります。

それでは最後に,⁠アプリケーション⁠は含まれているが⁠プログラム⁠は含まれていない文書⁠⁠,つまり Y1=0, Y2=1 が与えられたときの事後確率を計算してみましょう。

まず X のそれぞれの値について,分子を求めます。

p(Y1=0, Y2=1|X=dev) p(X=dev)
= (1 - 0.271) * 0.172 * 0.652
= 0.082

p(Y1=0, Y2=1|X=admin) p(X=admin)
= (1 - 0.136) * 0.523 * 0.348
= 0.157

分母はこれを周辺化したもの,つまり2つの値を足すと得られます。

p(Y1=0, Y2=1)
= p(X=dev, Y1=0, Y2=1) + p(X=admin, Y1=0, Y2=1)
= 0.082 + 0.157
= 0.239

そして,事後確率は次のようになりました。

p(X=dev|Y1=0, Y2=1)
= p(Y1=0, Y2=1|X=dev) p(X=dev) / p(Y1=0, Y2=1)
= 0.082 / 0.239
= 0.343

p(X=admin|Y1=0, Y2=1)
= p(Y1=0, Y2=1|X=admin) p(X=admin) / p(Y1=0, Y2=1)
= 0.157 / 0.239
= 0.657

どちらかより適したカテゴリと判断できるか,もうおわかりですね。

ここで用いた「条件付き確率のもとでの独立性」「条件付き独立」あるいは「ナイーブベイズ」⁠単純ベイズ」と呼びます。ナイーブベイズを仮定した今回のモデルは「ナイーブベイズモデル⁠⁠,それを用いたスパム判定が「ベイジアンフィルタ」です(ベイズさんの名前を連呼しすぎですね⁠⁠。

もちろん,ここでの「条件付き独立」はあくまでも仮定であり,本当は独立ではありません。しかしこの大胆な「近似」にもかかわらず,ナイーブベイズは十分精度の高い判断が行えることが知られています。簡単な計算でよい結果の出る「いいモデル」ということになります。

実際,ナイーブベイズは文書分類やスパムフィルタにとてもよく使われる手法です。ナイーブベイズは,カテゴリや単語の種類が2個ではなくもっと一般の場合についても同様の方法で考えることができます。

次回の実践編では,ナイーブベイズを題材に,確率の計算をどのように実装するかを紹介します。

著者プロフィール

中谷秀洋(なかたにしゅうよう)

サイボウズ・ラボ(株)にてWebアプリの連携や自然言語処理を中心に研究開発を行いながら,英単語タイピングゲームiVocaをサービス提供している。参加した懇親会はいつもなぜかRESTとExcelの話になる。