机器学习中的朴素贝叶斯(Naive Bayes)模型
1. 用实例来理解朴素贝叶斯
下面用具体的数据来演示垃圾邮件 vs 正常邮件的概率计算
假设我们有一个小型邮件数据集
邮件内容 | 类别(垃圾/正常) |
---|---|
“免费 赢取 大奖” | 垃圾 |
“免费 参加会议” | 正常 |
“中奖 点击 链接” | 垃圾 |
“明天 开会” | 正常 |
“赢取 免费 礼品” | 垃圾 |
Step 1: 统计基础概率
- 总邮件数:5 封
- 垃圾邮件:3 封 →
P(垃圾) = 3/5 = 0.6
- 正常邮件:2 封 →
P(正常) = 2/5 = 0.4
- 垃圾邮件:3 封 →
Step 2: 统计每个词的条件概率
计算每个词在垃圾邮件和正常邮件中出现的概率:
(例如:P("免费"|垃圾)
= 垃圾邮件中出现“免费”的概率)
单词 | 在垃圾邮件中出现的次数 | P(单词|垃圾) | 在正常邮件中出现的次数 | P(单词|正常) |
---|---|---|---|---|
免费 | 3 封(所有垃圾邮件) | 3/3 = 1.0 | 1 封(“免费 参加会议”) | 1/2 = 0.5 |
中奖 | 1 封 | 1/3 ≈ 0.33 | 0 封 | 0/2 = 0.0 |
赢取 | 2 封 | 2/3 ≈ 0.67 | 0 封 | 0/2 = 0.0 |
会议 | 0 封 | 0/3 = 0.0 | 1 封 | 1/2 = 0.5 |
明天 | 0 封 | 0/3 = 0.0 | 1 封 | 1/2 = 0.5 |
注:如果某个词在某一类中未出现(概率=0),会导致整个乘积为0。实际中会使用拉普拉斯平滑(+1)避免此问题,这里暂不展开。
Step 3: 对新邮件进行分类
假设新邮件内容是:“免费 中奖”,判断它是垃圾还是正常邮件。
计算垃圾邮件概率
P(垃圾∣"免费 中奖")∝P(垃圾)×P("免费"∣垃圾)×P("中奖"∣垃圾)=0.6×1.0×0.33≈0.198 P(垃圾|\text{"免费 中奖"}) \propto P(垃圾) \times P(\text{"免费"}|垃圾) \times P(\text{"中奖"}|垃圾) \\ = 0.6 \times 1.0 \times 0.33 \approx \mathbf{0.198} P(垃圾∣"免费 中奖")∝P(垃圾)×P("免费"∣垃圾)×P("中奖"∣垃圾)=0.6×1.0×0.33≈0.198
计算正常邮件概率
P(正常∣"免费 中奖")∝P(正常)×P("免费"∣正常)×P("中奖"∣正常)=0.4×0.5×0.0=0.0 P(正常|\text{"免费 中奖"}) \propto P(正常) \times P(\text{"免费"}|正常) \times P(\text{"中奖"}|正常) \\ = 0.4 \times 0.5 \times 0.0 = \mathbf{0.0} P(正常∣"免费 中奖")∝P(正常)×P("免费"∣正常)×P("中奖"∣正常)=0.4×0.5×0.0=0.0
问题:正常邮件概率=0,因为“中奖”从未在正常邮件中出现过。实际中会调整概率(见后文修正)。
结论
- 垃圾邮件概率:0.198
- 正常邮件概率:0.0
→ 判定为垃圾邮件。
修正:拉普拉斯平滑(避免概率=0)
对未出现的词,给所有计数+1(避免零概率):
- 修正后
P("中奖"|正常) = (0+1)/(2+总唯一词数)
(假设总唯一词数=5,则P("中奖"|正常) = 1/7 ≈ 0.14
)
修正后的正常邮件概率:
P(正常∣"免费 中奖")∝0.4×0.5×0.14≈0.028P(正常|\text{"免费 中奖"})\propto 0.4 \times 0.5 \times 0.14 \approx \mathbf{0.028}P(正常∣"免费 中奖")∝0.4×0.5×0.14≈0.028
此时垃圾邮件概率(0.198)仍大于正常邮件概率(0.028),依然判定为垃圾邮件。
关键点总结
- P(类别):类别的初始概率(如垃圾邮件占60%)。
- P(单词|类别):某类邮件中某个单词出现的概率。
- 连乘:假设所有词独立,概率相乘得到联合概率。
- 平滑处理:避免未出现的词导致概率归零。
这样计算后,选择概率更大的类别作为预测结果!
2.用朴素贝叶斯解释下面的问题
假设有一种病叫做“贝叶死”,它的发病率是万分之一,即10000 人中会有1个人得病。现有一种测试可以检验一个人是否得病的准确率是99.9%,误报率(假阳)是0.1% 那么,如果一个人被查出来患有“叶贝死”,实际上患有的可能性有多大?
问题重述(“贝叶死”检测问题)
-
发病率(先验概率):
P(病)=110000=0.0001P(\text{病}) = \frac{1}{10000} = 0.0001P(病)=100001=0.0001
P(健康)=1−P(病)=0.9999P(\text{健康}) = 1 - P(\text{病}) = 0.9999P(健康)=1−P(病)=0.9999 -
检测准确率:
- 真阳性(True Positive):已知患病时,检测为阳性的概率:99.9% → P(阳性∣病)=0.999P(\text{阳性}|\text{病}) = 0.999P(阳性∣病)=0.999
- 假阳性(False Positive):已知健康时,检测为阳性的概率:0.1% → P(阳性∣健康)=0.001P(\text{阳性}|\text{健康}) = 0.001P(阳性∣健康)=0.001
-
问题:
如果一个人检测结果为阳性,实际患病的概率是多少?即求 P(病∣阳性)P(\text{病}|\text{阳性})P(病∣阳性)。
用朴素贝叶斯推导
根据贝叶斯定理:
P(病∣阳性)=P(阳性∣病)⋅P(病)P(阳性)
P(\text{病}|\text{阳性}) = \frac{P(\text{阳性}|\text{病}) \cdot P(\text{病})}{P(\text{阳性})}
P(病∣阳性)=P(阳性)P(阳性∣病)⋅P(病)
其中,P(阳性)P(\text{阳性})P(阳性)是检测为阳性的总概率,包括真阳性和假阳性:
P(阳性)=P(阳性∣病)⋅P(病)+P(阳性∣健康)⋅P(健康)
P(\text{阳性}) = P(\text{阳性}|\text{病}) \cdot P(\text{病}) + P(\text{阳性}|\text{健康}) \cdot P(\text{健康})
P(阳性)=P(阳性∣病)⋅P(病)+P(阳性∣健康)⋅P(健康)
具体计算
-
计算分子(真阳性部分):
P(阳性∣病)⋅P(病)=0.999×0.0001=0.0000999 P(\text{阳性}|\text{病}) \cdot P(\text{病}) = 0.999 \times 0.0001 = 0.0000999 P(阳性∣病)⋅P(病)=0.999×0.0001=0.0000999 -
计算分母(所有阳性情况):
P(阳性)=0.999×0.0001+0.001×0.9999=0.0000999+0.0009999=0.0010998 P(\text{阳性}) = 0.999 \times 0.0001 + 0.001 \times 0.9999 = 0.0000999 + 0.0009999 = 0.0010998 P(阳性)=0.999×0.0001+0.001×0.9999=0.0000999+0.0009999=0.0010998 -
最终概率:
P(病∣阳性)=0.00009990.0010998≈0.0908(约9.08%) P(\text{病}|\text{阳性}) = \frac{0.0000999}{0.0010998} \approx 0.0908 \quad \text{(约9.08\%)} P(病∣阳性)=0.00109980.0000999≈0.0908(约9.08%)
直观解释
-
在10000人中:
- 1人患病,且检测为阳性的概率:1×0.999≈11 \times 0.999 \approx 11×0.999≈1 人(真阳性)。
- 9999人健康,但检测为阳性的概率:9999×0.001≈109999 \times 0.001 \approx 109999×0.001≈10 人(假阳性)。
-
所有阳性结果:共 1+10=111 + 10 = 111+10=11 人。
-
其中真正患病:仅1人。
因此,检测为阳性时,实际患病的概率是:
111≈9.09%(与公式结果一致)
\frac{1}{11} \approx 9.09\% \quad \text{(与公式结果一致)}
111≈9.09%(与公式结果一致)
结论
即使检测准确率高达99.9%,由于发病率极低(万分之一),假阳性人数远多于真阳性。
最终:
P(病∣阳性)≈9.1%
P(\text{病}|\text{阳性}) \approx \mathbf{9.1\%}
P(病∣阳性)≈9.1%
这意味着,检测为阳性的人中,超过90%是误诊!
背后的贝叶斯思想
- 先验概率很重要:发病率低时,即使检测准确率高,误诊仍可能主导结果。
- 不要忽略基础比率(Base Rate Neglect):人们常忽视先验概率,只关注检测的“准确性”。
- 实际应用:对罕见病的筛查,需结合多次检测或更高特异性的方法降低误诊率。
这就是贝叶斯定理的经典案例——“阳性结果≠患病”!
3.朴素贝叶斯公式总结
1. 公式分解
贝叶斯定理的完整形式是:
P(y∣X)=P(y)∏P(xi∣y)P(X)
P(y|X) = \frac{P(y) \prod P(x_i|y)}{P(X)}
P(y∣X)=P(X)P(y)∏P(xi∣y)
但 $ P(X) $ 对所有类别 $ y $ 都相同,因此比较时只需计算分子:
P(y∣X)∝P(y)∏P(xi∣y)
P(y|X) \propto P(y) \prod P(x_i|y)
P(y∣X)∝P(y)∏P(xi∣y)
- P(y∣X)P(y|X)P(y∣X):在已知特征 X=(x1,x2,...,xn)X = (x_1, x_2, ..., x_n)X=(x1,x2,...,xn) 的情况下,样本属于类别 yyy 的概率(后验概率)。
- P(y)P(y)P(y):类别 yyy 的先验概率(即数据中类别 yyy 出现的概率)。
- P(xi∣y)P(x_i|y)P(xi∣y):在类别 yyy 下,特征 xix_ixi 出现的概率(似然概率)。
- ∝\propto∝:表示“正比于”,即我们可以忽略分母 P(X)P(X)P(X)(因为对所有类别 yyy 都一样,不影响比较)。
2. 直观理解
假设我们要判断一封邮件是不是垃圾邮件(y=垃圾邮件y = \text{垃圾邮件}y=垃圾邮件 或 y=正常邮件y = \text{正常邮件}y=正常邮件),邮件的特征 XXX 是其中的单词(如“免费”“中奖”等)。
朴素贝叶斯的计算逻辑是:
- 先看数据中垃圾邮件的比例(P(y)P(y)P(y))。
- 再看垃圾邮件中每个单词出现的概率(P(xi∣y)P(x_i|y)P(xi∣y))。
- 假设所有单词相互独立(“朴素”假设),计算它们的联合概率(即乘积)。
- 比较不同类别的概率,选择概率最大的作为预测结果。
3. 具体例子
数据示例
邮件内容 | 类别(垃圾/正常) |
---|---|
“免费 赢取 大奖” | 垃圾 |
“免费 参加会议” | 正常 |
“中奖 点击 链接” | 垃圾 |
“明天 开会” | 正常 |
“赢取 免费 礼品” | 垃圾 |
计算概率
-
先验概率:
- P(垃圾)=35=0.6P(\text{垃圾}) = \frac{3}{5} = 0.6P(垃圾)=53=0.6
- P(正常)=25=0.4P(\text{正常}) = \frac{2}{5} = 0.4P(正常)=52=0.4
-
条件概率(单词在垃圾邮件中的概率):
- P(免费∣垃圾)=33=1.0P(\text{免费}|\text{垃圾}) = \frac{3}{3} = 1.0P(免费∣垃圾)=33=1.0
- P(中奖∣垃圾)=13≈0.33P(\text{中奖}|\text{垃圾}) = \frac{1}{3} \approx 0.33P(中奖∣垃圾)=31≈0.33
- P(赢取∣垃圾)=23≈0.67P(\text{赢取}|\text{垃圾}) = \frac{2}{3} \approx 0.67P(赢取∣垃圾)=32≈0.67
预测新邮件
假设新邮件内容是 “免费 中奖”,判断它是垃圾邮件还是正常邮件。
垃圾邮件的概率
P(垃圾∣免费, 中奖)∝P(垃圾)×P(免费∣垃圾)×P(中奖∣垃圾)=0.6×1.0×0.33≈0.198 P(\text{垃圾}|\text{免费, 中奖}) \propto P(\text{垃圾}) \times P(\text{免费}|\text{垃圾}) \times P(\text{中奖}|\text{垃圾}) \\ = 0.6 \times 1.0 \times 0.33 \approx 0.198 P(垃圾∣免费, 中奖)∝P(垃圾)×P(免费∣垃圾)×P(中奖∣垃圾)=0.6×1.0×0.33≈0.198
正常邮件的概率
P(正常∣免费, 中奖)∝P(正常)×P(免费∣正常)×P(中奖∣正常)=0.4×0.5×0.0=0.0(需拉普拉斯平滑调整) P(\text{正常}|\text{免费, 中奖}) \propto P(\text{正常}) \times P(\text{免费}|\text{正常}) \times P(\text{中奖}|\text{正常}) \\ = 0.4 \times 0.5 \times 0.0 = 0.0 \quad \text{(需拉普拉斯平滑调整)} P(正常∣免费, 中奖)∝P(正常)×P(免费∣正常)×P(中奖∣正常)=0.4×0.5×0.0=0.0(需拉普拉斯平滑调整)
结论
垃圾邮件的概率(0.198) > 正常邮件的概率(0.0),因此判定为垃圾邮件。
4. 关键点总结
- 朴素贝叶斯假设:所有特征 xix_ixi 相互独立(“朴素”)。
- 计算方式:
- 先计算类别的先验概率 P(y)P(y)P(y)。
- 再计算每个特征在类别下的条件概率 P(xi∣y)P(x_i|y)P(xi∣y)。
- 联合概率 = 先验概率 × 所有特征的条件概率。
- 预测:选择使 P(y∣X)P(y|X)P(y∣X) 最大的类别 yyy。
5. 应用场景
- 文本分类(垃圾邮件、情感分析)
- 医学诊断(疾病预测)
- 推荐系统(用户兴趣分类)
这个公式虽然简单,但在实际应用中非常强大! 🚀
4.朴素贝叶斯分类器
-
常用于文本分类,文本过滤、情感预测、推荐系统等,尤其是对于英文等语言来说,分类效果很好
-
准备阶段,需要确定特征属性,属性值以及label => 训练集
-
训练阶段,输入是特征属性和训练样本,输出是分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率
-
应用阶段,使用分类器对新数据进行分类