朴素贝叶斯模型是一个简单却很重要的模型,在文本分类中,由于它出奇的简单实现和令人惊讶的表现,因此实际应用中,它都值得是第一个尝试的基准模型。本文接下来将从文本分类这个具体应用中介绍朴素贝叶斯模型。
文本分类问题
在文本分类中,我们面临的问题是给定一个文本
x⃗ =[x1,x2,...,xi,...,xn]
,其中
xi
从原始文本抽出来的一个特征,可以是单个单词或者是一个ngram特征,或者是一个正则表达式特征。我们希望有一个模型可以来预测这个特定文本的标签
y
,在邮件垃圾分类中,
另一派是不直接对问题建模,而是从生成(generative)角度去看待问题,也就是”生成式模型(generative model)”,比如我们本文的主角Naive Bayes就是属于这种模型,与判别式模型不同,生成式模型对问题进行联合建模,从而得出如下模型:
朴素贝叶斯模型
上一节中,我们提到朴素贝叶斯是一种生成模型,也就是它对问题进行联合建模,利用概率的乘法法则,我们可以得到:
由于上述形式复杂,因此朴素贝叶斯作出一个假设,也就是在给定 y 的条件下,
注意此处并不是说 x1,...,xn 的生成概率是相互独立的,而是在给定 y 的条件下才是独立的,也就是这是一种”条件独立”。了解概率图模型的同学,下面的图模型就可以很好地阐述这个问题:
既然我们说朴素贝叶斯是一种生成模型,那它的生成过程是怎样的呢?对于邮件垃圾分类问题,它的生成过程如下:
- 首先根据
p(y) 采用得到 y ,从而决定当前生成的邮件是垃圾还是非垃圾 - 确定邮件的长度
n ,然后根据上一步得到的 y ,再由p(xi|y) 采样得到 x1,x2,...,xn这就是朴素贝叶斯模型。显然,朴素贝叶斯的假设是一种很强的假设,实际应用中很少有满足这种假设的的情况,因为它认为只要在确定邮件是垃圾或者非垃圾的条件下,邮件内容地生成就是完全独立地,词与词之间不存在联系。
朴素贝叶斯应用于文本分类
尽管朴素贝叶斯模型有很强的假设,而且实际文本也不满足这种假设,但是在分类应用中,它却表现不俗。在分类任务中,我们关心的部分是朴素贝叶斯模型的后验概率:
p(y|x⃗ )
根据贝叶斯公式,我们可以得到:
p(y|x⃗ )=p(y)p(x⃗ |y)p(x⃗ )=p(y)∏ip(xi|y)p(x⃗ )
对于分类任务,比如邮件垃圾分类,我们可以通过计算
p(y=垃圾|x⃗ )p(y=非垃圾|x⃗ )
然后比较哪个概率大,从而确定邮件是垃圾或者非垃圾。数学上,我们是求解一个最优化问题:
argmaxyp(y|x⃗ )=argmaxyp(y)p(x⃗ |y)p(x⃗ )=argmaxyp(y)p(x⃗ |y)=argmaxyp(y)∏ip(xi|y)朴素贝叶斯参数估计
前面我们已经介绍了朴素贝叶斯模型,以及它是如何应用于文本分类中,接下来我们讲讲如何估计朴素贝斯模型的参数。为了估计参数,我们再来好好审视一下朴素贝叶斯模型,首先明确的是模型的组成部分 p(y) 和 ∏ip(xi|y) ,朴素贝叶斯只是将联合概率分布拆解成这两部分,但是并没有指明这两部分的模型具体是怎样的。于是我们有必要对模型进一步建模,然后通过我们最熟悉的极大似然法进行参数估计。
为了更方便进行参数求解,我们假设问题是一个有监督的问题,也就是我们的训练数据是包含标签的,比如我们有大量邮件,并且邮件已经标注好垃圾或者非垃圾。用数学记号表示,我们有 m 个训练数据,每个训练数据是
(x⃗ i,yi) ,我们的模型希望从这些训练数据中估计出模型的参数。求解 p(y)
p(y) 作为贝叶斯模型的先验概率分布,很多时候是根据我们对问题的理解,然后指定它的实际分布的,比如对于邮件垃圾识别问题,我们的经验告诉我们,10封邮件里面,大概只有2封是垃圾,那么我们可以指定 p(y) 的分布是:
p(y=垃圾)=0.2p(y=非垃圾)=0.8
如果你觉得不太放心,还是想靠数据说话,那么一般我们会假设 p(y) 服从多项式分布,然后从训练数据中学习它的分布,假设 m 封邮件中有n 封邮件是垃圾,剩下的是非垃圾,那么它的分布就是:
p(y=垃圾)=nmp(y=非垃圾)=m−nn求解 p(xi|y)
此项在贝叶斯模型中属于数据似然部分,如果不考虑先验概率分布 p(y) ,仅仅依靠该部分来求解模型,那就是频率学派的做法。朴素贝叶斯并没有告诉我们这一部分的模型是什么,一般在文本分类中,我们会做两种假设,一种 p(xi|y) 服从伯努力分布,另一种则假设它服从多项式分布。接下来我们分别讲解在这两种假设下,朴素贝叶斯模型的参数估计是如何进行的。为了表达方便,我们用 θ 来表示模型的参数,其中 ϕy 代表 p(y) 的参数, ϕxi|y 代表 p(xi|y) 的参数,我们可以知道:
L(θ)=log∏imp(yi,x⃗ i)=∑imlogp(yi,x⃗ i)=∑imlogp(yi)∏jp(xij|yi)=∑imlogp(yi)+∑im∑jlogp(xij|yi)=∑imlogϕyi+∑im∑jlogϕxij|yi
由于先验分布 p(y) 的参数估计在上一节中已经解决,我们重点关注后半部分。多变量伯努力事件模型
如果假设 p(xi|y) 服从伯努力分布,那么此时的朴素贝叶斯模型也叫做”多变量伯努力事件模型”(multi-variate Bernoulli event model),随机变量 xi 代表一个标识,当 xi=1 时,代表包含第 i 个词汇,当
xi=0 时,代表不包含第 i 个词汇。在这种假设下,朴素贝叶斯模型的生成过程如下,还是以邮件垃圾识别为例子,假设词汇总数为V :- 首先根据先验分布 p(y) 采样得到 y ,从而确定邮件内容是否为垃圾
- 确定邮件不重复的词汇数
N ,然后遍历整个字典,根据 p(xi|y) 决定要不要包含此时的词汇,使得不重复词汇数为 N ,此时的生成模型可以看成是多次伯努力采样后的结果
由上述假设的过程,我们可以得到模型的极大似然表示为(每个特征都会有一个布尔变量
b∈{0,1} , 当 b=1 时代表包含该特征):
L(θ)=∑imlogϕyi+∑im∑jVlogϕbxij=1|yi∗(1−ϕxij=1|yi)(1−b)
在约束条件:
∑xj∈{0,1}ϕxj|y=1ϕxj|y≥0j=1,2,3,...y∈{垃圾,非垃圾}
求解最大的似然估计,可以转化为有约束的最优化问题,通过最优化手段求解最终可得模型得参数估计:
ϕxj=1|y=垃圾=∑mi1{xij=1∧yi=垃圾}∑mi1{yi=垃圾}ϕxj=1|y=非垃圾=∑mi1{xij=1∧yi=非垃圾}+1∑mi1{yi=非垃圾}
为了使模型更加健壮,一般会对估计的参数进行”拉普拉斯平滑”,平滑后的参数估计为:
ϕxj=1|y=垃圾=∑mi1{xij=1∧yi=垃圾}+1∑mi1{yi=垃圾}+2ϕxj=1|y=非垃圾=∑mi1{xij=1∧yi=非垃圾}∑mi1{yi=非垃圾}+2
其中 1{} 代表一个标示函数,如果括号里面为真则返回1,否则返回0。多项式事件模型
如果假设 p(xi|y) 服从多项式分布,那么此时的朴素贝叶斯模型也叫做”多项式事件模型”(mutinomial event model),与多变量伯努力事件模型不同,随机变量 xi=k , k 取值为
{1,2,...,V} ,代表的意义是第 i 个位置的词是第k 个词。在这种假设下,朴素贝叶斯模型的生成过程如下,还是以邮件垃圾识别为例子,假设词汇总数为 V :- 首先根据先验分布
p(y) 采样得到 y ,从而确定邮件内容是否为垃圾 - 确定邮件的长度
N ,现在有一个 V 项的多项式分布p(x|y) ,每次从这个多项式分布采样出一个词汇,直到邮件长度为 N
由上述假设的过程,我们可以得到模型的极大似然表示为:
L(θ)=∑imlogϕyi+∑im∑jNilogϕxij|yi
其中 Ni 代表第 i 个邮件的长度。在约束条件:
∑xj∈{1,2,...,V}ϕxj|y=1ϕxj|y≥0j=1,2,3,...y∈{垃圾,非垃圾}
求解最大的似然估计,可以转化为有约束的最优化问题,通过最优化手段求解最终可得模型得参数估计:
ϕxj=k|y=垃圾=∑mi∑Nij1{xij=k∧yi=垃圾}∑mi1{yi=垃圾}Niϕxj=k|y=非垃圾=∑mi∑Nij1{xij=k∧yi=非垃圾}∑mi1{yi=非垃圾}Ni
同样的,如果采取拉普拉斯平滑,则最终参数估计为:
ϕxj=k|y=垃圾=∑mi∑Nij1{xij=k∧yi=垃圾}+1∑mi1{yi=垃圾}Ni+Vϕxj=k|y=非垃圾=∑mi∑Nij1{xij=k∧yi=非垃圾}+1∑mi1{yi=非垃圾}Ni+V朴素贝叶斯模型实现
在stanford-nlp算法库中,有上述两种模型的实现,运用实现好的算法包相当简单,只要对原始文本进行分词,去除停用词,提取ngram特征,正则表达式特征等等特征工程,就可以很方便地调用算法包输出结果。
参考引用
Michael Collins lecture note: The Naive Bayes Model, Maximum-Likelihood Estimation, and the EM Algorithm
Andrew Ng cs229 lecture note:http://cs229.stanford.edu/notes/cs229-notes2.pdf
Sebastian Raschka: Naive Bayes and Text Classification Introduction and Theory
stanford-nlp https://nlp.stanford.edu/software/classifier.html