第15课 - 贝叶斯定理及其在机器学习中的应用
1. 学习目标
学完本课,你将能够:
- 理解条件概率的基本概念,并能够运用公式进行计算。
- 掌握贝叶斯定理的公式,并能解释其每个组成部分的现实意义。
- 明白先验概率、似然和后验概率之间的关系,以及“通过证据更新信念”的核心思想。
- 了解贝叶斯定理在机器学习中的一个关键应用——朴素贝叶斯分类器,并知道其基本原理。
2. 核心概念
2.1 从条件概率说起
条件概率回答了这样一个问题:“在事件B已经发生的前提下,事件A发生的概率是多少?” 记作 P(A|B)。
公式为:
P(A|B) = P(A ∩ B) / P(B)
其中,P(A ∩ B) 表示A和B同时发生的概率。
举个例子: 一个盒子里有3个红球和2个蓝球。不放回地连续摸两次球。在第一次摸到红球(事件B)的条件下,第二次也摸到红球(事件A)的概率是多少?
P(B) = 3/5P(A ∩ B) = (3/5) * (2/4) = 6/20 = 3/10(第一次红且第二次红)P(A|B) = (3/10) / (3/5) = 1/2
2.2 贝叶斯定理:信念的更新
贝叶斯定理是由条件概率推导而来,但它的视角非常不同。它试图回答:“在已经观察到证据B的情况下,我们对假设A的信念(概率)应该更新为多少?”
贝叶斯公式:
P(A|B) = [P(B|A) * P(A)] / P(B)
我们来拆解一下每个部分:
- P(A|B) - 后验概率 (Posterior):在看到证据B之后,假设A成立的概率。这是我们最终想要求解的目标。
- P(B|A) - 似然 (Likelihood):如果假设A成立,我们观察到证据B的可能性有多大。
- P(A) - 先验概率 (Prior):在看到任何证据B之前,我们对假设A的初始信念或经验概率。
- P(B) - 证据 (Evidence) 或 边缘似然:证据B出现的总概率,起到一个归一化常数的作用,确保后验概率是一个合法的概率值(0到1之间)。
核心思想:贝叶斯定理告诉我们如何用新的证据(B)来更新我们对一个假设(A)的初始看法(先验),从而得到一个更接近真实的看法(后验)。这是一个“学习”或“推理”的过程。
2.3 在机器学习中的应用:朴素贝叶斯分类器
贝叶斯定理的一个强大应用是朴素贝叶斯分类器。它常用于文本分类(如垃圾邮件过滤、情感分析)。
- 目标:给定一个数据点(如一封邮件),将其分类到多个类别中的一个(如“垃圾邮件”或“正常邮件”)。
- “朴素”假设:该算法假设数据的各个特征在给定类别下是相互独立的。虽然这个假设在现实中通常不完全成立,但它极大地简化了计算,并在实践中取得了很好的效果。
- 分类原理:对于一封新邮件(由一堆词
w1, w2, ..., wn组成),我们分别计算它属于“垃圾邮件”类和“正常邮件”类的后验概率P(垃圾|w1...wn)和P(正常|w1...wn),然后选择概率更大的那个类别。- 根据贝叶斯定理,这可以转化为:
P(类别|特征) ∝ P(特征|类别) * P(类别) - 利用特征独立性假设:
P(w1, w2, ..., wn | 类别) = P(w1|类别) * P(w2|类别) * ... * P(wn|类别) - 因此,我们只需要从训练数据中估计出每个词在各类别下的出现概率(似然)以及每个类别本身的先验概率,就可以进行预测。
- 根据贝叶斯定理,这可以转化为:
3. 代码示例:用朴素贝叶斯进行文本情感分类
我们将使用 scikit-learn 库,它提供了简单易用的朴素贝叶斯分类器。这里我们做一个简单的例子:根据电影评论中的关键词,判断评论是“正面”还是“负面”。
# 导入必要的库
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
# 1. 准备示例数据(实际中会使用更大的数据集)
# 训练数据:(评论文本, 情感标签)
train_data = [
("这部电影非常精彩,演员演技一流", "正面"),
("故事感人,画面优美,强烈推荐", "正面"),
("剧情拖沓,完全浪费时间", "负面"),
("太难看了,看了一半就离场", "负面"),
("节奏很好,特效震撼", "正面"),
("毫无新意,剧情老套", "负面")
]
# 将数据分开
texts, labels = zip(*train_data)
# 2. 特征提取:将文本转换为词频向量
vectorizer = CountVectorizer()
# 使用训练数据拟合并转换
X = vectorizer.fit_transform(texts)
y = labels
# 3. 划分训练集和测试集 (本例数据少,这里仅作演示)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
# 4. 训练朴素贝叶斯分类器
# MultinomialNB 适用于文本分类中的词频特征
model = MultinomialNB()
model.fit(X_train, y_train)
# 5. 预测与评估
y_pred = model.predict(X_test)
print(f"测试集预测结果: {list(y_pred)}")
print(f"测试集真实标签: {list(y_test)}")
print(f"准确率: {accuracy_score(y_test, y_pred):.2f}")
# 6. 对新评论进行预测
new_comments = [
"演员表演太差了",
"很感动,值得二刷"
]
# 注意:必须用同一个vectorizer进行转换
new_X = vectorizer.transform(new_comments)
new_predictions = model.predict(new_X)
print("\n新评论预测:")
for comment, pred in zip(new_comments, new_predictions):
print(f" '{comment}' -> {pred}")
代码解释:
- 数据准备:我们创建了一个小型的带有标签的评论数据集。
- 特征提取:
CountVectorizer会统计每个词在评论中出现的次数,将文本转换成一个数字矩阵(词袋模型)。这就是模型的输入特征。 - 模型训练:
MultinomialNB模型在训练过程中,会计算每个特征(词)在每个类别下出现的条件概率P(词|类别),以及每个类别的先验概率P(类别)。 - 预测:对于新评论,模型会根据贝叶斯定理和独立性假设,计算它属于每个类别的后验概率,选择概率最大的类别作为预测结果。
4. 实践练习
练习题 1:直接应用贝叶斯公式
假设一种疾病的患病率为1%(先验概率 P(病) = 0.01)。有一种检测方法,其准确率为99%:即如果一个人有病,检测为阳性的概率为99%(P(阳|病) = 0.99);如果没病,检测为阴性的概率为99%(P(阴|健) = 0.99)。
问:如果一个人检测结果为阳性,他真正患病的概率是多少(P(病|阳))?
要求:使用贝叶斯定理手动计算,并写出计算过程。
练习题 2:理解先验与后验
继续使用练习题1的背景。
a) 如果检测结果为阳性,后验概率 P(病|阳) 是多少?
b) 如果对这个人进行第二次独立的检测,结果仍然是阳性。那么基于两次阳性结果,P(病|阳, 阳) 的新后验概率是多少?(提示:将第一次的后验概率作为第二次的先验概率)。
要求:计算第二次检测后的后验概率,并观察概率值的变化,简要说明这体现了贝叶斯学习的什么特性。
练习题 3:扩展文本分类器(挑战题)
修改上面的代码示例,使其能够处理三个类别:“正面”、“负面”、“中性”。
- 扩充
train_data,加入一些“中性”的评论(例如:“电影还行,没什么特别感觉”,“普通的爆米花电影”)。 - 运行修改后的代码,查看分类器对新评论(可以是新的中性评论)的预测是否合理。
5. 常见错误
- 混淆条件概率的方向:将
P(A|B)和P(B|A)搞混。记住:P(阳性|有病)通常很高(99%),但P(有病|阳性)可能出乎意料地低(如练习题1所示)。贝叶斯定理正是用来连接这两个方向的。 - 忽略“独立性假设”的影响:朴素贝叶斯分类器假设特征独立。当特征之间存在很强的相关性(如文本中的“纽约”和“市”)时,模型的性能可能会受到影响。理解这个假设的局限性和优势很重要。
- 忘记归一化或错误计算证据P(B):在手动计算贝叶斯公式时,分母
P(B)需要考虑所有假设(如“有病”和“健康”)下产生证据B的全概率,即P(B) = P(B|A)P(A) + P(B|非A)P(非A)。漏掉任何一个部分都会导致结果错误。 - 在代码中错用vectorizer:对训练数据和测试数据/新数据必须使用同一个已拟合(
fit)的vectorizer进行转换(transform)。如果在测试数据上重新fit_transform,会导致特征空间不一致,模型无法工作。
6. 小结
本课我们学习了贝叶斯定理,它是概率论和机器学习中一个核心的推理工具。
- 核心公式:
P(A|B) = [P(B|A) * P(A)] / P(B)。 - 核心思想:利用新的证据(B)来更新我们对假设(A)的先验概率(P(A)),得到更精确的后验概率(P(A|B))。这是一个持续学习和推理的过程。
- 关键术语:先验概率、似然、后验概率、证据。
- 重要应用:朴素贝叶斯分类器是贝叶斯定理在监督学习中的一个经典应用。它通过“特征条件独立”的朴素假设,将复杂的联合概率计算分解为简单的单个特征概率乘积,从而高效地解决分类问题,尤其在文本分类领域表现出色。
理解贝叶斯思维,能帮助你更好地理解许多机器学习算法背后的“推理”逻辑。下一课,我们将转向描述性统计,学习如何用数字概括数据的基本特征。