確率・分布●●●●○

ナイーブベイズ

Naive Bayes ・ ないーぶべいず

特徴の条件付き独立を仮定した単純なベイズ分類器。速くて意外に強い

✦ 30秒で試す — 航海一語も変えずに、同じメールが迷惑メールになったりならなかったりメールAと比べて、メールBの判定は?予想してみる

概要

ナイーブベイズは、ベイズの定理を使って「観測された特徴から、それがどのカテゴリに属するか」の確率を計算する分類器です。代表的な応用がスパムフィルタで、メールに含まれる単語という特徴から「このメールがスパムである確率」を求めます。名前の「ナイーブ(単純)」は、「カテゴリが決まれば、各特徴は互いに独立に現れる」という大胆な仮定を置くことに由来します。

この仮定は現実にはまず成り立ちません。「無料」という単語が出るメールには「今すぐ」も出やすい、というように単語同士は相関するからです。それでもナイーブベイズは実用上驚くほどよく機能し、学習も予測も高速で、少ないデータでも動きます。「明らかに間違った仮定を置いた単純なモデルが、精巧なモデルに匹敵する」ことの代表例として、機械学習のベースライン(まず試す基準手法)の定番になっています。

なぜ生まれたか

特徴からカテゴリを当てる分類を確率で厳密にやろうとすると、「あるカテゴリのもとで、この特徴の組み合わせ全体が現れる確率」、すなわち特徴の同時分布が必要になります。ところが特徴が増えると組み合わせは爆発します。単語1万種類の有無でメールを表すと、パターンは2の1万乗通り。その一つひとつの確率をデータから推定するのは、どれだけデータを集めても不可能です(次元の呪い)。

そこで「カテゴリが与えられれば特徴は互いに独立」と割り切るのがナイーブベイズの解決策です。条件付き確率の積として同時確率を分解できるようになり、推定すべきものは「カテゴリごとの、各特徴の出現確率」だけになります。1万単語なら1万個×カテゴリ数の確率を数えるだけで、組み合わせ爆発が消えるのです。この発想は1960年前後から、マロンによる文書の自動索引付け(1961年)や、ワーナーらによる先天性心疾患の診断(1961年)で使われ始めました。スパムフィルタへの応用は1998年にサハミらが発表し、2002年のポール・グレアムのエッセイ「A Plan for Spam」が大きな反響を呼んで、一般にも広く知られるようになりました。

詳細

仕組み — 事前確率×尤度の積

分類のルールはベイズの定理そのものです。カテゴリ C の事後確率は、「C の事前確率」×「C のもとで各特徴が現れる確率の積」に比例します。スパム判定なら、(1) 訓練データ中のスパムの割合を事前確率とし、(2) スパム内・非スパム内それぞれで各単語の出現率を数えておき、(3) 新しいメールが来たら、含まれる単語の出現率をカテゴリごとに掛け合わせ、(4) 事後確率が大きいほうのカテゴリに割り当てます。学習は「数えるだけ」であり、これは各確率の最尤推定に相当します。

カテゴリ Cスパム / 非スパム単語「無料」特徴 x₁単語「今すぐ」特徴 x₂単語「請求」特徴 x₃…特徴 xₙ特徴間の依存は「ない」とみなすカテゴリごとに各特徴の出現確率だけを数える
ナイーブベイズの構造 — カテゴリが決まれば各特徴は独立に現れる、とみなして矢印を1方向に単純化する

2カテゴリの場合は、対数オッズで書くと仕組みがもっと見通しよくなります。「スパムである対数オッズ」は、「基準率(スパムの事前確率)の対数オッズ」に、単語ごとの「スパムでの出やすさ ÷ 通常メールでの出やすさ」(尤度比)の対数を足していったものになります。「無料」がスパムで20倍出やすい単語ならスパム側へ log 20 だけ押し、「会議」が通常メールで12倍出やすいなら逆側へ log 12 だけ引き戻す — ナイーブベイズは、単語ごとの証拠を1本の軸の上で足し合わせる綱引きです。実装で確率の積ではなく対数の和を使うのは、積がすぐに計算機で表せないほど小さくなるのを避けるためでもあります。

下の部品で、単語をメールに出し入れしてみてください。矢印の長さが単語の証拠の強さで、先端の位置がスパムである確率です。同じ単語を2回入れたり、一緒に出やすい単語を並べたりすると、何が起きるかにも注目してください。

⚡ 体験: 単語の証拠を足していく綱引き
基準率
メール本文(タップで取り除く)
単語を入れる
← 通常メール寄りスパム寄り →基準率 30%無料 ×20会議 ×1/120.1%1%10%50%90%99%99.9%P(スパム) = 41.7%
単語の数2証拠の合計(対数オッズ)0.51P(スパム)41.7%判定通常

P(スパム) = 41.7%。単語を外すと、その矢印だけが抜けて残りが詰まります。足し算だから順番は関係ありません。

矢印の長さ = 単語の証拠の強さ(スパムでの出やすさ ÷ 通常メールでの出やすさ、の対数)。含まれる単語だけを数える簡略版

仮定は間違っているのに、なぜ当たるのか

条件付き独立の仮定が破れていると、事後確率の「値」は歪みます。「無料」と「当選」のように一緒に出やすい単語は、実質的には同じ1つの証拠なのに、ナイーブベイズはそれぞれを別の証拠として足してしまうため、確率が過剰に0や1へ近づくのです。しかし分類で最終的に必要なのは「どのカテゴリの事後確率が大きいか」という順位だけです。確率の値が歪んでいても大小関係が保たれていれば分類は当たります。実際、多くのテキスト分類でナイーブベイズはこの理由により高い正解率を保ちます。

裏を返せば、ナイーブベイズの出力する「99.9%スパム」といった数値を確率として真に受けてはいけない、ということでもあります。確率の値そのものが必要な場面(たとえば「確率90%以上なら自動削除」のようなしきい値運用)では、較正(キャリブレーション)という補正をかけるか、しきい値を検証データで決め直す必要があります。スパムのように片方のカテゴリが少ない問題では、正解率だけでなく適合率・再現率で「本物のメールを誤ってスパム扱いした割合」を確かめることも欠かせません。

ゼロ頻度問題とスムージング

学習データ中のスパムに一度も現れなかった単語が新着メールに含まれると、その出現確率が0と推定され、掛け算全体が0になって他のすべての証拠が消し飛びます(対数で言えば、証拠の矢印が無限に長くなります)。これがゼロ頻度問題です。定番の対策はラプラススムージングで、全単語の出現回数にあらかじめ1(または小さな α)を足してから確率を計算します。これはベイズ推論の観点では、出現確率に一様寄りの事前分布を置いた事後平均に相当します。「観測ゼロ=確率ゼロ」と即断しない、というベイズ的な慎重さが単純な足し算で実現されているわけです。

変種と使いどころ

特徴の性質に合わせていくつかの変種があります。単語の出現回数を使うなら多項ナイーブベイズ、出現の有無だけならベルヌーイ型(こちらは「その単語が含まれていない」ことも証拠として数えます)、連続値の特徴なら各特徴がカテゴリごとに正規分布に従うと仮定するガウシアンナイーブベイズです。いずれも学習はデータを1回走査して数えるだけなので、大規模データでも高速で、新しいデータが来たら数え直すだけで更新できます。

よく比較されるのがロジスティック回帰です。実は2カテゴリのナイーブベイズの判定式も「特徴ごとの重みの和で対数オッズを作る」という、ロジスティック回帰と同じ形をしています。違いは重みの決め方で、ナイーブベイズは各単語の出現率を別々に数えて重みを作り(生成モデル)、ロジスティック回帰は分類の当たり具合が最良になるよう重みを同時に最適化します(識別モデル)。そのため相関する単語の重複は、ロジスティック回帰では重みの調整で自然に割り引かれます。一般に、訓練データが少ないうちはナイーブベイズが速く良い性能に達し、データが十分にあるとロジスティック回帰が上回る、という傾向が知られています。

実務での立ち位置は「最初に置くベースライン」です。テキスト分類のような高次元・疎な特徴で、訓練データが少ない状況ではいまでも十分戦えます。一方、特徴間の相互作用そのものが判別の鍵になる問題(単語の組み合わせや語順が意味を変えるケース)は苦手で、そうした場面ではより表現力の高いモデルに譲ります。それでも「複雑なモデルがナイーブベイズに勝てているか」を確かめることは、モデル選択の健全な出発点であり続けています。

試問

ナイーブベイズの迷惑メール判定です。出発点は基準率(届くメールのうちスパムが占める割合)で、そこへメール本文の単語ごとの証拠(スパムでの出やすさ ÷ 通常メールでの出やすさ)を足し合わせて、スパムかどうかを判定します。単語は候補から入れたり外したりでき、基準率は 5%・30%・50% から選べます。はじめの本文は、どの基準率でもスパムと判定されるほど証拠が強くなっています。

✦ 命題挑戦中

本文は一語も変えずに、基準率を切り替えるだけで判定がスパムと通常のあいだでひっくり返るメールを作れ

  • 本文は2語以上で、同じ単語を重ねない
  • この本文が、基準率 50% では「スパム」と判定されるのを確かめる
  • 同じ本文が、基準率 5% では「通常」と判定されるのを確かめる
⚡ 体験: 単語と基準率を入れ替えて、判定を確かめる
基準率
メール本文(タップで取り除く)
単語を入れる
← 通常メール寄りスパム寄り →基準率 30%当選 ×40今すぐ ×6.0クリック ×5.50.1%1%10%50%90%99%99.9%P(スパム) = 99.8%
単語の数3証拠の合計(対数オッズ)7.19P(スパム)99.8%判定スパム

P(スパム) = 99.8%。単語を外すと、その矢印だけが抜けて残りが詰まります。足し算だから順番は関係ありません。

矢印の長さ = 単語の証拠の強さ(スパムでの出やすさ ÷ 通常メールでの出やすさ、の対数)。含まれる単語だけを数える簡略版