人工智能之核心基础 机器学习
第六章 朴素贝叶斯
文章目录
- [人工智能之核心基础 机器学习](#人工智能之核心基础 机器学习)
- [6.1 贝叶斯定理基础](#6.1 贝叶斯定理基础)
- [📌 核心公式:用已知反推未知](#📌 核心公式:用已知反推未知)
- [💡 举个生活例子:疾病检测](#💡 举个生活例子:疾病检测)
- [6.2 朴素贝叶斯的"朴素"假设](#6.2 朴素贝叶斯的“朴素”假设)
- [🔑 核心假设:**特征条件独立**](#🔑 核心假设:特征条件独立)
- [6.3 常见朴素贝叶斯模型](#6.3 常见朴素贝叶斯模型)
- [📊 举例说明](#📊 举例说明)
- [6.4 朴素贝叶斯的优缺点与适用场景](#6.4 朴素贝叶斯的优缺点与适用场景)
- [✅ 优点](#✅ 优点)
- [❌ 缺点](#❌ 缺点)
- [🎯 最佳适用场景](#🎯 最佳适用场景)
- [6.5 实战案例 + 代码实现](#6.5 实战案例 + 代码实现)
- 案例1:垃圾邮件过滤(多项式NB)
- 案例2:电影评论情感分析(正面/负面)
- [案例3:高斯NB ------ 鸢尾花分类(连续特征)](#案例3:高斯NB —— 鸢尾花分类(连续特征))
- [🎯 本章总结](#🎯 本章总结)
- 资料关注
6.1 贝叶斯定理基础
📌 核心公式:用已知反推未知
贝叶斯定理 告诉我们:
在看到某些证据后,如何更新对某件事发生的信念(概率)。
公式如下:
P ( Y ∣ X ) = P ( X ∣ Y ) ⋅ P ( Y ) P ( X ) P(Y|X) = \frac{P(X|Y) \cdot P(Y)}{P(X)} P(Y∣X)=P(X)P(X∣Y)⋅P(Y)
- P ( Y ∣ X ) P(Y|X) P(Y∣X):后验概率 ------ 看到数据 X X X 后,类别 Y Y Y 的概率(我们要预测的!)
- P ( X ∣ Y ) P(X|Y) P(X∣Y):似然 ------ 如果是类别 Y Y Y,出现数据 X X X 的可能性
- P ( Y ) P(Y) P(Y):先验概率 ------ 类别 Y Y Y 本身出现的频率(比如垃圾邮件占30%)
- P ( X ) P(X) P(X):证据 ------ 数据 X X X 出现的总概率(对所有类别都一样,可忽略)
✅ 目标 :对每个类别 Y Y Y 计算 P ( Y ∣ X ) P(Y|X) P(Y∣X),选概率最大的那个!
💡 举个生活例子:疾病检测
- 先验:人群中得病概率 P ( 病 ) = 1 % P(\text{病}) = 1\% P(病)=1%
- 检测准确率:得病者检出阳性 P ( 阳 ∣ 病 ) = 99 % P(\text{阳}|\text{病}) = 99\% P(阳∣病)=99%
- 假阳性率:健康人误检 P ( 阳 ∣ 健康 ) = 5 % P(\text{阳}|\text{健康}) = 5\% P(阳∣健康)=5%
问:你检测阳性,真得病的概率是多少?
用贝叶斯:
P ( 病 ∣ 阳 ) = 0.99 × 0.01 0.99 × 0.01 + 0.05 × 0.99 ≈ 16.7 % P(\text{病}|\text{阳}) = \frac{0.99 \times 0.01}{0.99 \times 0.01 + 0.05 \times 0.99} \approx 16.7\% P(病∣阳)=0.99×0.01+0.05×0.990.99×0.01≈16.7%
👉 即使检测阳性,真实得病概率也不高!这就是先验的重要性。
6.2 朴素贝叶斯的"朴素"假设
🔑 核心假设:特征条件独立
给定类别 Y Y Y,所有特征 x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn 相互独立!
即:
P ( X ∣ Y ) = P ( x 1 , x 2 , . . . , x n ∣ Y ) = P ( x 1 ∣ Y ) ⋅ P ( x 2 ∣ Y ) ⋅ . . . ⋅ P ( x n ∣ Y ) P(X|Y) = P(x_1, x_2, ..., x_n | Y) = P(x_1|Y) \cdot P(x_2|Y) \cdot ... \cdot P(x_n|Y) P(X∣Y)=P(x1,x2,...,xn∣Y)=P(x1∣Y)⋅P(x2∣Y)⋅...⋅P(xn∣Y)
❗ 这个假设在现实中几乎不成立 (比如"免费"和"赢钱"在垃圾邮件中常一起出现)
但神奇的是------即使假设错误,朴素贝叶斯依然效果很好!
✅ 为什么能work?
- 分类只需比较相对大小,不需要精确概率
- 对噪声和无关特征鲁棒
- 训练快、参数少,不易过拟合
6.3 常见朴素贝叶斯模型
根据特征类型不同,选择不同概率分布:
| 模型 | 特征类型 | 概率分布 | 典型场景 |
|---|---|---|---|
| 高斯朴素贝叶斯 | 连续数值 | 假设特征服从正态分布 | 身高、体重、温度等连续值 |
| 多项式朴素贝叶斯 | 离散计数 | 特征为词频/次数 | 文本分类(TF、TF-IDF) |
| 伯努利朴素贝叶斯 | 二值特征 | 特征为0/1(是否出现) | 短文本、关键词存在性 |
📊 举例说明
- 邮件内容 :"免费 免费 赢钱"
- 多项式NB:统计词频 → "免费":2, "赢钱":1
- 伯努利NB:只看是否出现 → "免费":1, "赢钱":1
📌 文本分类首选:多项式NB(保留词频信息)
6.4 朴素贝叶斯的优缺点与适用场景
✅ 优点
| 优势 | 说明 |
|---|---|
| 训练极快 | 只需统计频率,无需迭代 |
| 内存占用小 | 存储每个特征的分布参数 |
| 对小样本有效 | 即使数据少也能工作 |
| 天然支持多分类 | 直接计算所有类别概率 |
| 对噪声鲁棒 | 无关特征影响小 |
❌ 缺点
| 劣势 | 说明 |
|---|---|
| 独立性假设太强 | 实际特征常相关 |
| 无法捕捉特征交互 | 比如"不+好" ≠ "不好" |
| 概率估计不准 | 输出概率不可靠(但排序可用) |
| 零概率问题 | 某词在训练集中未出现 → 概率为0 → 整体为0 |
🔧 解决零概率 :拉普拉斯平滑 (Laplace Smoothing)
给每个计数加1,避免0概率
🎯 最佳适用场景
- ✅ 文本分类(垃圾邮件、情感分析、新闻分类)
- ✅ 实时预测(因推理速度极快)
- ✅ 高维稀疏数据(如词袋模型)
- ❌ 不适合:需要精确概率、特征高度相关、连续特征非高斯分布
💡 行业事实 :
尽管深度学习流行,朴素贝叶斯仍是工业界文本分类的baseline首选!
6.5 实战案例 + 代码实现
案例1:垃圾邮件过滤(多项式NB)
python
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report
# 构造垃圾邮件 vs 正常邮件数据(简化版)
emails = [
"Free money now!!!",
"Win a million dollars!",
"Hey, how are you?",
"Meeting tomorrow at 3pm",
"Claim your prize today!",
"Can we reschedule the call?"
]
labels = [1, 1, 0, 0, 1, 0] # 1=垃圾, 0=正常
# 创建管道:词袋 → TF-IDF → 多项式NB
text_clf = Pipeline([
('vect', CountVectorizer()), # 生成词频
('tfidf', TfidfTransformer()), # 转TF-IDF
('clf', MultinomialNB(alpha=1.0)) # alpha=拉普拉斯平滑参数
])
# 训练
text_clf.fit(emails, labels)
# 预测新邮件
new_emails = ["Congratulations! You won free cash!", "Let's have lunch"]
preds = text_clf.predict(new_emails)
for email, pred in zip(new_emails, preds):
print(f"'{email}' → {'垃圾邮件' if pred == 1 else '正常邮件'}")
输出:
'Congratulations! You won free cash!' → 垃圾邮件
'Let's have lunch' → 正常邮件
案例2:电影评论情感分析(正面/负面)
python
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 模拟数据
reviews = [
"This movie is amazing!",
"I love the acting",
"Terrible film, waste of time",
"Boring and slow",
"Great story and visuals",
"Awful dialogue"
]
sentiments = [1, 1, 0, 0, 1, 0] # 1=正面, 0=负面
# 划分数据
X_train, X_test, y_train, y_test = train_test_split(
reviews, sentiments, test_size=0.3, random_state=42
)
# 向量化 + 训练
vectorizer = TfidfVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)
nb = MultinomialNB(alpha=0.5)
nb.fit(X_train_vec, y_train)
# 评估
y_pred = nb.predict(X_test_vec)
print("准确率:", accuracy_score(y_test, y_pred))
# 查看预测概率
proba = nb.predict_proba(X_test_vec)
for i, text in enumerate(X_test):
print(f"'{text}' → 正面概率: {proba[i][1]:.2f}")
案例3:高斯NB ------ 鸢尾花分类(连续特征)
python
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
gnb = GaussianNB()
gnb.fit(X_train, y_train)
print("准确率:", gnb.score(X_test, y_test))
🎯 本章总结
- 朴素贝叶斯 = 贝叶斯定理 + 特征独立假设
- 文本分类用多项式NB,连续数据用高斯NB
- 训练快、内存小、对小数据友好
- 虽"朴素",但在文本任务中常胜!
💡 建议 :
下次做文本分类项目,先跑一个朴素贝叶斯作为baseline !
它可能比你想象的更强,而且几行代码就能搞定!
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》