- @ThothChildren
- 2019.3.4
- PV 515
単純ベイズ分類器
ー 概要 ー
単純ベイズ分類器(ナイーブベイズ)は、特徴間は全て独立という強引な前提を置き、ベイズの定理を使用することで、特徴量を入力にクラスを分類する分類器.単純で実装も容易ではあるが、一部のアプリケーションで十分に働く.メールのスパム分類で使用されたことで有名.
この章を学ぶ前に必要な知識
条件
- クラスと特徴量のセットの学習データ
効果
- 特徴量を元に分類
- テキスト分類やトピック分類等で使用
- メールのスパム分類で使用されたことが有名
ポイント
- 与えられる特徴量の中で各特徴はお互いに独立であるとする
- ベイズの定理に基づいた推定
- 学習はデータの数え上げで完了する
解 説
数分でポイントを理解できるわかりやすい動画解説 | |
単純ベイズ分類器(ナイーブベイズ)は、特徴間は全て独立という強引な前提を置いて問題を簡単にし、ベイズの定理を使用することで、特徴量を入力にクラスを分類する分類器.単純で実装も用意ではあるが、一部のアプリケーションで十分に働く.メールのスパム分類で使用されたことで有名.
一番のポイントとなっている特徴間は全て独立という特徴について述べる.
以下ではテキストの分類等を行うために単語の特徴量を用意したとする.
例えば以下のような単語群を使用している文章で頻出する度合いを一つの特徴としている特徴量があるとする.
(私, りんご, 果物, 空, スーパーマーケット, 試験) = (0, 0.2, 0.3, 0.3, 0.1, 0.1)
のような特徴ベクトルとなっている場合に、
この例での特徴間は全て独立とは、各「りんご」や「果物」,「スーパーマーケット」がお互いに何ら関係を持たず、「りんご」という単語が出る文章においても「果物」等の他の単語の頻出具合には一切影響しないということを意味する.
しかし、実際には単語同士の頻出度はお互いに関係しているわけで、そのような仮定はかなり強引に問題を単純にしているため、この分類器を「単純ベイズ分類器」と呼んでいる. | 単純ベイズ分類器(ナイーブベイズ)とは |
確率が独立とされたとき、以下が成り立つ.同時確率を\(p(X,Y)\)とすると
$$p(X,Y) = p(X) p(Y)$$
また、条件付き確率である場合も同様に
$$p(X,Y|C) = p(X|C)p(Y|C)$$
$$p(X,Y,D) = p(X|D)p(Y|D)p(D)$$
と扱えるようになる. | 特徴量が独立のときに成り立つ関係 |
ナイーブベイズの基本方針についてまず説明します.
目的と最終的なゴール
まず、この分類器で行いたいことは、以下.
「\(Data\)が与えられたときに\(p(Category | Data )\)が最大になるCategoryを求める」
すなわち、少し柔らかく言い換えれば、データを見たときに最も確率が高いクラスを採用するということです.(当たり前です)
しかし、\(Data \)から直接的には\(p(Category | Data )\)が求められないため、
ベイズの定理から導かれる以下の式の右辺を代わりに計算します.
$$p(Category | Data ) = \frac{p(Data | Category ) p(Category) }{p(Data ) }$$
\(p(Data | Category )\)はあるクラスが与えられたときにどんなデータになりやすいかの確率.
\( p(Category)\)はそもそもどれくらいの割合でそのクラスになりやすいかの確率.
上記二つともあらかじめ学習時に計算してしまえばよいだけです.上記の二つの値が計算できれば先ほども書いたように\(p(Category | Data )\)が求まります.
これを全てのクラスで、もしCategoryがクラス1だったら...クラス2だったら...と計算して、その一番大きい値を正しいクラスと推定します.
この計算を行う上で分母の\(p(Data)\)は共通です.なのでこれは計算しなくても大小関係は変わらないので計算不要です.一般的に以下のように記述されます
$$p(Category | Data ) \propto p(Data | Category ) p(Category)$$
まとめると
・「\(Data\)が与えられたときに\(p(Category | Data )\)が最大になるCategoryを求めたい」
・\(p(Category | Data )\)は計算できないので、学習時に計算した\(p( Data | Category )\),\(p(Category )\)から計算
・上記の\(p(Data | Category ) p(Category)\)を全てのクラスで計算して比較.一番大きいクラスが分類すべきクラス. | ナイーブベイズの詳細
(やりたいこと) |
1.ナイーブベイズの学習 | |
それでは、改めてナイーブベイズの学習について解説します.
以下ではわかりやすくするためテキスト分類を例にして説明します.
上記の説明であったように識別するときに必要なのは
・\(p(Category)\) : 各カテゴリの割合
ex)「政治:スポーツ:科学:エンタメ」=「0.4:0.3:0.2:0.1」のような割合
・\(p(Data|Category)\): 各カテゴリを決めたときにデータの頻出具合.
※ここややこしいので以下で説明.
の二つになります.
学習時に一つ目の割合を求めるのは簡単です.
全学習データのうちそのカテゴリが閉める割合をそれぞれのカテゴリで求めておくだけです.
$$p(Category=c) = \frac{n_c }{\sum_i n_i}$$
次に
学習時に二つ目の割合を求める方法についてです.
「※ややこしい」と書いた箇所についてです.
データの頻出具合とは?となると思いますが、文章データの頻出具合を以下のように定義します.
$$p(Data|Category) = \prod_{ i } p(word_i|Category)$$
文章の確率を出てくる単語の確率の積で強引に定義しています.この単語の割合の積は先ほど単純ベイズでは独立とみなすと決めたことから導ける形です.
上記のように定義したので、\(p(Data|Category)\)を計算するには、今度は式の右辺にある値\(p(word_i|Category)\)が必要になりました.
しかし、これも学習時にそれぞれのクラスでそれぞれの単語の出現割合をあらかじめ計算しておくだけです.
$$p(word_i = w|Category=c) = \frac{n_{c,w} }{\sum_j n_{c,j}}$$
計算が終われば例えば
c=政治のクラスなら、「首相:内閣:サッカー:ビール」=「0.4 : 0.4 : 0.1 : 0.1」
c=スポーツのクラスなら、「首相:内閣:サッカー:ビール」=「0.0 : 0.0 : 0.9 : 0.1」
のように求まっているはずです. | ナイーブベイズの学習 |
2.ナイーブベイズの識別 | |
それでは今度は学習したナイーブベイズで識別を行います.
先にも述べたように
$$p(Category | Data) \propto p(Category) p(Data|Category)$$
の値が最も大きいクラスが分類結果になります.
単語の確率で書くなら
$$p(Category | Data) \propto p(Category) \prod_{ i } p(word_i | Category)$$
のようになります.
識別手順
1. 全てのクラスごとに上記の\(p(Category|Data)\)を計算.
1.1 上記式をそのまま計算したら非常に小さい値になってしまうので、足し算の形になるlogに直す.大小関係が大事なのでこの変換は問題ない.
$$log(p(Category)) + \sum _{ i } log(p(word_i | Category))$$
1.2 上記を計算.Dataに含まれている単語全て使用して計算(iの最大値はDataに含まれる単語数).
2. 1.で最も値の大きいクラスを分類結果とする.
以下に上記の例を示しておく.
例)
例えば\(Data\)が「首相,首相,内閣」とすると
まず政治の確率\(p(政治)\)が 0.4で、
政治カテゴリにおける\(p(首相|政治), p(内閣|政治)\)の値が0.4,0.4なので
$$log(0.4) + log(0.4)+ log(0.4) + log(0.4) = -1.59$$
一方で
スポーツのカテゴリを確認すると
スポーツカテゴリでは政治の確率\(p(政治)\)が 0.3で、
スポーツカテゴリにおける\(p(首相|スポーツ), p(内閣|スポーツ)\)の値が0.001,0.001なので(上記では0としているが0にすると値が不正なので微小な値に0.001としている.)
$$log(0.3) + log(0.001) + log(0.001) + log(0.001) = -9.52$$
少なくとも上記二つのカテゴリでは政治カテゴリの分類で正しいと言える.
(政治-1.59 > スポーツ-.9.52)なため.
| ナイーブベイズの識別 |
この章を学んで新たに学べる
Comments