機械学習の分野には、様々な強力なアルゴリズムが存在する。中でも特に理解しやすいものの一つがナイーブベイズだ。ナイーブベイズは、あの有名なベイズの定理をベースにしており、スパムメールの分類から医療診断まで、幅広い分野で活用されている。この記事では、ベイズの定理の基本からナイーブベイズの仕組み、そして具体的な計算例までを分かりやすく解説する。
ナイーブベイズの概略
ナイーブベイズは、名前にもある通り、ベイズの定理を基礎とする分類アルゴリズムだ。ベイズの定理は、ある事象が起こったという条件のもとで、別の事象が起こる確率(条件付き確率)を更新するための数学的な枠組みを提供する。
ベイズの定理は以下の式で表される。
$$ P(A∣B) = \frac{P(B∣A)P(A)}{P(B)} $$
ここで、
- $ P(A|B) $: 事象Bが起きたという条件下で事象Aが起きる確率(事後確率)
- $ P(B|A) $: 事象Aが起きたという条件下で事象Bが起きる確率(尤度)
- $ P(A) $: 事象Aが起きる事前確率(事前確率)
- $ P(B) $: 事象Bが起きる事前確率
ナイーブベイズが「ナイーブ(単純)」と呼ばれる理由は、各特徴量(変数)が互いに独立であるという強い仮定を置くためだ。この仮定は現実の世界では必ずしも成り立たないが、多くの場合、この単純化されたモデルでも非常に優れた性能を発揮する。
ナイーブベイズ分類器は、与えられたデータがどのクラスに属するかを予測する際に、各クラスに属する確率をベイズの定理に基づいて計算し、最も確率の高いクラスを予測結果とする。
具体例と R 計算例
では、具体的な例を通してナイーブベイズの動作を理解しよう。今回は、ある人が「風邪をひいているか」どうかを予測する簡単な例を考える。予測には、「咳が出ているか」と「鼻水が出ているか」という2つの特徴量を使う。
以下のデータがあると仮定する。
状態 | 咳 | 鼻水 |
風邪 | はい | はい |
風邪 | はい | いいえ |
風邪 | いいえ | はい |
健康 | いいえ | いいえ |
健康 | いいえ | はい |
新しい患者が「咳:はい」と「鼻水:はい」という症状を示しているとき、この患者が「風邪」である確率はどれくらいだろうか?
まず、各確率を計算する。
事前確率:
- $ P(\text{風邪}) = 3/5 = 0.6 $
- $ P(\text{健康}) = 2/5 = 0.4 $
尤度(風邪の場合):
- $ P(\text{咳=はい}∣\text{風邪}) = 2/3 $
- $ P(\text{鼻水=はい}∣\text{風邪}) = 2/3 $
尤度(健康の場合):
- $ P(\text{咳=はい}∣\text{健康}) = 0/2 = 0 $
- $ P(\text{鼻水=はい}∣\text{健康}) = 1/2 = 0.5 $
ここで、ナイーブベイズの独立性の仮定を適用する。
$ P(\text{咳=はい,鼻水=はい}∣\text{風邪}) = P(\text{咳=はい}∣\text{風邪}) \times P(\text{鼻水=はい}∣\text{風邪}) = (2/3) \times (2/3) = 4/9 $
$ P(\text{咳=はい,鼻水=はい}∣\text{健康}) = P(\text{咳=はい}∣\text{健康}) \times P(\text{鼻水=はい}∣\text{健康}) = 0 \times 0.5 = 0 $
最後に、ベイズの定理を使って事後確率を計算する。
$ P(\text{風邪}∣\text{咳=はい,鼻水=はい}) \propto P(\text{咳=はい,鼻水=はい}∣\text{風邪}) \times P(\text{風邪}) = (4/9) \times 0.6 = 0.266… $
$ P(\text{健康}∣\text{咳=はい,鼻水=はい}) \propto P(\text{咳=はい,鼻水=はい}∣\text{健康}) \times P(\text{健康} ) = 0 \times 0.4 = 0 $
このままだと$ P(\text{健康}|\text{咳=はい, 鼻水=はい}) $が0になってしまうため、ラプラススムージングなどを適用することもあるが、ここでは単純に計算を進める。
どちらも確率の合計で正規化する。合計値 0.266… + 0 = 0.266… で割ることで正規化できる。その結果、咳と鼻水が「はい」の場合、風邪の確率は1、健康の確率は0という単純な値になる。
R 計算例
Rで計算する場合、e1071
パッケージのnaiveBayes
関数が便利だ。
R スクリプト例:
# データを準備
data <- data.frame(
状態 = factor(c("風邪", "風邪", "風邪", "健康", "健康")),
咳 = factor(c("はい", "はい", "いいえ", "いいえ", "いいえ")),
鼻水 = factor(c("はい", "いいえ", "はい", "いいえ", "はい"))
)
# ナイーブベイズモデルの作成
library(e1071)
model <- naiveBayes(状態 ~ 咳 + 鼻水, data = data)
# 新しいデータの予測
new_data <- data.frame(
咳 = factor("はい", levels = levels(data$咳)),
鼻水 = factor("はい", levels = levels(data$鼻水))
)
predict(model, new_data, type = "raw")
実行結果:
> predict(model, new_data, type = "raw")
健康 風邪
[1,] 0.0007494379 0.9992506
結果解釈
Rの計算結果を見ると、$ P(\text{健康}|\text{咳=はい, 鼻水=はい}) $ が極めて小さく、$ P(\text{風邪}|\text{咳=はい, 鼻水=はい}) $がほぼ1であることがわかる。これは、手動で計算した結果(0 と 1)と一致しており、この症状の患者は「風邪」であると強く予測されることを示している。
ナイーブベイズは、特徴量が独立であるという仮定を持つため、各特徴量の影響を単純に掛け合わせることで予測を行う。この単純さゆえに、計算コストが低く、大規模なデータセットにも適用しやすいという利点がある。
まとめ
この記事では、ベイズの定理の基本的な考え方から、それを応用したナイーブベイズ分類器の仕組み、そして具体的な計算例までを解説した。ナイーブベイズは、その名の通り「ナイーブ」な仮定を置くものの、そのシンプルさと効率性から、現在でも様々な分類問題で有効なツールとして活用されている。
ベイズの定理とナイーブベイズを理解することは、機械学習の基盤となる確率論的推論の考え方を身につける上で非常に重要だ。ぜひ、さらに深掘りして、他の機械学習アルゴリズムの学習にも役立ててみてほしい。
コメント