1.9. 朴素贝叶斯#

朴素贝叶斯方法是一组监督学习算法,基于在给定类变量的值的情况下,对每对特征之间的条件独立性做出“朴素”假设,应用贝叶斯定理。贝叶斯定理指出,给定类变量 \(y\) 和依赖特征向量 \(x_1\)\(x_n\),有以下关系:

\[P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots, x_n \mid y)} {P(x_1, \dots, x_n)}\]

使用朴素条件独立性假设,即

\[P(x_i | y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i | y),\]

对于所有 \(i\),此关系简化为

\[P(y \mid x_1, \dots, x_n) = \frac{P(y) \prod_{i=1}^{n} P(x_i \mid y)} {P(x_1, \dots, x_n)}\]

由于给定输入后 \(P(x_1, \dots, x_n)\) 是常数,我们可以使用以下分类规则

\[ \begin{align}\begin{aligned}P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y)\\\Downarrow\\\hat{y} = \arg\max_y P(y) \prod_{i=1}^{n} P(x_i \mid y),\end{aligned}\end{align} \]

我们可以使用最大后验概率 (MAP) 估计来估计 \(P(y)\)\(P(x_i \mid y)\);前者是训练集中类 \(y\) 的相对频率。

不同的朴素贝叶斯分类器主要区别在于它们对 \(P(x_i \mid y)\) 分布的假设。

尽管朴素贝叶斯分类器做出了看似过于简化的假设,但在许多现实世界的情况中,它们表现得相当好,例如著名的文档分类和垃圾邮件过滤。它们只需要少量训练数据来估计必要的参数。(有关朴素贝叶斯为何效果良好以及在哪些类型的数据上效果良好的理论原因,请参阅下面的参考资料。)

与更复杂的方法相比,朴素贝叶斯学习器和分类器可以非常快。类条件特征分布的解耦意味着每个分布可以独立地估计为一维分布。这反过来有助于缓解由维数灾难带来的问题。

另一方面,尽管朴素贝叶斯被认为是一个不错的分类器,但它也被认为是一个糟糕的估计器,因此 predict_proba 输出的概率不应过于认真对待。

参考资料#

1.9.1. 高斯朴素贝叶斯#

GaussianNB 实现用于分类的高斯朴素贝叶斯算法。假设特征的似然服从高斯分布

\[P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}\right)\]

参数 \(\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\) 通过最大似然的平滑版本(即相对频率计数)进行估计

\[\hat{\theta}_{yi} = \frac{ N_{yi} + \alpha}{N_y + \alpha n}\]

其中 \(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\) 称为利德斯通平滑。

1.9.3. 互补朴素贝叶斯#

ComplementNB 实现互补朴素贝叶斯 (CNB) 算法。CNB 是标准多项式朴素贝叶斯 (MNB) 算法的变体,特别适合不平衡数据集。具体来说,CNB 使用每个类别的互补的统计信息来计算模型的权重。CNB 的发明者通过实验证明,CNB 的参数估计比 MNB 的参数估计更稳定。此外,CNB 在文本分类任务中经常优于 MNB(通常优于 MNB 很多)。

权重计算#

计算权重的过程如下:

\[ \begin{align}\begin{aligned}\hat{\theta}_{ci} = \frac{\alpha_i + \sum_{j:y_j \neq c} d_{ij}} {\alpha + \sum_{j:y_j \neq c} \sum_{k} d_{kj}}\\w_{ci} = \log \hat{\theta}_{ci}\\w_{ci} = \frac{w_{ci}}{\sum_{j} |w_{cj}|}\end{aligned}\end{align} \]

其中求和是对所有不在类别 \(c\) 中的文档 \(j\) 进行的,\(d_{ij}\) 是文档 \(j\) 中词项 \(i\) 的计数或 tf-idf 值,\(\alpha_i\) 是类似于 MNB 中的平滑超参数,而 \(\alpha = \sum_{i} \alpha_i\)。第二个归一化解决了较长文档在 MNB 中支配参数估计的趋势。分类规则是:

\[\hat{c} = \arg\min_c \sum_{i} t_i w_{ci}\]

即,将文档分配给最差的互补匹配类别。

参考文献#

1.9.4. 伯努利朴素贝叶斯#

BernoulliNB 实现用于服从多元伯努利分布的数据的朴素贝叶斯训练和分类算法;即,可能存在多个特征,但每个特征都被假定为二元值(伯努利,布尔)变量。因此,此类要求样本表示为二元值特征向量;如果提供任何其他类型的数据,BernoulliNB 实例可能会将其输入二值化(取决于 binarize 参数)。

伯努利朴素贝叶斯的决策规则基于

\[P(x_i \mid y) = P(x_i = 1 \mid y) x_i + (1 - P(x_i = 1 \mid y)) (1 - x_i)\]

它与多项式 NB 的规则不同,因为它明确地惩罚了作为类别 \(y\) 指示器的特征 \(i\) 的非出现,而多项式变体只会简单地忽略非出现的特征。

在文本分类的情况下,可以使用词出现向量(而不是词计数向量)来训练和使用此分类器。 BernoulliNB 可能会在某些数据集上表现更好,尤其是那些文档较短的数据集。如果时间允许,建议评估这两个模型。

参考文献#

1.9.5. 类别朴素贝叶斯#

CategoricalNB 实现用于类别分布数据的类别朴素贝叶斯算法。它假设每个特征(由索引 \(i\) 描述)都有自己的类别分布。

对于训练集 \(X\) 中的每个特征 \(i\)CategoricalNB 估计 \(X\) 的每个特征 \(i\) 在给定类别 \(y\) 条件下的类别分布。样本的索引集定义为 \(J = \{ 1, \dots, m \}\),其中 \(m\) 是样本数量。

概率计算#

给定类别 \(c\) 的特征 \(i\) 中类别 \(t\) 的概率估计为

\[P(x_i = t \mid y = c \: ;\, \alpha) = \frac{ N_{tic} + \alpha}{N_{c} + \alpha n_i},\]

其中 \(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. 朴素贝叶斯模型的离线拟合#

朴素贝叶斯模型可用于解决大规模分类问题,对于这些问题,完整的训练集可能无法放入内存。为了处理这种情况,MultinomialNBBernoulliNBGaussianNB 公开了 partial_fit 方法,该方法可以像其他分类器一样增量使用,如 文本文档的 Out-of-core 分类 中所示。所有朴素贝叶斯分类器都支持样本加权。

fit 方法相反,第一次调用 partial_fit 需要传递所有预期类标签的列表。

有关 scikit-learn 中可用策略的概述,另请参阅 out-of-core 学习 文档。

注意

朴素贝叶斯模型的 partial_fit 方法调用会引入一些计算开销。建议使用尽可能大的数据块大小,即可用 RAM 允许的范围。