1.9. 朴素贝叶斯#
朴素贝叶斯方法是一组监督学习算法,其基础是应用贝叶斯定理,并假设在给定类变量值的情况下,每对特征之间都是条件独立的。贝叶斯定理指出,给定类变量 \(y\) 和依赖特征向量 \(x_1\) 到 \(x_n\),存在以下关系:
使用朴素条件独立性假设,即
对于所有 \(i\),此关系简化为
由于 \(P(x_1, \dots, x_n)\) 在给定输入的情况下是常数,我们可以使用以下分类规则
我们可以使用最大后验概率 (MAP) 估计来估计 \(P(y)\) 和 \(P(x_i \mid y)\);其中前者是训练集中类 \(y\) 的相对频率。
不同的朴素贝叶斯分类器主要区别在于它们对 \(P(x_i \mid y)\) 分布所做的假设。
尽管朴素贝叶斯分类器假设看似过于简化,但它们在许多实际场景中表现出色,例如文档分类和垃圾邮件过滤。它们只需要少量训练数据即可估计必要的参数。(关于朴素贝叶斯为何表现良好以及适用于哪些类型数据的理论原因,请参阅下面的参考文献。)
与更复杂的方法相比,朴素贝叶斯学习器和分类器速度极快。类别条件特征分布的解耦意味着每个分布都可以独立地估计为一维分布。这反过来有助于缓解维度诅咒引起的问题。
另一方面,尽管朴素贝叶斯被认为是一个不错的分类器,但它在估计方面表现不佳,因此 predict_proba
输出的概率不应过于认真对待。
参考文献#
H. Zhang (2004). 朴素贝叶斯的最优性。 Proc. FLAIRS。
1.9.1. 高斯朴素贝叶斯#
GaussianNB
实现了用于分类的高斯朴素贝叶斯算法。特征的似然性被假定为高斯分布
参数 \(\sigma_y\) 和 \(\mu_y\) 使用最大似然估计。
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.naive_bayes import GaussianNB
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
>>> gnb = GaussianNB()
>>> y_pred = gnb.fit(X_train, y_train).predict(X_test)
>>> print("Number of mislabeled points out of a total %d points : %d"
... % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 4
1.9.2. 多项式朴素贝叶斯#
MultinomialNB
实现了适用于多项式分布数据的朴素贝叶斯算法,是文本分类中使用的两种经典朴素贝叶斯变体之一(其中数据通常表示为词向量计数,尽管 tf-idf 向量在实践中也表现良好)。该分布由每个类 \(y\) 的向量 \(\theta_y = (\theta_{y1},\ldots,\theta_{yn})\) 参数化,其中 \(n\) 是特征数量(在文本分类中,是词汇表的大小),\(\theta_{yi}\) 是特征 \(i\) 出现在属于类 \(y\) 的样本中的概率 \(P(x_i \mid y)\)。
参数 \(\theta_y\) 通过最大似然的平滑版本估计,即相对频率计数
其中 \(N_{yi} = \sum_{x \in T} x_i\) 是特征 \(i\) 在训练集 \(T\) 中所有类 \(y\) 的样本中出现的次数,而 \(N_{y} = \sum_{i=1}^{n} N_{yi}\) 是类 \(y\) 所有特征的总计数。
平滑先验 \(\alpha \ge 0\) 用于处理学习样本中不存在的特征,并防止在进一步计算中出现零概率。将 \(\alpha = 1\) 称为拉普拉斯平滑,而 \(\alpha < 1\) 称为 Lidstone 平滑。
1.9.3. 补码朴素贝叶斯#
ComplementNB
实现了补码朴素贝叶斯(CNB)算法。CNB 是标准多项式朴素贝叶斯(MNB)算法的一种改进,特别适用于不平衡数据集。具体而言,CNB 使用每个类的补集的统计数据来计算模型的权重。CNB 的发明者通过经验证明,CNB 的参数估计比 MNB 更稳定。此外,CNB 在文本分类任务上通常优于 MNB(通常有相当大的优势)。
权重计算#
计算权重的过程如下:
其中求和是对所有不属于类 \(c\) 的文档 \(j\) 进行的,\(d_{ij}\) 是文档 \(j\) 中词项 \(i\) 的计数或 tf-idf 值,\(\alpha_i\) 是类似于 MNB 中发现的平滑超参数,\(\alpha = \sum_{i} \alpha_i\)。第二次归一化解决了 MNB 中较长文档主导参数估计的趋势。分类规则是
即,一个文档被分配给与它最差的补集匹配的类别。
参考文献#
Rennie, J. D., Shih, L., Teevan, J., & Karger, D. R. (2003). 解决朴素贝叶斯文本分类器中的不良假设。 In ICML (Vol. 3, pp. 616-623)。
1.9.4. 伯努利朴素贝叶斯#
BernoulliNB
实现了适用于多变量伯努利分布数据的朴素贝叶斯训练和分类算法;也就是说,可能有多个特征,但每个特征都被假定为二值(伯努利、布尔)变量。因此,此类别要求样本表示为二值特征向量;如果传入其他类型的数据,一个 BernoulliNB
实例可能会将其输入二值化(取决于 binarize
参数)。
伯努利朴素贝叶斯的决策规则基于
这与多项式 NB 的规则不同,因为它明确惩罚了作为类 \(y\) 指示器的特征 \(i\) 的未出现,而多项式变体只会简单地忽略未出现的特征。
在文本分类的情况下,词出现向量(而不是词频计数向量)可用于训练和使用此分类器。BernoulliNB
可能在某些数据集上表现更好,尤其是那些文档较短的数据集。如果时间允许,建议评估这两种模型。
参考文献#
C.D. Manning, P. Raghavan and H. Schütze (2008). 信息检索导论。Cambridge University Press, pp. 234-265。
A. McCallum and K. Nigam (1998). 朴素贝叶斯文本分类事件模型比较。 Proc. AAAI/ICML-98 Workshop on Learning for Text Categorization, pp. 41-48。
V. Metsis, I. Androutsopoulos and G. Paliouras (2006). 朴素贝叶斯垃圾邮件过滤——哪种朴素贝叶斯? 第3届电子邮件与反垃圾邮件会议 (CEAS)。
1.9.5. 分类朴素贝叶斯#
CategoricalNB
实现了适用于分类分布数据的分类朴素贝叶斯算法。它假设每个由索引 \(i\) 描述的特征都有其自己的分类分布。
对于训练集 \(X\) 中的每个特征 \(i\),CategoricalNB
估计了 \(X\) 中每个特征 \(i\) 在类 \(y\) 条件下的分类分布。样本的索引集定义为 \(J = \{ 1, \dots, m \}\),其中 \(m\) 是样本数量。
概率计算#
特征 \(i\) 中类别 \(t\) 在给定类 \(c\) 下的概率估计为
其中 \(N_{tic} = |\{j \in J \mid x_{ij} = t, y_j = c\}|\) 是类别 \(t\) 在属于类 \(c\) 的样本 \(x_{i}\) 中出现的次数,\(N_{c} = |\{ j \in J\mid y_j = c\}|\) 是具有类 c 的样本数量,\(\alpha\) 是平滑参数,\(n_i\) 是特征 \(i\) 可用类别的数量。
CategoricalNB
假设样本矩阵 \(X\) 已编码(例如借助 OrdinalEncoder
),使得每个特征 \(i\) 的所有类别都用数字 \(0, ..., n_i - 1\) 表示,其中 \(n_i\) 是特征 \(i\) 可用类别的数量。
1.9.6. 核外朴素贝叶斯模型拟合#
朴素贝叶斯模型可用于处理大规模分类问题,其中完整的训练集可能无法完全载入内存。为处理这种情况,MultinomialNB
、BernoulliNB
和 GaussianNB
提供了一个 partial_fit
方法,可以像其他分类器一样增量使用,具体示例请参见 文本文档的核外分类。所有朴素贝叶斯分类器都支持样本加权。
与 fit
方法相反,首次调用 partial_fit
时需要传入所有预期类别标签的列表。
有关 scikit-learn 中可用策略的概述,另请参阅 核外学习 文档。
注意
朴素贝叶斯模型的 partial_fit
方法调用会引入一些计算开销。建议使用尽可能大的数据块大小,即在可用RAM允许的范围内。