朴素贝叶斯法

朴素贝叶斯法:简单而强大的概率分类器

朴素贝叶斯是机器学习中一种基于概率的分类方法,它像一位经验丰富的法官,通过已有的证据来推断最可能的结论。这种方法简单高效,特别适合处理文本分类等任务。

1. 基本思想

朴素贝叶斯的核心是贝叶斯定理,它告诉我们如何根据已知信息更新我们的信念。

想象一下:

  • 你收到一封邮件,想知道它是否是垃圾邮件
  • 你观察到这封邮件中有”免费”、”中奖”等词语

朴素贝叶斯会问:

  1. 一般来说,垃圾邮件占所有邮件的比例是多少?(先验概率)
  2. 如果是垃圾邮件,出现这些词的可能性有多大?(似然概率)
  3. 综合以上信息,这封邮件是垃圾邮件的可能性有多大?(后验概率)

用公式表示:

$$P(垃圾邮件|观察到的词) = \frac{P(观察到的词|垃圾邮件)P(垃圾邮件)}{P(观察到的词)}$$

“朴素”在哪里?朴素贝叶斯假设所有特征(如邮件中的每个词)都相互独立。这就像假设”免费”这个词出现的概率不受”中奖”这个词是否出现的影响。

2. 朴素贝叶斯分类器

分类时,朴素贝叶斯会计算”这封邮件是垃圾邮件的概率”和”这封邮件是正常邮件的概率”,然后选择概率较大的类别。

$$\hat{y} = \arg\max_{y} P(y) \prod_{i=1}^{n} P(x_i|y)$$

举例:判断一封含有”免费”和”朋友”的邮件

计算是垃圾邮件的概率:

  • 垃圾邮件的先验概率:30%
  • “免费”出现在垃圾邮件中的概率:80%
  • “朋友”出现在垃圾邮件中的概率:20%
  • 结果:30% × 80% × 20% = 4.8%

计算是正常邮件的概率:

  • 正常邮件的先验概率:70%
  • “免费”出现在正常邮件中的概率:10%
  • “朋友”出现在正常邮件中的概率:60%
  • 结果:70% × 10% × 60% = 4.2%

结论:这封邮件更可能是垃圾邮件(4.8% > 4.2%)

3. 常见的朴素贝叶斯模型

3.1 高斯朴素贝叶斯

适用于连续数值特征,比如身高、体重、温度等。

例子:根据身高、体重预测性别

  • 假设男性身高服从均值为175cm、方差为36的正态分布
  • 如果观察到一个人身高180cm,可以计算这个身高在男性分布中的概率

$$P(身高=180|男性) = \frac{1}{\sqrt{2\pi\cdot 36}} \exp\left(-\frac{(180 - 175)^2}{2\cdot 36}\right)$$

3.2 多项式朴素贝叶斯

适用于计数型特征,特别是文本分类。

例子:根据单词出现次数分类新闻

  • 体育新闻中”比赛”、”得分”、”球员”等词出现频率高
  • 政治新闻中”政策”、”国家”、”经济”等词出现频率高

3.3 伯努利朴素贝叶斯

适用于二元特征(有/无)的情况。

例子:判断电影类型

  • 是否包含爆炸场景?(是/否)
  • 是否有浪漫情节?(是/否)
  • 是否出现外星生物?(是/否)

4. 算法优缺点

优点:

  • 速度快:训练和预测都很快,就像快速浏览简历而不是深入阅读
  • 小样本也能用:即使只有少量数据也能工作得不错
  • 容易理解:模型逻辑清晰,像是基于几个简单规则的决策
  • 处理高维数据:即使有成千上万个特征(如文章中的词汇量)也能高效处理

缺点:

  • 独立性假设过强:特征间往往有联系,比如”纽约”和”曼哈顿”同时出现的概率比独立计算的要高
  • 对极端值敏感:一个非常罕见的特征可能过度影响结果
  • 零概率问题:如果某个词在训练数据的某类别中从未出现过,会导致整个概率变为零

5. 实际应用

  • 垃圾邮件过滤:Gmail基于邮件内容判断是否为垃圾邮件
  • 新闻分类:自动将新闻分到体育、政治、科技等类别
  • 情感分析:判断产品评论是正面还是负面
  • 疾病诊断:根据各种症状判断最可能的疾病
  • 推荐系统:简单的内容推荐,如”喜欢这本书的人也喜欢…”

6. 代码示例

下面是使用Python实现的一个新闻分类例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 加载数据(四个不同主题的新闻组)
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
data = fetch_20newsgroups(subset='all', categories=categories, shuffle=True)

# 特征提取:将文本转为词频向量(词袋模型)
vectorizer = CountVectorizer(stop_words='english', max_features=1000) # 忽略常见英文虚词,只保留1000个最常见词
X = vectorizer.fit_transform(data.data) # 转换为词频矩阵
y = data.target # 类别标签

# 划分训练集和测试集(80%训练,20%测试)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练朴素贝叶斯模型
clf = MultinomialNB(alpha=1.0) # alpha是平滑参数,避免零概率问题
clf.fit(X_train, y_train)

# 预测并评估
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy:.4f}")
print(classification_report(y_test, y_pred, target_names=data.target_names))

# 演示预测
def predict_category(text):
text_vector = vectorizer.transform([text])
category = data.target_names[clf.predict(text_vector)[0]]
return f"预测类别: {category}"

# 测试几个例子
print(predict_category("God created the universe and loves everyone."))
print(predict_category("The new graphics card can render 3D images quickly."))
print(predict_category("The patient shows symptoms of high fever and cough."))

通过这个简单的朴素贝叶斯模型,我们就能够相当准确地对新闻文本进行分类,展示了这种简单算法的强大之处。


朴素贝叶斯法
http://neutrino.top/2025/03/26/朴素贝叶斯法/
作者
Neutrin1
发布于
2025年3月26日
许可协议