朴素贝叶斯分类器是一种概率型监督学习方法,利用贝叶斯定理和对特征的简化假设,将观测样本归入某个类别。它假定在类别已知的条件下,各特征相互独立。这个名称并不指某一种具体实现,而是涵盖采用不同特征分布的一系列模型。这类分类器应用于机器学习,尤其常用于文档分类和垃圾邮件过滤。(scikit-learn.org)
数学表述
设 表示类别标签, 表示观测到的特征向量。根据贝叶斯定理,类别的后验概率为
其中, 是类别的先验概率, 是给定类别时的条件似然。该模型的核心条件独立假设为
这一假设比两两独立更强:整个联合条件分布必须能够分解为各特征条件分布的乘积。它并不要求各特征在总体中也相互独立。因此,通常采用的预测规则为
对于所有候选类别,分母都相同,因此在选择得分最高的类别时可以省略。(scikit-learn.org)
实际实现通常计算对数得分,
而不是将许多很小的概率相乘。这样可以减少数值下溢,又不改变最终胜出的类别。通过这些得分可以还原归一化的后验概率估计,但分类准确并不意味着概率估计也准确。(nlp.stanford.edu)
学习与平滑
训练过程利用带标签的训练数据估计各类别的频率和特征分布。在基于计数的模型中,最大似然估计使用观测到的相对频率。这样一来,未出现过的特征与类别组合就会被赋予零概率,可能导致该类别的整体得分为零,而不论其他证据如何。(nlp.stanford.edu)
加性平滑通过添加伪计数来解决这一问题。对于多项式文本模型,
其中, 是词表中第 个词在类别 中的出现次数, 是词表大小, 控制平滑程度。令 ,即得到拉普拉斯平滑。这样可以避免仅因某个词未在某一类别的训练文档中出现,就直接排除该类别。(nlp.stanford.edu)
选择后验概率最高的类别是一项决策规则,并不意味着必须通过完整的贝叶斯推断来估计所有参数。朴素贝叶斯的实现可以采用频率估计或平滑后的估计,而不必对参数的不确定性进行积分。(scikit-learn.org)
主要变体
高斯朴素贝叶斯为每个特征指定随类别而异的正态分布,以处理连续特征。训练时,分别估计每个类别中各特征的均值和方差。该模型不估计特征之间的相关性。(scikit-learn.org)
多项式朴素贝叶斯对各类别事件的出现次数建模,尤其适用于词频。在文档分类中,其得分包含 ,因此同一词每重复出现一次,就会再次贡献得分。从文本角度看,它将文档视为在给定类别和文档长度的条件下独立抽取词语所形成的序列,而不是将多项式计数向量的各分量视为独立变量,因为这些分量的总和受到约束。(cmi.ac.in)
伯努利朴素贝叶斯将每个特征表示为服从伯努利分布的二值指示变量。在文本应用中,它记录一个词是否出现,而非出现了多少次。与通常的多项式文档得分不同,词的出现与未出现都会对其似然产生贡献。(aaai.org)
类别型朴素贝叶斯用各自的类别分布对每个离散特征建模。它适用于特征具有多个无序取值的情况,而不是用于表示重复事件的计数。(scikit-learn.org)
补集朴素贝叶斯利用每个目标类别之外的文档来估计权重,从而改进多项式分类方法。这一方法最初在文本分类研究中提出,旨在解决类别不平衡和特征加权方面的不足。它是对基本模型的改造,而不只是为基本模型换用另一种似然分布。(people.csail.mit.edu)
文本表示与计算特性
在自然语言处理中,文档通常先经过分词与词元化,再转换为词袋表示。多项式模型保留词元计数,但舍弃词序;伯努利模型则进一步舍弃重复次数。这些选择决定了各模型将哪些统计事件视为证据。McCallum 和 Nigam 在 1998 年的比较研究表明,这两种事件模型可能产生明显不同的分类结果。(cmi.ac.in)
与不受约束的联合分布相比,独立性假设大幅减少了参数数量。训练主要需要累积统计量,而不必求解大型迭代优化问题。因此,即使词表很大,文本模型的训练和预测也可以高效完成。某些实现还支持增量更新,从而能够进行在线学习,或将无法全部装入内存的数据集分批处理。(nlp.stanford.edu)
局限与评估
现实中的特征在同一类别内往往仍然存在依赖关系。例如,相互关联的词可能导致同一证据被重复计入。尽管如此,不准确的概率估计仍可能保留正确的类别排序。Domingos 和 Pazzani 在 1997 年证明,即使条件独立假设不成立,朴素贝叶斯在零—一损失函数下仍可能是最优的。但这并不能证明它在所有存在特征依赖的数据集上都会表现良好。(gwern.net)
因此,概率估计质量需要与分类准确率分开考察。模型可能给出有用的类别标签,却产生校准不佳的置信度估计。其受限的表示能力也限制了它能够捕捉的关系;增加训练数据并不能消除不恰当的独立性假设。(gwern.net)
评估时,凡是需要从数据中学习的预处理步骤,都必须仅使用训练划分中的数据。特征选择、词表构建以及其他需要拟合的变换,如果使用了留出样本,就可能引入数据泄漏(机器学习)。交叉验证可以用于比较模型变体和平滑超参数,而独立的测试集则用于在这些选择确定之后衡量模型表现。(scikit-learn.org)