moxt

Just another Blog site

[WIP]単純ベイズ分類器がまったく単純じゃないので入門

      2015/07/02

書き途中&間違いあるかも

単純(ナイーブ)ベイズ分類器というものがある。

ナイーブベイズ分類器を頑張って丁寧に解説してみる

ナイーブベイズ分類器は、一言でいうと、分類問題ってベイズの定理を使えば解けるんじゃね?というものです。

3つの疑問

  • 分類問題って何?
  • ベイズの定理って何?
  • ベイズの定理をどのように分類問題に適応させているのだろうか

という、疑問が湧いてくる。

分類問題って?

あるメールXは迷惑メールであるか否か?
これは、あるメールを迷惑メールと普通メールのいずれかに分類する2値分類問題。

メールXを分類器fに突っ込むと-1(迷惑メールとする)or1(普通メールとする)が出力される。
分類器の性能が悪いと迷惑メールを普通メールと誤判定してしまう。(常に間違う分類器、みたいに性能が悪すぎた場合は逆に優秀な分類器と見なせる?)
誤判定した場合はfの中身を編集して、次に同じメールが来た時には正しく分類できるようにしておく。
この『fの中身を編集する』行為が学習と呼ばれている。
学習をすればするほど良いかと言われるとそうでもなくて、学習しすぎることで未知のメールを受け取ったときの分類の精度が悪くなることがある。
分類器が学習しすぎてる状態を過学習という。

仮に分類器の中身が50%の確率で与えられたあらゆるメールを迷惑メールと判断する、というロジックだと50%の判断精度。
この数字を上げる方法が研究されている。
ナイーブベイズ分類器はその方法の1つ。

条件付き確率

ベイズの定理の前に条件付き確率について学ぶ必要があるみたい。

ベイズの定理

とても分かりやすかった。

5回に1回の割合で帽子を忘れるくせのあるK君が、正月に A、B、C 3軒を順に年始回りをして家に帰ったとき、帽子を忘れてきたことに気がついた。2軒目の家 B に忘れてきた確率を求めよ。

1件目で忘れる確率 1/5 = 25/125
2件目で忘れる確率 4/5 * 1/5 = 20/125
3件目で忘れる確率 4/5 * 4/5 * 1/5 = 16/125
忘れない確率 4/5 * 4/5 * 4/5 = 64/125

で、2件目で忘れる確率なので20/125=16%だ。
と、なりそうになる。

これは『家に帰ったとき、帽子を忘れてきたことに気が付く…前に、2軒目の家Bに忘れてきた確率を求めよ。』

と、いう謎な問題だったら16%で正解だった。

問題は『帽子に忘れてきたことに気がついた』上で2軒目の家Bに忘れてきた確率、である。

帽子を忘れてきたことに気がついた時点で125(全体)から64(忘れない)を引いた61(忘れる)が残る。
全体が新たに125から61に変化するわけ。

選択肢は、

  • 1軒目で忘れる
  • 2軒目で忘れる
  • 3軒目で忘れる

で、2軒目で忘れるのは20なので、20/61となる。

ここも分かりやすかった。
条件付き確率の意味といろんな例題

なんというか、感覚的には分かる(気がする)んだけど、数式で見るとよく分からなくなる感じはなんなのだろう。。

ベイズの定理って何?

式で書くと

P(B|A)=\frac{P(A|B)P(B)}{P(A)}

これ、ベイズの定理って条件付き確率の変形?
下記は条件付き確率。

P(B|A)=\frac{P(B \cap A)}{P(A)}
で、同時確率

P(B \cap A)

P(A|B)P(B)

と書き換えられる、らしい。

結果

P(B|A)=\frac{P(A|B)P(B)}{P(A)}

と、なる。

じゃあ、単純ベイズ分類器は『条件付き確率を分類器として使う』と解釈しても良い?
『単純』っていうのがついてるので『条件付き確率を分類器として』は正確ではないが、大まかな理解として問題ないと思う。

ベイズの定理をどのように分類問題に適応させているのだろうか

P(B|A)ってのはAが与えられたときにBとなる確率。
AとBに具体的な値を入れてみる。

A=あるメール、B=スパムメール

と、すると

P(スパムメール|あるメール)ってのはあるメールが与えられたときにスパムメールとなる確率。

ってことかね。

スパムメールか普通メールかに分類するのは二値分類問題。
P(スパムメール|あるメール)とP(普通メール|あるメール)の値が大きい方を採用すれば良さげ。

結局、単純ベイズ分類器って何なの?

ベイズの定理が分類器として使えそうなのは分かった。
単純ベイズ分類器って何?
と、いう問いの答えが無いので追記していく。

ナイーブベイズを用いたテキスト分類

これを読めば終わり感ある。
ナイーブベイズだけでなくテキスト分類、教師あり学習といった前提の解説もあり大変分かりやすい。

単純(ナイーブ)って何?

『あるメール』そのものを扱わずに、『あるメール』に含まれる単語を使って分類しましょう。
で、単語の出現確率は独立とみなしましょう。

ってのが、単純(ナイーブ)ってこと。

…どういうことか。

例えば、サッカーに関する文書だったら、『FIFA』が出てきたら『不正』って単語が出てくる確率高そうなんだけど、それらの関係を真面目に扱うと計算をする上で面倒なので、あえて単語間の関係は無視しましょう。ってこと。

ナイーブベイズの数式の各要素を理解する

さて、ベイズの定理は下記の通り。

P(category|document)=\frac{P(document|category)P(category)}{P(document)}

右辺の各要素の確率を求めてみる

分母は無視できる

まず、P(文書)は無視して良い。
なぜか。

スパムメールの分類を例にすると

P(spam|mail)=\frac{P(mail|spam)P(spam)}{P(mail)}

P(ham|mail)=\frac{P(mail|ham)P(ham)}{P(mail)}

ベイズ分類器ではP(スパムメール|メール)とP(普通メール|メール)の大小を比較して、あるメールがどちらのカテゴリに属してそうか判断する。
で、P(メール)はスパムメールだろうが、普通メールだろうが同じ値になるので無視して問題ない、ってこと。

P(カテゴリ)を計算する

P(カテゴリ)の計算方法は単純。

スパムメールが90件、普通メールが10件、合計100件のメールがあるとすれば
P(スパムメール) = 90/100 = 0.9
P(普通メール) = 10/100 = 0.1
これだけ。

P(メール|カテゴリ)を計算する

P(メール|カテゴリ)はいまだに釈然としない。
カテゴリが与えられたときにあるメールをひく確率。

普通メールが与えられたときにある普通メールxをひく確率。
先の配分で合計100件のメールがあるとする、
1/100 / 10/100 = 0.1
と、条件付き確率で求められるんだけど、ある未知のメールzが100件のあるメールと一言一句違わずに合致する、なんてことはあるだろうか。
まあ、あんまないよね。。

『あるメール』そのものを扱わずに、『あるメール』に含まれる単語を使って分類しましょう。
で、単語の出現確率は独立とみなしましょう。

すると、p(doc|cat)は下記のように変形できる

P(doc|cat) = P(word_1 \wedge \cdots \wedge word_k|cat)

右辺は

\Pi_iP(word_i|cat)

と置き換えられるらしい。

ただし、置き換えるために条件を設けてる。

単語の出現確率の間に独立性を仮定しないと成り立ちません。同時確率をそれぞれの確率の積で表せるってのが確率論的独立性の定義です。本来、単語の出現に独立性は成り立ちません。たとえば、「人工」と「知能」は共起しやすいし、「機械」と「学習」は共起しやすいです。これを無視して単語の出現は独立と無理矢理仮定して文書の確率を単語の確率の積で表して単純化するのがナイーブベイズのナイーブたる所以です。

と、いうこと。

P(word_i|cat)

は、あるカテゴリが与えられたときに単語word_iが出る確率。
で、各word_iは独立と過程してるので、各々をまとめて掛け算したヤツがP(word_i|cat)となる。

『あるカテゴリが与えられたとき』という状況がいったいなんなのかよく分からない。

これは、単語の条件付き確率と呼びます。カテゴリの中でその単語がどれくらいでてきやすいかを表します。これは簡単で、訓練データのカテゴリcatに単語word_kが出てきた回数をカテゴリcatの全単語数で割ればOKです。

んー。。よく分からない。

サッカーカテゴリに属する文書がいくつか存在する。

文書1:岡田、監督、オーナー
文書2:リーグ、開幕、浦和
文書3:チャンピオン、リーグ、優勝

で、それぞれの文書を構成する単語の集合(重複は認めない)を作る。

サッカーカテゴリの単語の集合=(岡田、監督、オーナー、リーグ、開幕、浦和、チャンピオン、リーグ、優勝)

『あるカテゴリが与えられたとき』は『サッカーカテゴリの単語の集合の要素数のうち』と解釈できる感じだろうか。

ここで、単語「リーグ」について見てみる。
上の文書群を例にすると単語「リーグ」はサッカーカテゴリで2回出てきた。

なので…

P(word_i|cat) = \frac{2}{9}

単語の条件付き確率はこんな感じで求まる。
んー。。わかったようなわからないような。

ゼロ頻度問題

上に書いたように、ナイーブベイズ分類器ではP(メール|カテゴリ)を真面目に計算しない。
文書(メール)を単語群に分解して、カテゴリが与えられたときの単語の条件付き確率を求めて、それらをまとめて掛け算する。と、いうものだった。

文書の中に未知の単語が入ってると困ることが起きる。

先ほど使った、サッカーカテゴリの単語の集合 =(岡田、監督、オーナー、リーグ、開幕、浦和、チャンピオン、リーグ、優勝)を例にして考える。

ある与えられた文書のカテゴリを分類したい。
例えば、「チャンピオン、リーグ、オーナー、ジーコ」といった文書が与えられた。
見るからにサッカーっぽい文書だ。
サッカーカテゴリが与えられたときにジーコの条件付き確率は0になる。
なぜなら、サッカーカテゴリの単語の集合に「ジーコ」が存在しないため分子が必ず0になるからだ。

つまり、『P(サッカー|「チャンピオン、リーグ、オーナー、ジーコ」) = 0』となる。

見るからにサッカーっぽい文書だけど未知の単語が1つでも存在すると確率は0になる。
ベイズ分類器は未知の単語に対して弱い。
なので、昔の賢い人は「スムージング」というテクニックを導入した。

スムージングとは

TODO : ラプラススムージングについて書く

実際にベイズ分類器を作ってみる

素晴らしい実装例あるので、コレ見たら終わり。

必要そうな機能を列挙してみる。

  • 与えられた文書を単語の集合に変換する機能
  • P(cat)を求める機能
  • P(word|cat)を求める機能
  • 各P(cat|word)を比較する機能

与えられた文書を単語の集合に変換する機能

英語の文書を単語の集合に変換することは簡単そう、単語間がスペースで区切られているから。
日本語の文書の場合はスペースで区切られていないため大分困難。
形態素解析という技術を使うことで単語に分解することができるようだ。

Mecabで分解した。

海外では充実してる学術系動画コンテンツ

https://class.coursera.org/nlp/lecture/28?s=e

ラプラススムージングがいきなり出てきてるけど、実際に分類例を挙げながら解説してくれるのでとでも分かりやすい。

 - 機械学習

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

  関連記事

2152048926_d60b8ea093_z
コード読みながら理解する機械学習〜porn_sieve〜

porn_sieveは、好みの動画(xvideos)を数値評価することでアナタに最適な動画(xvideos)を提供してくれるPython製アプリだ。 最適な動画を選定するために「機械学習」ってのが使われているわけですね。 …

2152048926_d60b8ea093_z
不均衡データでClassification of text documents using sparse featuresしてみる

読み取った新書のデータから自分にとって興味あるか否かを判定する、という一連をやった。 生まれつき好奇心が全く無い病気なので、全体の比で見ると「興味あり」が圧倒的に少ない。 …

keras-logo-small
KerasのCNNを使って文書分類する

Contents1 TL;DR(笑)2 …

images
imbalanced-learnで不均衡データをアンダーサンプリングしてみる

https://github.com/scikit-learn-contrib/imbalanced-learn ↑ドキュメントを読めば終わり。 …