Skip to content

1.9. 朴素贝叶斯(Naive Bayes)

朴素贝叶斯方法是一组基于Bayes定理的有监督学习算法,在给定类变量(class variable)值的情况下,每对特征之间条件独立的“简单”假设。Bayes定理说明了如下关系,给定类别 $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)$在给定输入的情况下是常数,我们可以使用以下分类规则: $$ 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), $$ 并且我们可以利用最大后验概率(Maximum A Posteriori,MAP)估计 $P(y)$和$P(x_i \mid y)$,前者是训练集中类别$y$的相对频率。

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

尽管贝叶斯分类器的假设明显过于简单,但它们在许多实际情况下(在著名的文档分类和垃圾邮件过滤中)都表现良好。它们需要少量的训练数据来估计必要的参数。(理论证明朴素贝叶斯为何能很好地工作,以及它在哪种数据类型上工作,请参见以下参考资料。)

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

另一方面,尽管朴素贝叶斯被认为是一个不错的分类器,但它是一个坏的估计量,因此不要太重视predict_proba的概率输出。

参考文献:

1.9.1. 高斯(Gaussian)朴素贝叶斯

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. 多项式(Multinomial)朴素贝叶斯

MultinomialNB实现了服从多项式分布数据的朴素Bayes算法,是文本分类中使用的两个经典朴素Bayes变体之一(数据通常表示为词向量,尽管tf-idf向量在实践中也很有效)。 对于每个类$y$,分布由向量$\theta_y =(\theta_ {y1},\ldots,\theta_ {yn})$来参数化,其中$n$ 是特征的数量(在文本分类中,是词汇的大小),$\theta_ {yi}$是出现在属于类$y$的样本的特征$i$的概率$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$的所有特征的总数。

平滑因子(smoothing priors)$\alpha \ge 0$ 考虑了学习样本中不存在的特征,并防止了进一步计算中出现零概率。设置$\alpha = 1$称为Laplace(拉普拉斯)平滑,而$\alpha < 1$称为Lidstone平滑。

1.9.3. 补充(Complement)朴素贝叶斯

ComplementNB实现了补充朴素Bayes(CNB)算法。CNB是标准多项式朴素Bayes(MNB)算法的一种改进,它特别适合于不平衡数据集。具体来说,CNB使用来自每个类的 complement 中的统计信息来计算模型的权重。CNB的发明者从经验上证明了CNB的参数估计比MNB的参数估计更稳定。此外,CNB在文本分类任务上经常优于MNB(通常有相当大的幅度)。计算权重的步骤如下: $$ \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}|} $$ 其中对所有不在类$c$的文档$j$求和,$d{i j}$是文档$j$中项$i$的计数或tf-idf值,$\alpha_i$是一个类似于MNB中的平滑超参数,并且$\alpha=\sum{i}\alpha i$。第二个归一化解决了MNB在较长文档中控制参数估计的问题。 分类规则为: $$ \hat{c} = \arg\min_c \sum_{i} t_i w_{ci} $$ 即,将文档分配给补全匹配度最低(poorest)的项。

参考文献

1.9.4. 伯努利(Bernoulli)朴素贝叶斯

BernoulliNB实现了用于多元Bernoulli分布数据的朴素Bayes训练和分类算法;即,可能有多个特征,但每个特征都假定为二值(Bernoulli,boolean)变量。因此,此类算法要求样本以二值特征向量表示;如果传递任何其他类型的数据,BernoulliNB实例可以对其输入进行二值化(取决于binarize 参数)。

伯努利朴素贝叶斯的决策规则基于 $$ P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y)) (1 - x_i) $$ 伯努利朴素贝叶斯不同于多项式朴素贝叶斯的规则,因为伯努利朴素贝叶斯显式地惩罚了作为类$y$的预测因子却不出现的特征$i$,多项式朴素贝叶斯将简单地忽略不出现的特征

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

参考文献

1.9.5. 分类(Categorical)朴素贝叶斯

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

对于训练集$X$中的每个特征$i$,CategoricalNB在类$y$的条件下,估计$X$的每个特征$i$的分类分布。样本的索引集定义为$ = \{ 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. Out-of-core 朴素贝叶斯模型拟合

朴素贝叶斯模型可以用来解决大规模的分类问题,在大规模的分类问题下,完整的训练集无法加载在内存中进行训练。为了处理这种情况,MultinomialNB,BernoulliNB, 和GaussianNB 实现了一个partial_fit 方法,该方法可以像在Out-of-core classification of text documents中描述的那样,与其他分类器一起增量使用。所有朴素贝叶斯分类器都支持样本加权。

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

有关scikit-learn中可用方案的概述,请参见 out-of-core learning文档。

注意

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

(C) 2007 - 2019, scikit-learn 开发人员 (BSD 许可证). 此页显示源码