朴素贝叶斯模型

之前我们学习的分类方法(也就是 logistic regression),是直接通过选择 $P(Y|X)$(其中 $X$ 是数据的特征,$Y$ 是数据所属的类别)符合的分布,并通过极大似然估计法获得模型的参数,从而训练出模型。这类模型属于 discriminative model。

朴素贝叶斯分类器则是一种 generative model。它通过选择 $P(X|Y)$ 与 $P(Y)$ 所符合的分布,再通过贝叶斯公式 $P(Y|X) = \frac{P(X|Y)P(Y)}{P(X)}$ 算出给定的数据属于每个类别的概率,最后选择概率最大的类别输出。概率分布的参数同样通过极大似然估计法获得。

接下来,我们通过一个垃圾邮件分类器的例子,讲解朴素贝叶斯分类器的推导与应用过程。

 

问题实例

给出 $m$ 封电子邮件,第 $i$ 封邮件有 $n_i$ 个单词,所有邮件一共出现过 $|V|$ 种单词。再给出每封邮件的标签($y = 1$ 说明是垃圾邮件,$y = 0$ 说明不是),我们的目标是判断一封新邮件是否为垃圾邮件。

我们对这个问题进行一个基本假设:假设邮件的标签(是否为垃圾邮件)符合参数为 $\phi$ 的伯努利分布。这样我们有 $P(y=1)=\phi$。

接下来我们介绍两种概率分布的选择,并分别说明朴素贝叶斯分类器的推导过程。

 

选择 1:伯努利分布

我们猜想某个单词在电子邮件里出现至少一次的概率符合伯努利分布。具体来说,设第 $i$ 个单词在垃圾邮件里出现至少一次的概率为 $P(x=1|y=1) = \phi_{i,1}$,在普通邮件里出现至少一次的概率为 $P(x=1|y=0) = \phi_{i,0}$。

我们用 $y^{(i)}$ 表示第 $i$ 封邮件的标签,再用一个 $|V|$ 维向量 $x^{(i)}$ 表示第 $i$ 封邮件的特征。$x_j^{(i)}=1$ 说明第 $j$ 种单词在第 $i$ 封邮件中出现过,等于 0 表示没有出现过。我们写出训练集的 log likelihood:$$L = \sum_{i=1}^mP(x^{(i)}y^{(i)})$$ (我不太清楚为什么我们不把条件概率写为 $\displaystyle \sum_{i=1}^mP(y^{(i)}|x^{(i)})$,就像之前的 linear regression 和 logistic regression 一样。我看到的资料都没有用条件概率作为 log likelihood,可能是为了计算方便吧...)

我们展开一项,根据条件概率公式有 $$P(x^{(i)}y^{(i)}) = P(x^{(i)}|y^{(i)})P(y^{(i)})$$ 再利用条件概率公式展开有 $$P(x^{(i)}|y^{(i)}) = P(x^{(i)}_1|y^{(i)})P(x^{(i)}_2|x^{(i)}_1y^{(i)})\dots P(x^{(i)}_{n_i}|x^{(i)}_{n_i-1}\dots x^{(i)}_2x^{(i)}_1y^{(i)})$$ 计算这一系列条件概率非常麻烦(因为条件概率的种数太多了),所以朴素贝叶斯分类器作出了一个很强的假设:特征之间是条件独立的。从公式上说,朴素贝叶斯分类器的“朴素”就体现在它假设 $$P(x^{(i)}_{n_i}|x^{(i)}_{n_i-1}\dots x^{(i)}_2x^{(i)}_1y^{(i)}) = P(x^{(i)}_{n_i}|y^{(i)})$$ 在这个问题中,这个假设就意味着:某种单词出现与否,并不影响其它单词的出现。这个假设大大减少了条件概率的种数。当然,这个假设在绝大多数情况下当然都是错的,但是朴素贝叶斯分类器的分类效果仍然是相当好的,也许这就是某种玄学吧- -

根据这个假设,我们重写 log likelihood 中的一项为 $$P(x^{(i)}y^{(i)}) = P(x^{(i)}_1|y^{(i)})P(x^{(i)}_2|y^{(i)})\dots P(x^{(i)}_{n_i}|y^{(i)})\phi$$ 其中 $$P(x^{(i)}_j|y^{(i)}) = \begin{cases} \phi_{j,y^{(i)}} & x^{(i)}_j=1 \\ 1-\phi_{j,y^{(i)}} & x^{(i)}_j=0 \end{cases}$$ 我们接下来使用极大似然估计法求出各个参数的值。以 $\phi_{i,1}$ 为例,假设垃圾邮件有 $m_1$ 封,其中 $m_{i,1}$ 封出现了第 $i$ 种单词,我们有 $$\frac{\partial L}{\partial \phi_{i,1}} = \frac{m_{i,1}}{\phi_{i,1}} - \frac{m_1-m_{i,1}}{1-\phi_{i,1}}$$ $$\frac{\partial^2 L}{\partial \phi_{i,1}^2} = -\frac{m_{i,1}}{\phi_{i,1}^2} - \frac{m_1-m_{i,1}}{(1-\phi_{i,1})^2} \le 0$$ 由于二次偏导总是小等于 0,我们可以通过令一次偏导等于 0 的方式求出让 log likelihood 取值最大的参数值。令一次偏导为 0 有:$$\frac{m_{i,1}}{\phi_{i,1}} = \frac{m_1-m_{i,1}}{1-\phi_{i,1}}$$ 解得 $$\phi_{i,1} = \frac{m_{i,1}}{m_1}$$ 同理设普通邮件有 $m_0$ 封,其中 $m_{i,0}$ 封出现了第 $i$ 种单词,我们有 $$\phi_{i,0} = \frac{m_i,0}{m_0}$$ 再来看 $\phi$,对 $L$ 求偏导有 $$\frac{\partial L}{\partial \phi} = \frac{m_1}{\phi} - \frac{m_0}{1-\phi}$$ $$\frac{\partial^2 L}{\partial \phi^2} = -\frac{m_1}{\phi^2} - \frac{m_0}{(1-\phi)^2} \le 0$$ 由二次偏导小等于 0,我们也可以令一次偏导等于 0,求出最优的 $\phi$:$$\frac{m_1}{\phi} = \frac{m_0}{1-\phi}$$ $$\phi = \frac{m_1}{m_1+m_0} = \frac{m_1}{m}$$ 有了这些参数,我们面对一封新邮件,就能够利用贝叶斯公式,算出该邮件属于垃圾邮件和属于普通邮件的概率 $$P(y|x) = \frac{P(x|y)P(y)}{P(x)} = \frac{P(x_1|y)P(x_2|y)\dots P(x_n|y)P(y)}{P(x)}$$ 虽然我们可以通过全概率公式算出 $P(x)$ 的值 $$P(x) = P(x,y=0) + P(x,y=1) $$ $$= P(x|y=0)P(y=0) + P(x|y=1)P(y=1)$$ 但我们只需要让算法输出概率最大的类别即可,而 $P(x)$ 是与 $y$ 无关的常数。所以我们只需要看哪个类别可以让式子中的分子最大即可,不需要显式计算 $P(x)$。

在实际计算过程中,分子中的连乘可能会造成精度损失,不妨对分子取对数变成连续加法进行计算。

总的来说,这个伯努利分布的猜测认为邮件是按如下方式生成的:首先根据 $\phi$ 确定接下来生成的邮件是否为垃圾邮件;然后在邮件类别已知的情况下,根据 $\phi_{i,1}$ 或 $\phi_{i,0}$ 等参数,确定每种单词是否在邮件中出现,一个单词是否出现不影响其它单词出现的概率。

 

选择 2:多项分布

选择伯努利分布存在一个问题:它忽视了一种单词的出现次数,只考虑了一种单词是否出现,这样会丢失原始训练集中的一些信息。接下来我们选择多项分布(multinomial distribution)作为数据集背后的规律,继续通过极大似然估计法求出各参数的最优值。

这个模型中,我们使用一个 $n_i$ 维的向量 $x^{(i)}$ 来描述第 $i$ 封邮件。$x^{(i)}_j$ 的值,就是第 $i$ 封邮件中第 $j$ 个单词的编号。我们设第 $k$ 种单词在垃圾邮件中第 $j$ 个单词的位置上出现的概率为 $P(x^{(i)}_j=k|y=1) = \phi_{k,1}$,在普通邮件中第 $j$ 个单词的位置上出现的概率 $P(x^{(i)}_j=k|y=0) = \phi_{k,0}$。简单起见,我们认为同一种单词在每个位置上出现的概率相同(当然,这个模型还是丢失了一些原始数据集的信息,比如前后单词之间的关系,以及邮件的长度等等,但是我们也需要在模型的完整性和复杂性之间做出平衡)。

我们写出这个模型下训练集的 log likelihood $$L = \sum_{i=1}^m P(x^{(i)}y^{(i)})$$ 取一项展开,并使用朴素贝叶斯模型的假设有 $$P(x^{(i)}y^{(i)}) = P(x^{(i)}_1|y^{(i)})P(x^{(i)}_2|y^{(i)})\dots P(x^{(i)}_{n_i}|y^{(i)})P(y^{(i)})$$ $$= \phi_{x^{(i)}_1,y^{(i)}}\phi_{x^{(i)}_2,y^{(i)}}\dots \phi_{x^{(i)}_{n_i},y^{(i)}}\phi$$ 同样使用极大似然估计法求出各个参数的值。以 $\phi_{k,1}$ 为例,设所有垃圾邮件共有 $w_1$ 个单词,其中第 $k$ 种单词一共出现过 $w_{k,1}$ 次,我们有 $$\frac{\partial L}{\partial \phi_{k,1}} = \frac{w_{k,1}}{\phi_{k,1}} - \frac{w_1-w_{k,1}}{1-\phi_{k,1}}$$ 这个式子的分析过程和伯努利分布中参数的分析过程相似,这里略过。总之我们可以通过令偏导为 0 求出参数的最优值 $$\phi_{k,1} = \frac{w_{k,1}}{w_1}$$ $$\phi_{k,0} = \frac{w_{k,0}}{w_0}$$ $$\phi = \frac{m_1}{m}$$ 这样,一封新的邮件输入后,我们同样利用贝叶斯公式算出这封邮件属于哪个类别的可能性最大,并输出这个类别即可。

 

拉普拉斯平滑

如果输入的新邮件里有一个训练集里没有的单词,根据上面的式子,我们在计算该邮件属于哪个类别概率比较大时,会有 $$P(y|x) = \frac{P(x|y)P(y)}{P(x)}$$ 由于出现了一个训练集里没有的单词,我们有 $$P(x|y) = 0$$ $$P(x) = 0$$ 我们就面临着一个 0/0 的式子。这样处理显然是不够科学的,我们不能因为一个单词在训练集里没有出现过,就说这个单词不可能出现。

拉普拉斯平滑就解决了这个问题。以伯努利分布为例,拉普拉斯平滑将原来的 $$\phi_{i,1} = \frac{m_{i,1}}{m_1}$$ 改为 $$\phi_{i,1} = \frac{m_{i,1}+1}{m_1+2}$$ 感觉就像增加了两条训练数据,一条数据里有这个单词出现,一条里没有这个单词出现一样。这样,单词的分母至少为 1,也就不会出现 0/0 的问题了。

拉普拉斯平滑有许多很好的性质,比如它保留了概率的性质,以及的确可以通过某种方式推导出来等等,但我没有做具体研究,看看以后有机会再仔细研究吧。

posted @ 2017-08-28 14:26  TsReaper  阅读(286)  评论(0编辑  收藏  举报