本节摘要:朴素贝叶斯用贝叶斯定理加一个「给定类别时特征条件独立」的强假设,把联合概率拆成连乘。假设显然不真,但决策只需要比较谁更大,排序正确即可用。本节讲清它作为生成式模型的身份、拉普拉斯平滑与数值下溢两个工程细节,以及「分类边界等价于线性模型」这层惊喜。
本章以判别式模型开篇(逻辑回归直接建模后验),以生成式模型收尾——朴素贝叶斯先对每个类别建模数据分布,再用贝叶斯定理反推后验。这组对照是「判别式对生成式」这最经典追问的现场教材,也是本章通向第 3 章无监督学习的桥:生成式建模本身就是无标签世界的主语言。
主问题:「特征之间明明不独立,朴素贝叶斯为什么还能工作?」
先给框架再给解释,这题的层次感来自「估计精度」与「决策需求」的错位。
朴素贝叶斯假设:给定类别 y 的条件下,各特征相互独立,于是联合似然拆成连乘 P(x|y) 等于各维 P(x_i|y) 的乘积。现实里词与词显然相关,这个估计确实是有偏的。但分类只要求后验概率的相对大小排序正确,不要求概率数值准——偏差往往是对所有类别同向的,比较时相互抵消,边界位置可以惊人地接近真值。这在文本分类里有大量实证:假设离谱,排序却常常够用。
要补的一句风险声明:当特征相关性在不同类别间不对称时(相关性结构本身依赖类别),抵消失效,朴素贝叶斯的边界会系统性偏移——这时判别式模型(逻辑回归)直接建模边界,反而更稳。「什么时候信它、什么时候别信」比「它准不准」值钱。
追问:「某个词在训练集的某个类别下从没出现过,概率算出零,怎么办?」
这是朴素贝叶斯最著名的坑,两层连问都在这条线上。
import numpy as np class NaiveBayes: def fit(self, X, y, alpha=1.0): self.classes, self.log_prior = np.unique(y, return_counts=True) self.log_prior = np.log(self.log_prior / len(y)) self.log_lik = [] for c in self.classes: counts = X[y == c].sum(axis=0) + alpha # 拉普拉斯平滑 self.log_lik.append(np.log(counts / counts.sum())) self.log_lik = np.array(self.log_lik) def predict(self, X): # 对数空间连乘变连加:分数 = log 先验 + Σ log 似然 scores = X @ self.log_lik.T + self.log_prior return self.classes[np.argmax(scores, axis=1)]
实现里只有两行核心:平滑与对数化。面试白板若被要求手写,这两行就是考点本体。
追问:「同样的问题,逻辑回归和朴素贝叶斯怎么选?」
这题把本章收束成一个大命题,推荐的答法分四步:
一句收束:小数据、高维稀疏、需要快糙猛时用朴素贝叶斯;数据管够、追求边界精度与概率质量时用判别式。这也解释了它在垃圾邮件过滤的黄金年代封神、随后退居基线模型的历史轨迹。
及格:写出贝叶斯定理与独立性假设的分解式;良好:答出平滑与对数两个工程细节,并解释「假设错但排序对」的原因;优秀:把判别式与生成式的取舍讲成数据效率、假设弹性、概率校准的三角权衡,并落到场景选择。第 2 章到此收束,五种经典算法在追问链里各就各位——下一章把标签拿掉,看无监督世界怎么用相似性重建秩序。
问:朴素贝叶斯在小样本上为什么收敛快?
它估计的参数量极小——每维特征按类别估计一个分布参数,不学特征间交互;参数少则需要的样本少,代价是假设僵化。这与逻辑回归「渐近更准但需要更多数据」正好互为镜像,是这个对比题的理论核心。
问:文本分类里多项式与伯努利模型怎么选?
多项式模型统计词频、关注出现多少次,长文本友好;伯努利模型只看出现与否、关注缺失词的证据,短文本合适。特征表示与概率模型要配套,混用是常见的实现级事故。
问:概率连乘的校准问题怎么发现?
看可靠性图或分桶命中率:把预测概率分桶,与桶内实际频率对比。朴素贝叶斯的典型病征是概率被推到两端,中间几乎无人——发现后用校准集做缩放修正。
表达纪律:把「生成式对判别式」的框架放在回答开头,后面的所有细节都挂在框架上,条理自动清晰。
问:特征之间强相关时有什么低成本补救?
不做结构改造的话,可以合并强相关特征组(取均值、主成分或规则组合)再套朴素贝叶斯,等价于手动压缩相关性;或换半朴素贝叶斯(允许特征间树状依赖的模型)。补救的性价比要和数据规模挂钩——数据充足时直接上判别式更省心。
问:先验概率能手工设吗?
能且常见:类先验本质是可调参数,业务代价不对称时可以主动偏置先验代替阈值调整。把先验当「注入业务知识的旋钮」,是生成式模型独有的便利。