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向量在实践中也被证明效果很好)。该分布由每个类别\(\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\)是在训练集\(T\)中类别\(y\)的所有样本中特征\(i\)出现的次数,而\(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(通常优势相当大)。

权重计算#

计算权重的过程如下:

\[ \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 中可用策略的概述,另请参见大型学习文档。

注意

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