阿南带你理解朴素贝叶斯

像阿南一样,朴素而善良

Posted by Nam on February 23, 2020

前言

”基础不牢,地动山摇“。 本科阶段《概率论与数理统计》没有学透的我,被研究生阶段铺天盖地的统计学知识搞得脑壳疼,甚至是最简单的 贝叶斯公式!

今天终于讲到贝叶斯这一章了,让阿南带你攻下朴素贝叶斯!


朴素贝叶斯 (Naive Bayes)

大家初见这个名字可能会感到奇怪,为什么好好的贝叶斯要 “朴素” 呢? 这其实和它的定义有关~

朴素贝叶斯: 对于给定的训练数据集,首先基于所有特征相互之间都是条件独立的假设前提下学习输入输出的联合概率分布;然后基于此模型,对给定的输入 $x$ 利用贝叶斯定理求出后验概率最大的输出 $y$。

属性条件独立性假设: 对已知类别,假设所有特征相互独立。

大家注意,在上述的定义中存在特征之间为条件独立的假设前提,然而这个假设前提在现实生活中很难或者说是不可能达到的。因此我们将其称之为 ”朴素“。朴素贝叶斯算法实现起来简单,学习效率与预测效果都较为良好,是一种常用的方法。

首先我们给出大名鼎鼎的贝叶斯公式:

\[P(Y|X) = \frac{P(Y)P(X|Y)}{P(X)} \tag{1}\]


极大似然估计

观察式 $(1)$发现,我们只需要求出联合概率分布 $P(X,Y)$ 和 数据集的分布 $P(X)$ 即可得到最后的判别式 $P(Y\mid X)$。思路清晰之后我们一步一步推进。

首先我们求解每个类别 $c_k$ 出现的概率,即先验概率 $P(Y)$。先验概率 $P(Y=c_k)$ 的极大似然估计就是找出每个类别出现的次数然后除以样本总数 $N$。

\[P(Y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)}{N},\ \ \ k=1,2,...,K \tag{2}\]

接着我们求解条件概率 $P(X=x_{new}\mid Y=c_k)$。其极大似然估计就是先筛选出属于类别 $Y=c_k$ 的所有实例组成一个小样本集 $T_0$,然后分别计算样本集中每个特征 $x_i^{(j)}$ 取值分别等于需要计算的实例 $x_{new}$ 对应特征值 $x_{new}^{(j)}=a_{jl}$ 的概率,即 $P(X^{(1)}=x_{new}^{(1)}\mid Y=c_k),P(X^{(2)}=x_{new}^{(2)}\mid Y=c_k),…,P(X^{(n)}=x_{new}^{(n)}\mid Y=c_k)$

然后利用之前 ”朴素的假设:类别确定下,所有特征相互独立“,条件概率 $P(X=x_{new}\mid Y=c_k)$ 就等于已知类别 $Y=c_k$ 的情况下每个特征取值 $x_i^{(j)}$ 取值分别等于需要计算的实例 $x_{new}$ 对应特征值 $x_{new}^{(j)}=a_{jl}$ 的概率的连乘,即:

\[P(X=x_{new}|Y=c_k) = \prod_{j=1}^n P(X^{(j)}=x_{new}^{(j)}|Y=c_k) \tag{3}\]

最后我们只需要求出贝叶斯公式里的分母 $P(X)$。这个就很简单了,我们只需要利用 全概率公式 即可轻松得到:

\[P(X=x_{new}) = \sum_k P(X=x_{new}|Y=c_k)P(Y=c_k) \tag{4}\]

到这儿,贝叶斯公式 $(1)$ 中所需要的条件我们都拥有了,带入之后我们就可以计算得出 实例 $x_{new}$ 为 $c_k$ 类 的后验概率 $P(X=x_{new}\mid Y=c_k)$。然后再选出后验概率最大的 $c_k$ 作为实例 $x_{new}$ 的类别,即:

\[y=\arg \max_{c_k} \frac{P(Y=c_k) \prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k)}{\sum_k P(Y=c_k) \prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k)} \tag{5}\]

由于我们在比较后验概率 $P(X=x_{new}\mid Y=c_k)$ 的大小时,式 $(5)$ 中的分母对于所有的类别都是相同的,即只是一个常数。因此我们可以省略其分母部分,只比较分子:

\[y=\arg \max_{c_k} P(Y=c_k) \prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k) \tag{6}\]

好滴,让我们简单地总结一下算法的四个步骤~


假设我们拥有数据集 $T:$

\[T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}\]

其中输入空间 $\chi \subseteq R^n$ 为 $n$ 维向量的集合,$x=(x^{(1)},x^{(2)},…,x^{(n)})^T$,$x_i^{(j)}$ 是第 $i$ 个样本的第 $j$ 个特征,并且其取值范围为:$x_i^{(j)}\in {a_{j1},a_{j2},…,a_{js_j}},\ a_{jl}$ 是第 $j$ 个特征所可能取得的第 $l$ 个特征值。

输出空间为类标记集合 $\gamma = {c_1,c_2,…,c_n}$。 $X$ 是输入空间 $\chi$ 上的随机向量,$Y$ 是定义在输出空间 $\gamma$ 上的随机向量。数据集 $T$ 由 $P(X,Y)$ 独立同分布产生。

建立朴素贝叶斯模型的路径如下:

  1. 首先通过训练数据集学习先验概率分布: \(P(Y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)}{N},\ \ \ k=1,2,...,K \tag{7}\)
  2. 再学习条件概率分布: \(\begin{aligned} & P(X^{(j)} = a_{jl}|Y=c_k) = \frac{\sum_{i=1}^NI(x_i^{(j)} = a_{jl},y_i=c_k)}{\sum_{i=1}^NI(y_i=c_k)} \\ & j=1,2,...,n; \ \ l=1,2,...,S_j; \ \ k=1,2,...,K \end{aligned} \tag{8}\)
  3. 对于给定的实例 $x=(x^{(1)},x^{(2)},…,x^{(n)})^T$,计算: \(P(Y=c_k)\prod_{j=1}^n P(X^{(j)} = x^{(j)}|Y=c_k), \quad k=1,2,...,K \tag{9}\)
  4. 最后确定实例 $x$ 的类: \(y=\arg \max_{c_k} P(Y=c_k) \prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k) \tag{10}\)

后验概率最大化的含义

结论: 朴素贝叶斯方法将实例分到后验概率最大的类别中。这个操作等价于 期望风险最小化

假设我们选择 $0-1$ 损失函数:

\[L(Y,f(X))= \begin{cases} 1,\quad Y \ne f(X) \\ 0,\quad Y = f(X) \end{cases} \tag{11}\]

式中 $f(X)$ 是分类决策函数。此时,期望风险函数为:

\[R_{exp}(f) = E[L(Y,f(X))] \tag{12}\]

期望是对联合分布 $P(X,Y)$ 取的,由此取条件期望:

\[R_{exp}(f) = E_X\{\sum_{k=1}^K [L(c_k,f(X))]P(c_k|X)\} \tag{13}\]

为了让期望风险最小化,我们只需要对每个实例 $x$ 极小化即可:

\[\begin{aligned} f(x) & = \arg \min_{y\in \gamma} \sum_{k=1}^{K} L(c_k,y)P(c_k|X=x) \\ & = \arg \min_{y\in \gamma} \sum_{k=1}^{K} P(y\ne c_k|X=x) \\ & = \arg \min_{y\in \gamma} (1-P(y=c_k|X=x)) \\ & = \arg \max_{y\in \gamma} P(y=c_k|X=x) \end{aligned} \tag{14}\]

因此,根据期望风险最小化的准则就得到了后验概率最大化准则:

\[f(x) = \arg \max_{c_k} P(c_k|X=x) \tag{15}\]

即朴素贝叶斯算法所采用的原理。(详见 李航《统计学习方法》 61页)

加入拉普拉斯平滑的贝叶斯估计

然鹅!用上述算法存在一个极其严重的问题!观察条件概率的求解式 $(8)$,如果新出现的实例 $x_{new}$ 中的某一个特征 $x_{new}^{(j)}$ 从未在训练集中对应特征维度上出现过,那么算出来该特征维度的条件概率将是 $0$,即:

\[P(X^{(j)} = a_{jl}|Y=c_k) = \frac{\sum_{i=1}^NI(x_i^{(j)} = a_{jl},y_i=c_k)}{\sum_{i=1}^NI(y_i=c_k)} = 0 \tag{16}\]

这就会导致条件概率概率 $P(X=x_{new}\mid Y=c_k) = \prod_{j=1}^n P(X^{(j)}=x_{new}^{(j)}\mid Y=c_k) = 0$,原因就是连乘项中如果存在一个 $0$ 那么整个连乘项的结果就是 $0$。

如果发生上述情况将会影响到后验概率的计算结果,使分类产生偏差。解决这一问题的方法是采用 加入拉普拉斯平滑的贝叶斯估计

\[P_{\lambda}(X^{(j)}=a_{ij}|Y=c_k) = \frac{\sum_{i=1}^N I(x_i^{(j)}=a_{jl},y_i=c_k) + \lambda}{\sum_{i=1}^N I(y_i=c_k)+S_j \lambda} \tag{17}\]

上式中 $\lambda \ge 0$,等价于在随机变量各个取值的概率上加上一个正数 $\lambda > 0$。当 $\lambda = 0$ 就为极大似然估计。通常取 $\lambda = 1$,称之为 拉普拉斯平滑 (Laplacian smoothing)

同样,采用拉普拉斯平滑的先验概率的贝叶斯估计是:

\[P_{\lambda}(Y=c_k) = \frac{\sum_{i=1}^NI(y_i=c_k)+\lambda}{N + K\lambda} \tag{18}\]

总结

朴素贝叶斯属于生成学习算法,即通过训练数据集习得联合概率分布 $P(X,Y)$,然后求得后验概率分布 $P(Y\mid X)$。

因此朴素贝叶斯属于 生成模型

优点: 算法整体结构简单易懂,模型实现起来容易。

缺点: 由于朴素贝叶斯拥有较强的假设,即特征之间相互独立,然而这个假设在现实中往往是不成立的。因此在特征数量较多或特征之间高度相关时分类效果往往较差。

好啦,今天滴关于 朴素贝叶斯 的机器学习小课堂到这里就结束啦~

谢谢大家 :)