生成式学习算法(四)之----朴素贝叶斯分类器
朴素贝叶斯分类器(算法)与朴素贝叶斯假设
在高斯判别分析模型(GDA)中,特征向量x 是连续实值向量。现在我们来讨论分量xj 取离散值的贝叶斯朴素贝叶斯模型。
在文本分类问题中,有一个问题是分出一个邮件是(y=1 )或者不是(y=1 )垃圾邮件。我们的训练数据集是一些标好是否是垃圾邮件的邮件。现在我们首先需要把每个邮件表示成特征向量的形式。
假设我们有一个固定长度的词表。这个词表不包括一些在每个文档中都出现的,高频的对判别垃圾邮件没有太大作用的停用词。然后对于每一个邮件。可以用一个长度为词表长度的0,1向量来表示。向量的分量$ x_j就表示这个词表中的第 j$项所代表的单词是否出现在这个邮件中,0表示没有出现,1表示出现。
把每个邮件表示成0,1特征向量x 后,现在我们要对条件概率p(x|y) 进行建模。肯定不能用多项分布来建模,因为参数量太大了。比如我们的词表长度为5000,特征向量的可能结果有25000 种。用多项分布则需要确定25000−1 个参数。因此,我们需要对模型做出一些简化假设。
朴素贝叶斯假设就是其中一种简化假设,在这个假设下得到的算法叫朴素贝叶斯分类器(算法)。虽然这个假设较强,但很多问题在这个假设下依然表现良好。朴素贝叶斯假设是指在给定y 的条件下,向量x 的各个分量xj 取值是条件独立的。具体的,给定C的情况下,A和B是条件独立的是指p(A)=p(A|B,C) 。注意,这与A和B是独立的不同。A与B独立是指p(A)=p(A|B) 。在条件独立假设下,我们可以简化条件概率,将条件概率分解为如下形式,
p(x1,…,xn|y)=p(x1|y)p(x2|y,x1)p(x3|y,x1,x2)⋯p(xn|y,x1,…,xn−1)=p(x1|y)p(x2|y)p(x3|y)⋯p(xn|y)=∏nj=1p(xj|y)
从现在起,我们应该把特征x 看成是一个固定的东西。则模型的参数有垃圾邮件的先验概率ϕy=p(y=1) ,以及每个特征分量下的两个参数ϕj|y=1=p(xj=1|y=1) ,和 ϕj|y=0=p(xj=1|y=0)。比如 ϕj|y=1=p(xj=1|y=1) 是垃圾邮件中这个特征所代表的单词出现的概率。
然后我们在这些参数下可以写出数据的似然函数,
L(ϕy,ϕj|y=0,ϕj|y=1)=∏i=1mp(x(i),y(i))
关于每组参数最大化,可以得到各个参数的如下估计,
ϕj|y=1ϕj|y=0ϕy=∑mi=11{x(i)j=1∧y(i)=1}∑mi=11{y(i)=1}=∑mi=11{x(i)j=1∧y(i)=0}∑mi=11{y(i)=0}=∑mi=11{y(i)=1}m(1)
比如参数ϕj|y=1=p(xj=1|y=1) 的估计(不严格地,上面我们还用同一个符号来表示)其实就是垃圾邮件中这个特征所代表的单词出现的频率。
估计出这些参数,来了一个新邮件,我们就可以做出如下预测,
p(y=1|x)=p(x|y=1)p(y=1)p(x)=(∏nj=1p(xj|y=1))p(y=1)(∏nj=1p(xj|y=1))p(y=1)+(∏nj=1p(xj|y=0))p(y=0)
不要害怕第二个分母里一坨东西,它只是计算了x 和y 的不同取值的联合概率,然后归一化。
之前我们说特征向量x 是0,1向量。可以自然推广到特征向量取k 个值的情况。对于连续的变量不是太服从多元正态分布时,可以将其离散化为k 值离散特征向量,然后利用这个模型,也往往能取得比高斯判别分析模型更好的结果。
拉普拉斯平滑
2019年9月21日19:03:05
上面算法的一个最大问题就是对于在词表中出现过,但训练集中未出现过的单词,计算出后验概率0:0,无法判断是垃圾邮件,还是非垃圾邮件。采用拉普拉斯平滑可以大大改善这个算法。
更广泛一点来说,对于训练集中没有见到的事件,我们就估计它出现的概率为零,不是一个好的做法。对于一个取k个值的多项分布。把最大似然估计有,
ϕj=∑mi=11{z(i)=j}m
拉普拉斯平滑机制则在此基础上在分母加k,分子加一,即,
ϕj=∑mi=11{z(i)=j}+1m+k
回到朴素贝叶斯参数估计上,再给定标签y 的情况下,表示词出现与否的每个特征分量 xj 是一个二项分布,因此就有如下拉普拉斯平滑估计,
ϕj|y=1ϕj|y=0=∑mi=11{x(i)j=1∧y(i)=1}+1∑mi=11{y(i)=1}+2=∑mi=11{x(i)j=1∧y(i)=0}+1∑mi=11{y(i)=0}+2
注意,我们这里是对特征分量进行拉普拉斯平滑。标签本身也是个二项分布,但一般不需要拉普拉斯平滑。
文本分类事件模型
虽然朴素贝叶斯算法在分类中一般表现较好,有一类算法在文本分类中可以表现得更好。
朴素贝叶斯用的是多元伯努利事件模型(multi-variate Bernoulli event model)。邮件发送者先一定概率决定发送垃圾邮件和非垃圾邮件,然后在给定条件概率下。独立的以相应概率发送词表中的每个单词。
现在我们来看一下多项事件模型(multinomial event model)。他对每个邮件的特征表示与之前不同。他将第j个特征分量表示邮件中的第j个单词(之前的是词表中第j个单词出现与否0,1变量)。这个特征分量取值于{1,…,|V|},|V| 为词表的大小。然后一个邮件由不固定长度的n 个词组成。
在多项事件模型中,每个邮件是否是垃圾邮件产生方法和之前相同。在决定了邮件是否是垃圾邮件后,再根据相应的条件概率产生第一个单词,注意是从多项分布中产生一个单词,然后再独立的产生第二个单词,一直产生n个单词。这里分布是多项分布,和之前的伯努利分布是不一样的。
这个模型的参数同样有垃圾邮件的先验概率ϕy=p(y=1) ,ϕk|y=0=p(xj=k|y=0) 和ϕk|y=1=p(xj=k|y=1) 。注意,我们这里假设不管哪一个位置j,产生此位置单词的多项分布的参数都是一样的(比较之前ϕj|y=0=p(xj=1|y=0) ) 。
给定训练集{(x(i),y(i));i=1,…,m} ,其中x(i)=(x(i)1,x(i)2,…,x(i)ni),这里n(i) 是第i 个邮件的单词个数。然后我们在这些参数下可以写出数据的似然函数,
L(ϕy,ϕk|y=0,ϕk|y=1)=∏i=1mp(x(i),y(i))=∏i=1m(∏j=1nip(x(i)j|y;ϕk|y=0,ϕk|y=1))p(y(i);ϕy)
关于每组参数最大化,可以得到各个参数的如下估计,
ϕk|y=1ϕk|y=0=∑mi=1∑nij=11{x(i)j=k∧y(i)=1}∑mi=11{y(i)=1}ni=∑mi=1∑nij=11{x(i)j=k∧y(i)=0}∑mi=11{y(i)=0}ni
如果我们用拉普拉斯平滑,标签y 的情况下,表示第 j 个位置哪个词出现的特征分量 xj 是一个多项分布(取值个数 |V| ),因此就有如下拉普拉斯平滑估计,
ϕk|y=1ϕk|y=0=∑mi=1∑nij=11{x(i)j=k∧y(i)=1}+1∑mi=11{y(i)=1}ni+|V|=∑mi=1∑nij=11{x(i)j=k∧y(i)=0}+1∑mi=11{y(i)=0}ni+|V|
尽管朴素贝叶斯算法可能不是最好的,但它通常都有不俗的表现。由于这个算法实现起来简单明了。绝对是首先值得一试的算法。https://www.cnblogs.com/qizhien/p/11567887.html