Naive Bayes
ナイーブベイズ分類器はベイズの定理を適用し、クラスが与えられた場合に特徴量が独立していると仮定します。種類、スパムフィルタリング、限界、Pythonコードを解説します。
ナイーブベイズは、クラスが既知であれば特徴同士は独立であるという「ナイーブ」な仮定のもとで、ベイズの定理を適用する確率的分類器の一群です。この仮定により、モデルはクラスごとに各特徴の分布を個別に学習できるため、学習は学習データを1回数え上げるだけで済み、予測では保存した少数の確率を組み合わせます。Mehran Sahami氏らは1998年に迷惑メールへの適用を発表し、ベイズ迷惑メールフィルターは2000年代初頭に普及しました。現在も、テキストなどの非常に高次元なデータを扱う教師あり学習で、高速かつ強力なベースラインとして使われています。
ナイーブベイズの仕組み#
ベイズの定理では、特徴x₁ … xₙが与えられたときのクラスCの確率をP(C | x) = P(C)·P(x | C) / P(x)と表します。特徴値のあらゆる組み合わせについてP(x | C)を推定するには膨大なデータセットが必要となるため、ナイーブベイズでは条件付き独立性を仮定し、P(x₁ | C)·P(x₂ | C)·…·P(xₙ | C)に分解します。分類器は、事前確率P(C)にこの積を掛けた値が最大のクラスを予測し、すべてのクラスで共通するP(x)は除外します。実装では、数千個の小さな確率を掛け合わせると浮動小数点演算でアンダーフローが起きるため、確率を掛ける代わりに対数確率を加算します。
数え上げには、学習中にクラスと一緒に出現しなかった単語の確率がゼロになるという問題があります。その単語を含む文書では、ほかの証拠に関係なく、そのクラスの確率がゼロになります。加法スムージングでは、すべてのカウントに疑似カウントαを加えてこの問題を解決します。α = 1はラプラススムージングと呼ばれ、scikit-learnのデフォルトです。
ナイーブベイズ分類器の種類#
各種類では、クラス内の各特徴に仮定する分布が異なります。多項ナイーブベイズは、文書内で各単語が出現する回数などのカウントをモデル化し、テキストで標準的に使われます。ベルヌーイナイーブベイズは、単語の有無をモデル化し、クラスに特徴的な単語がない場合にもペナルティを与えます。ガウスナイーブベイズは、各クラスの連続特徴ごとに個別の平均と分散を持つ正規分布を当てはめます。補完ナイーブベイズは、ほかのすべてのクラスから各クラスの単語統計量を推定するため、クラス不均衡のあるテキストデータセットに適しています。カテゴリナイーブベイズは、値の種類が固定されたカテゴリ特徴を扱います。
この例では、scikit-learnのMultinomialNBを6件のラベル付きメッセージの単語カウントで学習し、新しい2件のメッセージをスコアリングします。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
# Tiny labeled corpus: 1 = spam, 0 = legitimate
texts = [
"win a free prize now",
"free cash bonus click now",
"claim your free reward today",
"meeting moved to monday",
"lunch with the team today",
"project review notes attached",
]
labels = [1, 1, 1, 0, 0, 0]
# Count words, then learn class priors and per-class word probabilities (alpha=1 is Laplace smoothing)
vectorizer = CountVectorizer()
model = MultinomialNB(alpha=1.0)
model.fit(vectorizer.fit_transform(texts), labels)
new = vectorizer.transform(["free prize today", "notes from the monday meeting"])
print(f"P(spam): {model.predict_proba(new)[:, 1].round(3)}")1つ目のメッセージは迷惑メールでしか使われない「free」と「prize」を含むため、迷惑メールである確率は0.881です。2つ目は正規のメールでしか使われない「notes」、「monday」、「meeting」を含むため、確率は0.053です。スムージングがなければ、「free」の正規メールクラスでの確率はゼロになります。そのため、この単語を含む正規のメッセージはすべて、迷惑メールであると確実に判定されます。
強みと制約#
学習と予測にかかる時間は、サンプル数と特徴数に対して線形に増加します。そのため、ナイーブベイズは数百万件の文書を非常に低い推論レイテンシで処理できます。scikit-learnの実装では、新しいバッチをpartial_fitで取り込んでオンライン学習を行えます。また、必要なデータが少なくて済みます。NgとJordan(2001)は、ナイーブベイズがロジスティック回帰より少ない学習例で漸近誤差に近づくことを示しました。一方、ロジスティック回帰はデータが十分にある場合、より低い誤差を達成します。特徴が相関していても、クラスの順位付けが正しければよいため、クラス予測の精度が高い場合がよくあります。
確率の値自体は適切にキャリブレーションされていません。相関する特徴は同じ証拠を何度も数えるため、スコアが0または1に偏りやすくなります。そのため、信頼できる信頼度の値が必要なアプリケーションでは、ホールドアウトデータを使って再キャリブレーションします。単語の順序を無視した表現では、単語の順序や相互作用も捉えられません。そのため、「not good」は否定語と肯定語の組み合わせとして扱われますが、Attentionを使うTransformerなどのモデルは、文脈の中で読み取ります。
用途#
- 迷惑メールのフィルタリング:メールフィルターは、メッセージ内の単語、送信者のパターン、リンクをもとにスコアを付けます。ユーザーがメッセージを迷惑メールとしてマークすると、単語の統計量を更新します。
- 感情分析:レビューやサポートチケットに使われている単語をもとに、肯定的または否定的なラベルを付けます。言語モデルをファインチューニングする前の最初のモデルとしてよく使われます。
- 文書の振り分け:ニュース記事、法的書類、サポート依頼をトピックやキューごとに分類します。カテゴリによって出現頻度が大きく異なる場合は、補完ナイーブベイズがよく使われます。
- 自然言語処理(NLP)のベースライン:言語識別やトピックのタグ付けで、より高コストなモデルが超えるべき手軽な比較基準としてナイーブベイズを使います。
コンピュータービジョンにおけるナイーブベイズ#
隣接するピクセルには強い相関があるため、各ピクセルを独立した特徴として扱うと、オブジェクトを特徴付けるエッジやテクスチャが失われます。畳み込みニューラルネットワークは、近傍をまとめて処理することでこれらの特徴を捉えます。ディープラーニング以前には、bag-of-visual-words手法でナイーブベイズを局所特徴量(SIFTなど)のヒストグラムに適用していました。局所特徴量はk-meansクラスタリングで視覚単語にまとめられ、単語カウントに相当する表現を作ります。YOLO26が物体検出で見つける物体クラスの数も、同じ種類のカウントベクトルを形成します。そのため、多項ナイーブベイズモデルは検出結果だけを使って、シーンを道路、キッチン、オフィスなどに分類できます。
ナイーブベイズと関連モデル#
- ベイジアンネットワーク:ナイーブベイズは最も単純なベイジアンネットワークで、すべての特徴量の親がクラスのみであり、特徴量間にエッジはありません。一般的なベイジアンネットワークでは、特徴量間の依存関係をモデル化するために、これらのエッジを追加します。
- ベイズ推論:「ナイーブベイズ」の「ベイズ」はベイズの定理を指します。標準的なナイーブベイズでは、各確率を平滑化した頻度として推定するため、単一の点推定値になります。一方、完全なベイズ手法では、各パラメーターについて分布を保持します。
- サポートベクターマシン(SVM):学習コストが高くなる代わりに、識別境界を直接学習します。感情分類では、WangとManning(2012)が、短い文章ではナイーブベイズのほうがSVMより高精度であり、長文レビューではSVMのほうが高精度であることを示しました。










