← 機械学習テキスト 一覧

🎓 レベル:基礎 | 重要度:B(標準)

📎 前提:ロジスティック回帰 | 数理:ベイズの定理(統計)

要点(BLUF)

1. 出発点:ベイズの定理から分類へ

入力 x=(x1,,xp)x=(x_1,\dots,x_p) を観測したとき、それが class yy である確率(事後確率)を知りたい。ベイズの定理(→ 統計 ベイズの定理)はこれを次のように書き換えます:

P(yx)=P(y)P(xy)P(x)P(y\mid x)=\frac{P(y)\,P(x\mid y)}{P(x)}

分類では「どの yy で事後確率が最大か」だけが知りたいので、yy によらない分母 P(x)P(x) は無視できます:

y^=argmaxy  P(y)P(xy)\hat y=\arg\max_{y}\;P(y)\,P(x\mid y)

要するに:事後確率=(事前確率)×(尤度)を class ごとに比べ、一番大きい class を予測にする。分母は順位に効かないので捨ててよい、ということです。

2. ナイーブな仮定:条件付き独立

問題は尤度 P(xy)=P(x1,,xpy)P(x\mid y)=P(x_1,\dots,x_p\mid y) です。特徴が pp 個あると、その同時分布をまともに推定するには yy ごとに全組み合わせの頻度が必要で、データがいくらあっても足りません(次元の呪い)。

そこでナイーブベイズは大胆な近道を取ります。class yy さえ分かれば、各特徴は互いに独立だと仮定するのです(これを条件付き独立と呼びます)。すると同時分布が各特徴の積にバラせます:

P(x1,,xpy)  =  j=1pP(xjy)P(x_1,\dots,x_p\mid y)\;=\;\prod_{j=1}^{p}P(x_j\mid y)

これを §1 に代入すると、ナイーブベイズの基本式が出ます:

  P(yx)    P(y)j=1pP(xjy)  \boxed{\;P(y\mid x)\;\propto\;P(y)\prod_{j=1}^{p}P(x_j\mid y)\;}

要するにpp 次元のお化けのような同時分布を推定する代わりに、「class ごと・特徴ごと」の1次元分布を pp 個だけ推定すればよくなった、ということです。推定するパラメータが激減し、少ないデータでも学習できます。

flowchart LR
  X["入力 x = (x1, ..., xp)"] --> P1["P(x1 | y) を class ごとに評価"]
  X --> P2["P(x2 | y)"]
  X --> P3["... P(xp | y)"]
  PRI["事前確率 P(y)"] --> MUL["積をとる: P(y) × ∏ P(xj | y)"]
  P1 --> MUL
  P2 --> MUL
  P3 --> MUL
  MUL --> ARG["argmax で最大の class を選ぶ"]
  ARG --> YH["予測 ŷ"]

仮定はどれくらいウソか

条件付き独立は現実にはまず成り立ちません。たとえば迷惑メール判定で「無料」と「キャンペーン」は強く共起しますが、ナイーブベイズは両者を別々に数えて二重カウントします。だから出てくる確率の値そのものは信用できない(往々にして 0 や 1 に張りつく)。にもかかわらず分類が当たる理由は §6 で説明します。

3. 尤度をどう測るか:3つの分布

P(xjy)P(x_j\mid y) をどんな分布でモデル化するかは、特徴の型で決まります。代表的な3種類です。

変種特徴の型P(xjy)P(x_j\mid y) のモデル典型用途
ガウシアンNB連続値正規分布 N(μjy,σjy2)N(\mu_{jy},\sigma_{jy}^2)身長・センサー値など数値データ
多項NB回数・頻度(非負整数)カテゴリ分布(多項分布)文書の単語出現回数(BoW)
ベルヌーイNB二値(0/1・有無)ベルヌーイ分布単語が「出たか出ないか」だけを見る

ガウシアンNB

特徴 xjx_j が連続なら、class yy ごとに平均 μjy\mu_{jy} と分散 σjy2\sigma_{jy}^2 を訓練データから推定し、密度を当てはめます:

P(xjy)=12πσjy2exp ⁣((xjμjy)22σjy2)P(x_j\mid y)=\frac{1}{\sqrt{2\pi\sigma_{jy}^2}}\exp\!\left(-\frac{(x_j-\mu_{jy})^2}{2\sigma_{jy}^2}\right)

要するに:class ごとに「その特徴の平均と散らばり」を覚えておき、新しい値がその釣鐘曲線のどこに来るかで尤もらしさを測る、ということです。

多項NB(テキスト分類の定番)

文書を「単語の出現回数」のベクトルで表すとき、class yy における単語 jj の出現確率 θjy\theta_{jy} を頻度で推定します:

θ^jy=NjykNky\hat\theta_{jy}=\frac{N_{jy}}{\sum_{k}N_{ky}}

ここで NjyN_{jy} は「class yy の文書群に単語 jj が出た総回数」、分母は class yy の総単語数です。

要するに:「このカテゴリの文章で、この単語が全単語の何%を占めるか」を確率として使う、ということです。

ベルヌーイNB

回数ではなく「出たか・出ないか」の二値だけを見ます。class yy で特徴 jj が出る確率を pjyp_{jy} とすると、出なかったこと(xj=0x_j=0)も明示的に確率に反映します:

P(xjy)=pjyxj(1pjy)1xjP(x_j\mid y)=p_{jy}^{\,x_j}\,(1-p_{jy})^{1-x_j}

要するに:多項NBが「何回出たか」を数えるのに対し、ベルヌーイNBは「出た/出ない」の有無を見て、しかも出なかった単語のペナルティも勘定に入れる点が違います。短文では後者が有利なことがあります。

4. ゼロ頻度問題とラプラススムージング

多項・ベルヌーイNBには落とし穴があります。訓練データで class yy に一度も現れなかった単語 jj があると θ^jy=0\hat\theta_{jy}=0。すると §2 の積 jP(xjy)\prod_j P(x_j\mid y) が、たった一語のせいでまるごと 0 になり、その class は完全に除外されてしまいます。

しかし「訓練データに出なかった=そのカテゴリで絶対に出ない」わけではありません。これがゼロ頻度問題です。

対策は、すべての数え上げに最初から下駄を履かせること。多項NBなら各単語のカウントに α\alpha を足します:

θ^jy=Njy+αk(Nky+α)=Njy+α(kNky)+αV\hat\theta_{jy}=\frac{N_{jy}+\alpha}{\sum_{k}\big(N_{ky}+\alpha\big)}=\frac{N_{jy}+\alpha}{\big(\sum_{k}N_{ky}\big)+\alpha V}

VV は特徴(語彙)の総数、α\alpha は平滑化の強さです。α=1\alpha=1 をラプラススムージング(加算平滑化)0<α<10<\alpha<1リッドストーン平滑化と呼びます。

要するに:「未観測の単語にも、念のため少しだけ確率を分けておく」操作です。分子に α\alpha を足すぶん、分母も語彙数 ×α\times\alpha だけ増やして全体を1に正規化し直しています。

flowchart LR
  Z["ある単語の頻度が 0"] --> PZ["P(xj | y) = 0"]
  PZ --> KILL["∏ P が 0 に → その class を誤って除外"]
  LAP["ラプラス平滑化: 分子に +α, 分母に +αV"] -.->|"0 を避ける"| FIX["どの確率も > 0 を保つ"]

ガウシアンNBはこの問題が起きません。正規分布の密度はどの値でも厳密に正なので、確率が 0 になりようがないからです(だから sklearn の GaussianNBalpha はありません)。

5. 実装の勘所:log で足す

jP(xjy)\prod_j P(x_j\mid y) は、特徴が数百あると極端に小さい数の掛け算になり、コンピュータが 0 と区別できなくなります(アンダーフロー)。そこで対数を取り、積を和に変えます:

log ⁣(P(yx))    logP(y)+j=1plogP(xjy)\log\!\big(P(y\mid x)\big)\;\propto\;\log P(y)+\sum_{j=1}^{p}\log P(x_j\mid y)

log\log は単調増加なので、対数を取っても class の順位は変わりません。argmax の答えは同じまま、数値だけが安定します。

要するに:「ものすごく小さい数の掛け算」を「ほどほどの大きさの足し算」に置き換えるだけのテクニックで、比べたいのは順位だけなので対数化は無害です。

6. なぜ仮定が雑でも当たるのか

ここが一番おもしろい論点です。条件付き独立は明らかに間違っているのに、ナイーブベイズはしばしば実用的な精度を出します。理由は 分類の評価軸が「確率の正確さ」ではなく「順位の正しさ」だからです。

これを理論的に示したのが Domingos & Pazzani (1997) の「On the Optimality of the Simple Bayesian Classifier under Zero-One Loss」です。彼らは「独立仮定が大幅に破れていても、0-1損失のもとでは最適でありうる」こと、そして「確率推定が正確であるための条件(領域)は、分類が正しいための条件よりはるかに狭い」ことを示しました。

要するに:ナイーブベイズの出す確率は当てにならないが、順位は意外と保たれる。だから「確率値を信じる用途(リスク評価・期待値計算)」には向かないが、「ラベルを当てる用途」には強い、という使い分けになります。

7. 生成モデルとしての立ち位置

ナイーブベイズは 生成モデル です。P(y)P(y)P(xy)P(x\mid y) を別々にモデル化するということは、結局同時分布 P(x,y)=P(y)jP(xjy)P(x,y)=P(y)\prod_j P(x_j\mid y) を組み立てていることになります。同時分布が手に入れば、原理的にはそこから新しいデータ xx を生成することもできます。

これは ロジスティック回帰 のような識別モデルとの根本的な違いです。識別モデルは P(yx)P(y\mid x)(または決定境界)を直接学び、xx がどう生まれるかには関心がありません。

graph TB
  GEN["生成モデル: P(x, y) を学ぶ<br/>(ナイーブベイズ・LDA)"]
  DIS["識別モデル: P(y | x) を直接学ぶ<br/>(ロジスティック回帰・SVM)"]
  GEN -->|"ベイズの定理で P(y | x) を導く・x を生成も可"| USE1["少データに強い・速い・確率が歪みがち"]
  DIS -->|"境界だけに集中"| USE2["大データで高精度・確率は素直"]

なお、ガウシアンNBと 判別分析(LDA・QDA) はどちらも「class ごとに正規分布を当てる生成モデル」という点で親戚です。違いは、ナイーブベイズが特徴間の独立を仮定して共分散を対角に制限するのに対し、LDA/QDA は特徴間の相関(非対角の共分散)まで使う点にあります。

⚠️ よくある誤解

対応するシミュレーション

simulations/naive_bayes.py:2クラスデータにガウシアン・ナイーブベイズを当て、決定境界とあわせて各クラスの「軸に平行な等密度線」を描きます。「クラスを決めれば特徴は独立」という仮定のため各クラスの分布が1次元ガウスの積(傾かない楕円)になること、その素朴な仮定でも十分よく分類できることを可視化します。相関まで表すなら共分散をもつQDA(判別分析(LDA・QDA))です。

ガウシアンNBの軸平行な独立仮定

関連ノート