Naive Bayes
在GDA模型中,特征向量x是连续的实数向量,在这一讲里,我们将要讨论另外一种算法用来处理特征向量x是离散值的情况。
我们先考虑一个例子,用机器学习的方法建立一个垃圾邮件过滤器,我们希望用一种算法来甄别邮件的信息以确定该邮件是不是垃圾邮件,通过学习这个算法,我们将能建立自己的垃圾邮件过滤器帮我们对邮件进行分类,邮件分类只是一系列我们称之为文本分类中的一种。
首先假设我们有一个训练集(包括了垃圾邮件和正常的邮件),我们用特征向量x表示一封邮件,特征向量的长度等于该邮件所含有的单词的数量,这些单词包含在我们预先建立的一部字典里。如果该邮件的第i个单词在该字典里,则该特征向量的第i个分量为1,即xi=1,反之xi=0. 邮件里每一个单词对应该特征向量的某个分量,单词的数量决定了该特征向量的长度。
现在,我们想建立一个分类模型来决定该邮件是不是垃圾邮件。所以我们要估计p(x|y),假设一封邮件有5000个单词,那么该特征向量就是5000维,即 x∈{0,1}5000,(x是一个只含有0和1的5000维的向量),如果我们用多项分布来对特征向量进行建模,那么该特征向量有25000 种可能,这个数据量显然太大了。
为了更方便的估计p(x|y),我们要做一个强一点的假设,我们假设邮件里的单词,即xi是相互\textbf{条件}独立的,这个假设称为Naive Bayes (NB) 假设,相应的算法称为Naive Bayes 分类。比如,如果 y=1 表示该邮件是垃圾邮件,那么单词A 和单词B 之间是相互条件独立的,也就是说如果邮件是垃圾邮件,那么该邮件中的单词A 出现的概率与单词B 出不出现没有关系,更一般地,我们可以得到如下关系:p(xi|y=p(xi|y,xj)), xi 表示单词A 是特征向量的第{i}个分量,xj表示单词B 是特征向量的第j个分量。(但是请注意:这不是说单词A 和单词B 是相互独立的,所以不能简单的写成:p(xi|y=p(xi|xj)), 这个是容易理解的,因为一般来说单词是有一定联系的,但是对于垃圾邮件来说,我们可以假设这些单词是毫无规律,没有任何联系,所以这里会强调单词之间的关系是条件独立的,也就是单词的相互独立在y=1 ,即垃圾邮件里是成立的。
因此,我们有:
p(x1,x2,...x5000|y)=p(x1|y)p(x2|y,x1)p(x3|y,x1,x2)...p(x5000|y,x1,x2,...x4999)=p(x1|y)p(x2|y)p(x3|y)...p(x5000|y)=∏i=1np(xi|y)
这个模型可以由 ?i|y=1=p(xi=1|y=1), ?i|y=0=p(xi=1|y=0) 和 ?y=p(y=1)建立,给定一组训练样本 (x(i),y(i));i=1,...m,
我们可以得到训练数据的联合概率
L(?y,?i|y=0,?i|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
上式中,符号
∧表示逻辑运算“与”,
?j|y=1表示垃圾邮件中第
j个单词出现的概率,一旦得到所有的参数,那么给定一个新的特征向量,要判断其是不是垃圾邮件,我们可以计算其概率:
p(y=1|x)=p(x|y=1)p(y=1)p(x)=(∏ni=1p(xi|y=1))p(y=1)(∏ni=1p(xi|y=1))p(y=1)+(∏ni=1p(xi|y=0))p(y=0)
最后,我们要注意,虽然我们提出的Naive Bayes 算法处理的是二值化的特征向量,但是对于多个离散值的情况,我们可以用多项式分布代替伯努利分布对
p(xi|y) 进行建模。
Laplace Smoothing
Naive Bayes学习算法可以很好地处理很多分类问题,接下来,我们要讨论如何对该算法做一点小小地改进让它更好地工作,特别是处理文本分类问题。在介绍这个改进之前,我们先来看一个问题。
假设我们用Naive Bayes算法建立了一个分类器对邮件进行分类,对一封邮件的单词进行判断从而确定该邮件是否垃圾邮件。如果有一封新邮件,里面含有一个从未见过的单词,即在训练样本里面从未出现过的单词,我们假设该单词在字典里的顺序为j,那么Naive Bayes 算法对该单词的最大似然估计为:
?j|y=1?j|y=0=∑mi=11{x(i)j=1∧y(i)=1}∑mi=11{y(i)=1}=0=∑mi=11{x(i)j=1∧y(i)=0}∑mi=11{y(i)=0}=0
因为训练集里的样本邮件(不管是不是垃圾邮件)都没有这个单词,所以估计得参数 ?j|y=1 和 ?j|y=0 都是0,当我们要确定含有该单词的某封邮件是不是垃圾邮件时,我们可以计算其后验概率为:
p(y=1|x)=p(x|y=1)p(y=1)p(x)=(∏ni=1p(xi|y=1))p(y=1)(∏ni=1p(xi|y=1))p(y=1)+(∏ni=1p(xi|y=0))p(y=0)=00
因为
∏ni=1p(xi|y) 中含有
p(xj|y)=0, 所以使得最终计算的后验概率为 0/0, 这个结果无法进行预测。这显然不是我们希望看到的。换句话说,如果因为一个训练集中从未出现的单词,而将概率估计为0,这是个很糟糕的想法。
为了避免这个尴尬的问题,我们可以利用Laplace Smoothing, 则新的概率估计为:
?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
可以看到,我们在分子,分母上分别加了一个常数,这样可以避免概率为0,而在实际的应用中,因为对训练集中对垃圾邮件和非垃圾邮件的划分通常比较合理,所以参数
?y一般是一个比较合理的数,所以对
?y的估计不需要利用 Laplace Smoothing.
Event models for text classification
最后,在结束Generative Learning 学习算法之前,我们再介绍一种针对文本分类问题的模型,虽然 Naive Bayes 算法可以很好地处理很多分类问题,但是对于文本分类,还有一种更加好的模型。
之前介绍的特定语境的文本分类问题,这里介绍的Naive Bayes算法用的是我们称之为\textbf{multi-variate Bernoulli event model},在这个模型中,我们对一封邮件,先根据先验概率p(y)计算其为垃圾邮件的概率,然后把这封邮件用事先建立好的字典进行检索,将出现的单词计算其概率p(xi=1|y)=?i|y, 最终该邮件是否为垃圾邮件的概率为:p(y)∏ni=1p(xi|y).
接下来,我们将介绍另外一种更加高效的模型,称为multinomial event model, 为了描述这个模型,我们使用不同的注释和特征来表示一封邮件。我们定义 xi 表示邮件里的第i个单词,xi 可以取整数值,其取值范围为{1,...|V|}, 其中|V|表示预先建立的字典里的单词数目,含有n个单词的一封邮件可以表示成一个n维向量(x1,x2,...xn), 不同的邮件单词数量不同,所以其特征向量的维数也不一样,注意:xi表示邮件的第i个单词,但它的取值是该单词在字典里的序号,比如xi表示邮件的第i个单词A, 但是单词A在字典里序号是1000,则xi=1000,在multinomial event 模型中,同样存在一个先验概率p(y)。然后,我们利用多项式分布计算第一个单词的概率p(x1|y),接下来计算第二个单词的概率,第二个单词与第一个单词是相互独立的,同样的方式,计算第三,第四,直到第n个单词,因此整封邮件的概率为p(y)∏ni=1p(xi|y),可以看到这个表达式和multi-variate Bernoulli event模型的概率表达式相似,但是他们的分布是不同的,一个是伯努利分布,一个是多项式分布。
这个模型我们需要计算的参数有?y=p(y), ?i|y=1=p(xj=i|y=1) (对任何的j), ?i|y=0=p(xj=i|y=0). 注意到我们假设对所有的j,p(xj|y)的概率是一样的(意味着一个单词出现的概率与该单词在邮件中的位置无关)。
如果给定一组训练样本 (x(i),y(i));i=1,...m, 其中x(i)=(x(i)1,x(i)2,...x(i)ni), ni 表示第i个训练样本的单词个数,则训练数据的似然率为:
L(?,?i|y=1,?i|y=0)=∏i=1m(x(i),y(i))=∏i=1m??∏j=1np(x(i)j|y;?i|y=1,?i|y=0)??p(y(i);?y)
利用最大似然估计,可以得到
?k|y=1?k|y=0?y=∑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=∑mi=11{y(i)=1}m
如果我们利用Laplace Smoothing估计
?k|y=1和
?k|y=0,我们可以对分子加常数1,对分母加常数|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|
这个就是
multinomial event model的概率估计。
参考文献
Andrew Ng, “Machine Learning”, Stanford University.