プログラミング

読むだけで【ガウス単純ベイズ分類器】がわかる

投稿日:

こんにちは。

整形外科医師ブロガーのボククボです。

MATLABの分類学習器アプリで機械学習を始めました。

クリックすれば、分類モデルができちゃう
スグレモノなんですが、

アルゴリズムがわからないと怖いですよね。

まずは、機械学習の基本的な学習アルゴリズムである、
ナイーブ(単純)ベイズ分類器について、
人に説明できる程度に勉強しました。

いろんなサイトを見て勉強したのですが、
数式の添え字が多すぎて、理解するのが大変でした。。。

最初に数式があると、すっきりまとまってよいのですが、
何度も読み直して意味をかみ砕かないといけません。

というわけで、

前半は数式をなるべく使わず、

【前から順番に読んでいくと理解できる】

というのを目標に説明していきます。

分類器とは?

教師あり機械学習において、
分類器/分類モデルとはなんでしょうか。

訓練データには、
着目する特徴量と正解の分類情報が含まれます。

これらのデータから、
アルゴリズムに従って分類モデルを作り、

未知の特徴量データが与えられたときに、
分類クラスを予測できるようにするというものです。

この予測の正答率を上げるために、
分類モデルの作り方がいくつもあり、

それぞれ名前がついています。

今回はそのうちの一つ、
ナイーブ(単純)ベイズ分類器の解説です。

ベイズ分類器とは?

事後確率の概念を用いる分類アルゴリズムです。
高校数学でもやるように、

事後確率の計算には下のベイズの定理が用いられます。

しかし、ベイズ分類器をざっくり理解するのに、
ベイズの定理による計算が必要なわけではありません。

っていうか常人には計算できません。

まず最初に理解すべきことは、ベイズ分類器は

【テスト用特徴量データが与えられたとき、クラスC1に分類される確率】
【テスト用特徴量データが与えられたとき、クラスC2に分類される確率】

という二つの事後確率を比べて分類するということです。
(わかりやすいようにクラスが二つだけの場合に限定して話します。)

いまいち、ピンとこないと思うので、
事後確率と分類の関係を
パチンコを例にして説明してみます。

事後確率

事後確率については、
以前、パチンコを例にして解説しました。

【激アツリーチが来た後、大当たりする確率】

リーチが来たことが確定していれば、事後確率です。

つまり、平場で大当たりを待っているより、
確率が高い’激アツ’状態です。

この、激アツ状態の確率が事後確率です。

この事後確率は、
試行をたくさん行うことにより簡単に求められます。
(リーチ演出後の大当たりの割合を求めればよい)

パチンコ雑誌では、「演出信頼度」という形で
情報提供されています。

分類への応用

訓練データにより、十分なリーチに関する確率情報があれば、
演出信頼度=事後確率が求まります。

つまり、ある特徴量(リーチの種類)が確定したとき、
各クラス(当たり/ハズレ)になる確率は、下のように表現できます。

【激アツリーチが来たから、当たり確率90%】
【激アツリーチが来たから、ハズレ確率10%】

このような二つの事後確率を分類に利用しようというのが
ベイズ分類器です。

ここでは、
特徴量データ=’激アツリーチ’のとき、’当たり’になる確率が高いので

’当たり’に分類するのです。

このように、特徴量決定時の事後確率が高い方にクラス分類
していくことで、性能のよい分類器を作ろうとするアルゴリズムなのです。

特徴量が1つで連続値の場合

パチンコの例では、

特徴量が1つで、リーチの種類という
離散的な(カテゴリ的な)値を扱いました。

特徴量が離散的であれば、事後確率は、
事象のカウントによって、簡単に計算できます。

特徴量が1つで連続値の場合はどうでしょうか?

こうなると、直接事後確率を推計することはできなくなり、
’確率分布’で考えることが必要になります。

というわけで、すみませんが、そろそろ数式を使います。

分類時に使用する特徴量をXとします。
訓練用データとして、

特徴量:X=x1,x2,...,xn とそれに対応する
分類クラス:C=C1,C2,C1,...,C1,C2

が与えられています。
(簡単のため、分類クラスはC1/C2の2種類としました。)

Xには特徴量として、
単なる連続的な数字(小数とか)が入っていると考えてください。

テスト用(予測したい)データの特徴量がX=aだったとき,
ベイズ分類するために

【C=C1となる事後確率】 P(C=C1|X=a)
【C=C2となる事後確率】 P(C=C2|X=a)
という二つの確率の大小関係を求めたいです。

ここでベイズの定理を利用すると、それぞれ

P(C=C1|X=a)=P(C=C1)×P(X=a|C=C1)/P(X=a)
P(C=C2|X=a)=P(C=C2)×P(X=a|C=C2)/P(X=a)

となります。

どちらもP(X=a)で割っていますが、大小関係を求めるなら
この項は計算する必要はありません。

残りの項を訓練データから推測していきます。

最初の項は、C1,C2に分類される確率なので、

それぞれ
P(C=C1)=C1の個数/訓練データ数
P(C=C2)=C2の個数/訓練データ数

で求められます。(推測してるっていうのが正しいか。)

問題は、分子の2番目の項
P(X=a|C=C1)P(X=a|C=C2)の計算です。

P(X=a|C=C1)はC1に分類されたことが確定したデータにおいて、
特徴量Xがaとなる確率です。

訓練データから推計するには、
C1に分類された訓練データを集め、その特徴量の分布を調べます。

もちろんバラバラなので、X=aになる確率なんてわかりません。

でも、特徴量が正規分布すると仮定したらどうでしょう?
推計に使う訓練データの平均と標準偏差がわかれば、
確率分布が求まります

そうすると、X=aとなる確率も求まるわけです。

Wikipediaより引用

というわけで、P(X=a|C=C1)とP(X=a|C=C2)も計算できました。

あとは、前述の式の大小関係によって
分類結果が決定されます。

実際の計算はMATLABに任せれば十分ですけどね。

ちなみに、正規分布を仮定したから計算できたことは
忘れてはいけません。

正規(ガウス)分布を仮定して計算したベイズ分類器を
ガウス単純ベイズ分類器と呼びます。

ベルヌーイ分布、多項分布を仮定することもあります。

特徴量が2つの場合を理解する

特徴量が2つの場合はどうなるでしょうか。

特徴量Xは2次元のベクトルになります。

X=(x1,x2)といったイメージです。
(計算には使いませんが)

テストデータもX=(a1,a2) と表記することにします。

P(X=(a1,a2)|C=C1)とP(X=(a1,a2)|C=C2)の計算ができれば、

【C=C1となる事後確率】 P(C=C1|X=(a1,a2))
【C=C2となる事後確率】 P(C=C2|X=(a1,a2))

の大小関係がわかることまでは共通です。

特徴量が1つのときと同様に、
訓練データでC1に分類されたデータの、特徴量Xを集め
確率分布を求めたいのです。

正規分布を仮定することにしても、

2次元ベクトルの正規分布なんて常人には計算できません。
(できなくも無いですが)

そこで、1次元の問題に帰着させることを考えます

そのために、仮定をもうひとつ加えます。

二つの特徴量が独立に動く

ということです。

二つの特徴量のとる確率が、互いに影響しないのであれば、
積の法則が使えるので、

P(C=C1|X=a1,a2)=P(C=C1|X=a1)×P(C=C1|X=a2)

が成り立ちます。

右辺の2項は特徴量が1つのときと同様に、
正規分布を仮定すれば、計算可能です。

2次元の計算を1次元の計算に単純化するので

’単純’ベイズ分類器

あるいは

’ナイーブ’ベイズ分類器

と呼ばれるわけです。

特徴量がn個の場合を理解する

2次元が理解できればn次元も同じです。

特徴量X=(a1,a2,.....an)のときの計算ですから

P(C=C1|X=a1,a2,..,an)=

P(C=C1|X=a1)×P(C=C1|X=a2)×...×P(C=C1|X=an)

と計算できます。

計算自体はそれほど複雑にはなっておらず’単純’ですね。

まあ、実際の計算はMATLABにお任せですが。

本当に独立なのか?

各特徴量が独立って仮定してもよいものでしょうか?

特徴量がなんの相関もなく完全に独立って、
なかなかないと思います。

独立でなかった場合、どうなるか。

分類精度が下がってしまう可能性があります。

逆にいえば、

結果的に分類精度が良好であるなら、

特徴量が独立でなくても気にしなくてよいとも言えます。

(実際そういうことも多い。)

まとめ

  • ベイズ分類器が事後確率を利用した分類法であること
  • 特徴量が連続量であれば、分布を仮定する必要があること
  • 2つ以上の特徴量だと、互いの独立性を仮定して計算すること

が理解できれば

’ガウス’+’単純’+’ベイズ分類器’

の意味がよくわかると思います。

間違いなどあれば、コメントもしくはTwitterで教えてください。

よろしくお願いします。

-プログラミング
-, , , , ,

Copyright© ボククボのブログ , 2020 All Rights Reserved Powered by STINGER.