1.9. 朴素贝叶斯#
朴素贝叶斯方法是一组基于贝叶斯定理的监督学习算法,其“朴素”假设是:给定类别变量的值,每对特征之间都是条件独立的。贝叶斯定理给出了类别变量 \(y\) 和依赖特征向量 \(x_1\) 到 \(x_n\) 之间的以下关系:
使用朴素条件独立性假设,即
对于所有 \(i\),此关系简化为
由于给定输入后 \(P(x_1, \dots, x_n)\) 是常数,我们可以使用以下分类规则
我们可以使用最大后验概率(Maximum A Posteriori, MAP)估计来估计 \(P(y)\) 和 \(P(x_i \mid y)\);其中前者是训练集中类别 \(y\) 的相对频率。
不同的朴素贝叶斯分类器主要区别在于它们对 \(P(x_i \mid y)\) 分布所做的假设。
尽管朴素贝叶斯分类器的假设看似过于简化,但在许多实际应用中,它们表现得相当好,尤其是在文档分类和垃圾邮件过滤方面。它们只需要少量训练数据来估计必要的参数。(关于朴素贝叶斯为何效果良好以及适用于哪些类型数据的理论原因,请参阅下面的参考文献。)
与更复杂的方法相比,朴素贝叶斯学习器和分类器可以非常快。类别条件特征分布的解耦意味着每个分布可以作为一个一维分布独立估计。这反过来有助于缓解维度灾难带来的问题。
另一方面,尽管朴素贝叶斯被认为是一个不错的分类器,但它被认为是一个糟糕的估计器,因此不应过于认真对待 predict_proba 的概率输出。
参考文献#
H. Zhang (2004). The optimality of Naive Bayes. 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\) 称为拉普拉斯平滑(Laplace smoothing),而 \(\alpha < 1\) 称为 Lidstone 平滑。
1.9.3. 互补朴素贝叶斯#
ComplementNB 实现了互补朴素贝叶斯(CNB)算法。CNB 是标准多项式朴素贝叶斯(MNB)算法的一种改进,特别适用于不平衡数据集。具体来说,CNB 使用每个类别的*互补*(complement)统计数据来计算模型的权重。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. 分类朴素贝叶斯#
CategoricalNB 实现了用于分类分布数据的分类朴素贝叶斯算法。它假设每个由索引 \(i\) 描述的特征都有其自己的分类分布。
对于训练集 \(X\) 中的每个特征 \(i\),CategoricalNB 估计了基于类别 \(y\) 条件的特征 \(i\) 的分类分布。样本的索引集定义为 \(J = \{ 1, \dots, m \}\),其中 \(m\) 是样本数量。
概率计算#
给定类别 \(c\) 的特征 \(i\) 中的类别 \(t\) 的概率估计为:
其中 \(N_{tic} = |\{j \in J \mid x_{ij} = t, y_j = c\}|\) 是属于类别 \(c\) 的样本 \(x_{i}\) 中类别 \(t\) 出现的次数,\(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 允许的范围内。