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). 朴素贝叶斯的优化性。 《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("在总共 %d 个点中,错误标记的点数 : %d"
... % (X_test.shape[0], (y_test != y_pred).sum()))
在总共 75 个点中,错误标记的点数 : 4
1.9.2. 多项式朴素贝叶斯#
MultinomialNB
实现了适用于多项式分布数据的朴素贝叶斯算法,并且是用于文本分类的两个经典朴素贝叶斯变体之一(其中数据通常表示为词向量计数)。
计数,尽管tf-idf向量在实践中也已知能很好地工作。
该分布由向量参数化
\(\theta_y = (\theta_{y1},\ldots,\theta_{yn})\)
对于每个类别 \(y\) ,其中 \(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). Tackling the poor assumptions of naive bayes text classifiers. In ICML (Vol. 3, pp. 616-623).
1.9.4. 伯努利朴素贝叶斯#
BernoulliNB
实现了针对多元伯努利分布数据的朴素贝叶斯训练和分类算法;
即,可能存在多个特征,但每个特征都被假定为二值(伯努利,布尔)变量。
因此,此类要求样本以二值特征向量的形式表示;如果接收到其他类型的数据,
BernoulliNB
实例可能会对其输入进行二值化(取决于 binarize
参数)。
伯努利朴素贝叶斯决策规则基于
这与多项式朴素贝叶斯的规则不同,因为它明确地惩罚了指示类别 \(y\) 的特征 \(i\) 的不出现, 而多项式变体则简单地忽略不出现的特征。
在文本分类的情况下,可以使用词出现向量(而不是词计数向量)来训练和使用此分类器。BernoulliNB
在某些数据集上,尤其是那些较短文档的数据集上,可能会表现得更好。如果时间允许,建议评估这两种模型。
#参考文献
C.D. Manning, P. Raghavan and H. Schütze (2008). Introduction to Information Retrieval. Cambridge University Press, pp. 234-265.
A. McCallum and K. Nigam (1998). A comparison of event models for Naive Bayes text classification. Proc. AAAI/ICML-98 Workshop on Learning for Text Categorization, pp. 41-48.
V. Metsis, I. Androutsopoulos and G. Paliouras (2006). Spam filtering with Naive Bayes – Which Naive Bayes? 3rd Conf. on Email and Anti-Spam (CEAS).
1.9.5. Categorical Naive Bayes#
CategoricalNB
实现了针对分类分布数据的分类朴素贝叶斯算法。它假设每个特征(由索引 \(i\) 描述)都有其自己的分类分布。
对于训练集 \(X\) 中的每个特征 \(i\) ,CategoricalNB
估计了在类别 y 条件下 X 的每个特征 i 的分类分布。样本的索引集定义为 \(J = \{ 1, \dots, m \}\) ,其中 \(m\) 是样本的数量。
#概率计算
给定类别 \(c\) 的特征 \(i\) 中类别 \(t\) 的概率估计为:
其中 \(N_{tic} = |\{j \in J \mid x_{ij} = t, y_j = c\}|\) 是满足条件 \(x_{ij} = t\) 且 \(y_j = c\) 的样本数量。 类别 \(t\) 在样本 \(x_{i}\) 中出现的次数,这些样本属于类别 \(c\) , \(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 中可用策略的概述,请参阅 out-of-core learning 文档。
Note
朴素贝叶斯模型的 partial_fit
方法调用引入了一些计算开销。建议使用尽可能大的数据块大小,即根据可用 RAM 允许的大小。