EPG's BLOG

某金融会社の社内SE。気になったことをちょいちょい書いていきます

データサイエンス講義 4章「スパムフィルタ、単純ベイズ、データランプリング」

前回までは、「見たままモード」により作成しておりましたが、今回から「はてな記法モード」に変更いたしました。
理由は、細かい数式をプレーンテキストで書くと、訳が分からなくなってしまったため(笑)

さて、今回はスパムフィルタを対象とし、ベイズについて。

データサイエンス講義

データサイエンス講義

4.1.1 なぜ線形回帰でスパムフィルタを構築できないのか

■前提環境
データセット、行列の各行:各電子メールに対応
特徴(feature):各単語
(e.g.) [バイアグラ, ミーティング] = [0, 1]
トレーニングデータ:スパムかどうかのラベル付けされたデータ

■線形回帰にて構築できない2つの理由
1.判定結果は、「0(スパムでない)」か「1(スパムである)」の2値。
⇒線形回帰は、連続型が対象。
⇒これが一番大きな理由。
2.説明変数が多すぎる。
⇒特徴となる単語は数十万と存在。
⇒頻度の高い単語を抽出し、特徴となる単語を減らすことは可能(可逆計算可能)。
⇒しかし、1の理由により不可。


4.1.2 k近傍法でスパムフィルタを構築できるのか

k近傍法については、過去のブログを参照。
データサイエンス講義 3章「アルゴリズム」 その2 - EPG's BLOG


結果は、構築は非常に難しい。
※前提環境は、4.1.1に記載した環境と同じ。

■なぜk近傍法にて構築は難しいのか
1.計算量が膨大
⇒先ほどと同様、特徴空間が高次元すぎる(単語量の問題)。
2.最近傍な点の距離が非常に遠い(「次元の呪い(The curse of dimensionality)」)
⇒こちらも高次元すぎるため。

4.2 ベイズの法則

ベイズの法則は、以下。
p(y|x)p(x) = p(x,y) = p(x|y)p(y)

p(x):イベントxが発生する確率
p(x,y):イベントx,yが発生する確率
p(x|y):イベントyが発生した条件下で、イベントxが発生する確率

説明するための例は、以下。
■例
人口の1%が感染している疾患の検査。
検査では、以下の特徴がある。
・感染している患者の99%が陰性を示す。
・健康な患者の99%が検査で陰性を示す。

人口が10,000人とした場合、以下の様な樹形図が作成できる。
f:id:EPG:20141113223928p:plain

この例の場合、陽性と判断された場合に感染している確率は、
P(感染|陽性)
= P(陽性|感染)P(感染)/P(陽性)
= 0.99*0.01/(0.99*0.01+0.01*0.99)
= 0.50
である。つまり、陽性と判断された場合、50%の確率で感染している。

4.2.2 1つの単語に対するスパムフィルタ

1つの単語(word)に対して、スパムフィルタを作成する際にベイズの法則を使う場合、以下のように算出。

P(スパム|word) = P(word|スパム)P(スパム)/P(word)
P(スパム|word):wordが出現した場合、そのメールがスパムメールである確率

P(word|スパム), P(スパム), P(word)については、サンプルとして抽出したデータ群から算出可能。


■参考になるページ(学術的)
ベイズの定理については、以下のスライドが良いかと。
具体例も有。
http://www.fml.t.u-tokyo.ac.jp/~izumi/WS/Bays_basic.pdf


■参考になるページ(コーディング)
はてなブログにおいて、texを用いて数式表現。
はてなブログで数式を表示する方法。または、tex記法でLaTexを記述する方法。 - Pythonで学ぶ金融工学