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("在总共 %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\) 通过平滑的最大似然估计,即相对频率计数来估计:

\[\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\) 称为Lidstone平滑。

1.9.3. 补码朴素贝叶斯#

ComplementNB 实现了补码朴素贝叶斯(CNB)算法。 CNB 是对标准多项式朴素贝叶斯(MNB)算法的适应,特别适用于不平衡数据集。具体来说,CNB 使用每个类别的*补码*的统计数据来计算模型的权重。CNB 的发明者通过实证表明,CNB 的参数估计比 MNB 更稳定。此外,CNB 在文本分类任务中经常优于 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)\]

这与多项式朴素贝叶斯的规则不同,因为它明确地惩罚了指示类别 \(y\) 的特征 \(i\) 的不出现, 而多项式变体则简单地忽略不出现的特征。

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

#参考文献

1.9.5. Categorical Naive Bayes#

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

对于训练集 \(X\) 中的每个特征 \(i\)CategoricalNB 估计了在类别 y 条件下 X 的每个特征 i 的分类分布。样本的索引集定义为 \(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\}|\) 是满足条件 \(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. 离线朴素贝叶斯模型拟合#

朴素贝叶斯模型可以用于处理大规模分类问题,这些问题可能无法将整个训练集放入内存中。 为了处理这种情况,MultinomialNBBernoulliNBGaussianNB 提供了 partial_fit 方法, 可以像在 文本文档的外存分类 中展示的那样,与其他分类器一样增量使用。 所有朴素贝叶斯分类器都支持样本加权。

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

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

Note

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