Naive Bayes
朴素贝叶斯分类器应用贝叶斯定理,并假设在给定类别的条件下各特征相互独立。内容涵盖不同变体、垃圾邮件过滤、局限和 Python 代码。
朴素贝叶斯是一类概率分类器,在已知类别的条件下,采用特征之间相互独立这一“朴素”假设来应用贝叶斯定理。这一假设使模型能够分别学习各类别中特征的分布,因此训练只需对训练数据进行一次计数遍历,预测时则结合少量已存储的概率。Mehran Sahami 等人于 1998 年将其用于垃圾邮件;基于这一方法构建的贝叶斯垃圾邮件过滤器在 2000 年代初普及开来。如今,它仍然是面向文本和其他超高维数据的监督学习中快速而可靠的基线模型。
朴素贝叶斯的工作原理#
贝叶斯定理给出了已知特征 x₁ … xₙ 时类别 C 的概率:P(C | x) = P(C)·P(x | C) / P(x)。如果要为特征值的每一种组合估算 P(x | C),就需要数量庞大的数据集,因此朴素贝叶斯假设特征在给定类别时条件独立,并将其拆解为 P(x₁ | C)·P(x₂ | C)·…·P(xₙ | C)。分类器会选择先验概率 P(C) 与上述乘积的乘积最大的类别,并省略对所有类别都相同的 P(x)。实现时会将对数概率相加,而不是直接相乘,因为成千上万个小数相乘会导致浮点运算下溢。
计数会导致一种失效情况:训练时从未在某个类别中出现过的词,其概率会变为零;这样一来,任何包含该词的文档都会让该类别的概率归零,无论其他证据如何。加法平滑会通过给每个计数增加伪计数 α 来解决这一问题;α = 1 即拉普拉斯平滑,也是 scikit-learn 中的默认值。
朴素贝叶斯分类器的类型#
不同变体对各类别中每个特征所服从的分布有不同假设。多项式朴素贝叶斯对计数建模,例如每个词在文档中出现的频率,是文本分类的标准选择。伯努利朴素贝叶斯对特征是否出现进行二元建模,也会惩罚缺少某个类别典型词语的情况。高斯朴素贝叶斯会为每个类别中的每个连续特征拟合正态分布,并分别估计均值和方差。补集朴素贝叶斯利用其他所有类别的数据来估算某个类别的词语统计信息,适用于类别不平衡的文本数据集;类别朴素贝叶斯则处理取值范围固定的类别特征。
此示例使用六条带标签消息中的词频训练 scikit-learn 的 MultinomialNB,并对另外两条消息进行评分:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
# Tiny labeled corpus: 1 = spam, 0 = legitimate
texts = [
"win a free prize now",
"free cash bonus click now",
"claim your free reward today",
"meeting moved to monday",
"lunch with the team today",
"project review notes attached",
]
labels = [1, 1, 1, 0, 0, 0]
# Count words, then learn class priors and per-class word probabilities (alpha=1 is Laplace smoothing)
vectorizer = CountVectorizer()
model = MultinomialNB(alpha=1.0)
model.fit(vectorizer.fit_transform(texts), labels)
new = vectorizer.transform(["free prize today", "notes from the monday meeting"])
print(f"P(spam): {model.predict_proba(new)[:, 1].round(3)}")第一条消息的垃圾邮件概率为 0.881,因为“free”和“prize”只在垃圾邮件中出现;第二条消息的概率为 0.053,因为“notes”“monday”和“meeting”只在正常邮件中出现。如果不进行平滑,“free”在正常邮件类别下的概率就会是零,任何包含这个词的正常邮件都会被判定为垃圾邮件,且置信度达到 100%。
优势与局限#
训练和预测所需时间与样本数和特征数成线性关系,因此朴素贝叶斯能够以极低的推理延迟处理数百万份文档;scikit-learn 的实现还可以通过 partial_fit 接收新批次的数据,支持在线学习。它对数据量的需求也很低:Ng 和 Jordan(2001)表明,朴素贝叶斯只需较少的训练样本,就能接近其渐近错误率;逻辑回归则在数据充足时能达到更低的错误率。即使特征之间存在相关性,它的类别预测往往仍然准确,因为只要类别排序正确即可。
但其概率本身的校准效果较差。相关特征会对同一证据重复计数,使得得分趋近于 0 或 1,因此需要可靠置信度值的应用会使用留出数据重新校准概率。独立词袋模型也无法表示词序或词语之间的相互作用,因此“not good”看起来就像一个否定词和一个褒义词的组合;带有注意力机制的Transformer 等模型则会结合上下文理解它。
应用场景#
- 垃圾邮件过滤:邮件过滤器根据每封邮件包含的词语、发件人模式和链接对邮件评分,并在用户将邮件标记为垃圾邮件时更新词语统计信息。
- 情感分析:根据评论和支持工单中的用词,将其标记为正面或负面;在微调语言模型之前,这是一种常见的初始模型。
- 文档路由:将新闻文章、法律文件和支持请求分类到不同主题或队列中;当某些类别远少于其他类别时,通常会使用补集朴素贝叶斯。
- 自然语言处理(NLP)基线:语言识别和主题标注会使用朴素贝叶斯作为快速的参考基线,任何成本更高的模型都必须优于它。
朴素贝叶斯在计算机视觉中的应用#
相邻像素之间存在很强的相关性,因此将原始像素视为彼此独立的特征,会丢弃定义物体的边缘和纹理,而卷积神经网络通过一起处理邻域来捕捉这些信息。在深度学习出现之前,视觉词袋方法会对局部描述符(例如 SIFT)的直方图应用朴素贝叶斯;这些描述符会通过k-means 聚类分组成视觉词,这相当于视觉领域的词频统计。YOLO26通过目标检测找到的物体类别计数会构成同类计数向量,因此多项式朴素贝叶斯模型仅凭检测结果就能将场景标记为街道、厨房或办公室。
朴素贝叶斯与相关模型的比较#
- 贝叶斯网络:朴素贝叶斯是最简单的贝叶斯网络,其中类别是每个特征唯一的父节点,特征之间没有边。通用贝叶斯网络会添加这些边来建模依赖关系。
- 贝叶斯推断:朴素贝叶斯中的“贝叶斯”指的是贝叶斯定理。标准朴素贝叶斯将每个概率估计为经过平滑处理的频率,也就是单个点估计;而完全贝叶斯方法会为每个参数保留一个分布。
- 支持向量机 (SVM):直接学习判别边界,但训练成本更高。在情感分类任务中,Wang 和 Manning(2012)发现,面对短文本片段时,朴素贝叶斯比 SVM 更准确;面对完整长度的评论时,SVM 则更准确。










