1. 从贝叶斯定理到“朴素”假设:理解三种常见变体的选型逻辑
1.1 先搞懂贝叶斯定理到底在算什么
很多初学者一上来就被朴素贝叶斯的名字吓住了,其实它的数学基础只有一个——贝叶斯定理。我试过用一个很生活化的例子来解释它,效果比直接摆公式好得多。
假设你是一个医生,某种罕见病的发病率是1%。现在来了一个病人,检测试纸显示阳性。但试纸不是100%准确的:有病的人测出来阳性概率是99%,没病的人测出来阳性概率是5%。那么问题来了,这个病人真正得病的概率是多少?
大多数人第一反应是“99%”,但这是错的。正确答案应该是:
P(得病|阳性) = P(阳性|得病) × P(得病) / P(阳性)
分子是0.99 × 0.01 = 0.0099,分母是0.0099 + 0.05 × 0.99 = 0.0594,算出来大概是16.7%。
这个例子说明了一个关键点:先验概率(得病率1%)对结果的影响非常大。试纸看起来挺准,但因为病太罕见了,阳性结果里大部分其实是误报。贝叶斯定理的核心价值就是告诉你:在观察到新证据之后,如何修正你对某件事原本的相信程度。
换到机器学习里,我们做的事情完全同理。“得病”变成“这封邮件是垃圾邮件”,“阳性”变成“邮件里出现了‘发票’这个词”,“发病率1%”变成“历史上垃圾邮件的比例”。贝叶斯定理负责回答:既然邮件里有这个特征,那它是垃圾邮件的概率有多大?
1.2 为什么叫“朴素”?这个假设到底有多强
贝叶斯定理本身是数学上严格成立的,但直接用它做分类有个难处:如果要精确计算P(特征组合|类别),而特征有几十个维度,每个维度取值空间又很大,那这个联合概率分布需要海量数据才能估计出来,现实中几乎不可行。
朴素贝叶斯做了一个极其大胆的简化假设:给定类别标签后,所有特征之间条件独立。意思是,一封邮件是不是垃圾邮件这件事确定了之后,“出现‘发票’这个词”和“出现‘中奖’这个词”这两个事件互不影响,各自独立地由垃圾邮件这个状态决定。
这个假设在三五年前学界是会被嘲笑的,因为真实数据里特征相关性太常见了。“银行”和“转账”强相关,天气“多云”和“下雨”强相关,怎么可能独立?
但神奇的是,这个在理论上站不住脚的假设,在实际分类任务中往往表现很好,原因有两点:
- 分类任务只关心“谁更大”,不关心“有多大”。即使概率估计数值有偏差,只要各类别之间的相对大小关系保持正确,分类结果就是对的。
- 特征相关性的影响往往相互抵消。一个特征对某个类别的“超额支持”可能被另一个特征对另一个类别的“超额支持”抵消掉,整体排序反而稳定。
朴素不是缺陷,而是这个算法的生存策略。它用“不精确但可估计”换取“在大规模高维数据上也能算”,在文本分类这种特征动辄上万维的场景里,这是唯一可行的路径。
1.3 高斯、多项式、伯努利:三种变体到底选哪个
很多人用sklearn的时候只知道GaussianNB,换了个数据集就发现效果不行,其实是没搞清楚假设的数据分布。这三种模型的区别就在一个地方:得分特征的“类型”被建模成了什么样的概率分布。
| 变体 | 适用的特征类型 | 典型场景 | 核心概率计算方式 |
|---|---|---|---|
| 高斯朴素贝叶斯 | 连续值特征 | 鸢尾花分类、人体指标检测 | 假设特征服从正态分布,用均值和方差算出条件概率 |
| 多项式朴素贝叶斯 | 离散计数特征 | 文本分类、词频统计 | 直接统计特征在类别中的出现次数比例 |
| 伯努利朴素贝叶斯 | 二元特征(0/1) | 文档中“词是否出现”而不是出现几次 | 每个特征就是一个布尔变量,算P(出现 |
选型的判断标准很简单:
- 特征字段是身高、体重、温度这种连续值,用高斯。它不需要你手动离散化,模型内部直接用正态分布拟合。
- 特征是“某个词出现了多少次”、“某个事件发生了几次”这种整数计数,用多项式。注意,它不能接受负数,否则概率计算会直接崩掉。
- 特征只是“有”和“没有”两种状态,比如“这个词在文档里出现过/没出现过”,用伯努利。它和多项式的差别在于:多项式会把多次出现的词算多次,伯努利只看是否出现过。对于短文本去重这种场景,伯努利往往比多项式更稳。
我见过不少新手拿高斯朴素贝叶斯去做文本分类,结果准确率惨不忍睹。原因就是词频是离散计数,不是连续分布,高斯模型的假设根本不成立。换个MultinomialNB,同样的数据,效果立竿见影。**选模型之前先想清楚特征是什
