前面提到了,估计后验概率 朴素贝叶斯分类器 - 图1#card=math&code=P%28c%5C%20%7C%5C%20%5Cmathbf%7Bx%7D%29&id=QEoYp) 最大的一个难处是:类条件概率 朴素贝叶斯分类器 - 图2#card=math&code=P%28%5Cmathbf%7Bx%7D%5C%20%7C%5C%20c%29&id=pOSD9) 是所有属性上的联合概率,而多个属性的不同属性值组合并不一定全部囊括在训练集内,所以很难通过训练集估计。

为了避免这个障碍,朴素贝叶斯分类器(naive Bayes clssifier)采用属性条件独立性假设(attribute conditional independence assumption)。也就是说,假设所有属性相互独立,单独地对分类结果产生影响

基于这个假设,可以把类条件概率写成连乘的形式,因此贝叶斯定理可重写为:

朴素贝叶斯分类器 - 图3%20%3D%20%5Cfrac%7BP(%5Cmathbf%7Bx%7D%5C%20%7C%5C%20c)%20%5Ctimes%20P(c)%7D%7BP(%5Cmathbf%7Bx%7D)%7D%20%3D%20%5Cfrac%7BP(c)%7D%7BP(%5Cmathbf%7Bx%7D)%7D%20%5Cprod%7Bi%3D1%7D%5E%7Bd%7D%20P(x_i%5C%20%7C%5C%20c)%20%5Cqquad%20(1)%0A#card=math&code=P%28c%5C%20%7C%5C%20%5Cmathbf%7Bx%7D%29%20%3D%20%5Cfrac%7BP%28%5Cmathbf%7Bx%7D%5C%20%7C%5C%20c%29%20%5Ctimes%20P%28c%29%7D%7BP%28%5Cmathbf%7Bx%7D%29%7D%20%3D%20%5Cfrac%7BP%28c%29%7D%7BP%28%5Cmathbf%7Bx%7D%29%7D%20%5Cprod%7Bi%3D1%7D%5E%7Bd%7D%20P%28x_i%5C%20%7C%5C%20c%29%20%5Cqquad%20%281%29%0A&id=HGeNm)

其中 朴素贝叶斯分类器 - 图4 为属性数目, 朴素贝叶斯分类器 - 图5 为样本 朴素贝叶斯分类器 - 图6 在第 朴素贝叶斯分类器 - 图7 个属性上的取值。

又因为 朴素贝叶斯分类器 - 图8#card=math&code=P%28%5Cmathbf%7Bx%7D%29&id=JL08t) 与类别无关,所以朴素贝叶斯分类器的表达式可以写为:

朴素贝叶斯分类器 - 图9%20%3D%20%5Carg%20%5Cmax%7Bc%20%5Cin%20%5Cmathcal%7BY%7D%7D%20P(c)%20%5Cprod%7Bi%3D1%7D%5E%7Bd%7D%20P(xi%5C%20%7C%5C%20c)%0A#card=math&code=h%28%5Cmathbf%7Bx%7D%29%20%3D%20%5Carg%20%5Cmax%7Bc%20%5Cin%20%5Cmathcal%7BY%7D%7D%20P%28c%29%20%5Cprod_%7Bi%3D1%7D%5E%7Bd%7D%20P%28x_i%5C%20%7C%5C%20c%29%0A&id=qlTIb)

前面已经提到过,当训练集包含足够多独立同分布样本时,类先验概率 朴素贝叶斯分类器 - 图10#card=math&code=P%28c%29&id=IwVaR) 可以直接算出,也即训练集该类样本的数目占训练集规模的比例:

朴素贝叶斯分类器 - 图11%20%3D%20%5Cfrac%7B%7CD_c%7C%7D%7B%7CD%7C%7D%20%5Cqquad%20(2)%0A#card=math&code=P%28c%29%20%3D%20%5Cfrac%7B%7CD_c%7C%7D%7B%7CD%7C%7D%20%5Cqquad%20%282%29%0A&id=riaBP)

而条件概率 朴素贝叶斯分类器 - 图12#card=math&code=P%28x_i%5C%20%7C%5C%20c%29&id=nnEgR),根据属性类型分离散和连续两种情况:

  • 离散型属性:条件概率 朴素贝叶斯分类器 - 图13#card=math&code=P%28x_i%5C%20%7C%5C%20c%29&id=jtqnO) 可以估计为,在类别 朴素贝叶斯分类器 - 图14 的样本子集中,第 朴素贝叶斯分类器 - 图15 个属性取值为 朴素贝叶斯分类器 - 图16 的样本所占的比例:

朴素贝叶斯分类器 - 图17%20%3D%20%5Cfrac%7B%7CD%7Bc%2Cx_i%7D%7C%7D%7B%7CD_c%7C%7D%20%5Cqquad%20(3)%0A#card=math&code=P%28x_i%5C%20%7C%5C%20c%29%20%3D%20%5Cfrac%7B%7CD%7Bc%2Cx_i%7D%7C%7D%7B%7CD_c%7C%7D%20%5Cqquad%20%283%29%0A&id=Are7w)

  • 连续性属性:替换为概率密度函数,假设第 朴素贝叶斯分类器 - 图18 个属性服从高斯分布,那么条件概率就写成 朴素贝叶斯分类器 - 图19%20%5Csim%20%5Cmathcal%7BN%7D(%5Cmu%7Bc%2Ci%7D%2C%5Csigma%7Bc%2Ci%7D%5E2)#card=math&code=p%28xi%5C%20%7C%5C%20c%29%20%5Csim%20%5Cmathcal%7BN%7D%28%5Cmu%7Bc%2Ci%7D%2C%5Csigma_%7Bc%2Ci%7D%5E2%29&id=oKk6j)。我们利用类别 朴素贝叶斯分类器 - 图20 的样本子集在该属性上的取值算出分布的均值和方差,然后把属性取值 朴素贝叶斯分类器 - 图21 代入概率密度函数就可算出这个条件概率。

平滑

注意了,若某个属性值在训练集中没有与某个类同时出现过,那么它对应的条件概率 朴素贝叶斯分类器 - 图22#card=math&code=P%28x_i%5C%20%7C%5C%20c%29&id=UdaC1) 就为0。在连乘中,这就意味着整个式子值为0了,其他属性携带的信息都被抹去了。这是很常见的情况,举个例子,假设有一篇新闻应该在体育版发布的,它包含了 “罗纳尔多” 这个词,但由于我们构造分类器时,训练集中所有 “体育” 类的文本都没有出现这个词,于是,该新闻按照式(1)计算出的体育类的条件概率必定为0;而恰好 “娱乐” 类的文本中有一篇包含了这个词,那么计算出的娱乐类的条件概率就大于0,从而使得这篇新闻被误分到娱乐版发布了,这显然很不合理。

此时,我们就需要对概率值进行平滑(smoothing)了,最常用的是拉普拉斯修正(Laplacian correction),假设训练集中包含 朴素贝叶斯分类器 - 图23 个类别,第 朴素贝叶斯分类器 - 图24 个属性包含 朴素贝叶斯分类器 - 图25 种取值,则拉普拉斯修正把式(2)和式(3)修改为:

朴素贝叶斯分类器 - 图26%20%3D%20%5Cfrac%7B%7CD_c%7C%20%2B%201%7D%7B%7CD%7C%20%2B%20N%7D%20%5Cqquad%20(4)%0A#card=math&code=P%28c%29%20%3D%20%5Cfrac%7B%7CD_c%7C%20%2B%201%7D%7B%7CD%7C%20%2B%20N%7D%20%5Cqquad%20%284%29%0A&id=cuXn0)

朴素贝叶斯分类器 - 图27%20%3D%20%5Cfrac%7B%7CD%7Bc%2Cx_i%7D%7C%20%2B%201%7D%7B%7CD_c%7C%20%2B%20N_i%7D%20%5Cqquad%20(5)%0A#card=math&code=P%28x_i%5C%20%7C%5C%20c%29%20%3D%20%5Cfrac%7B%7CD%7Bc%2Cx_i%7D%7C%20%2B%201%7D%7B%7CD_c%7C%20%2B%20N_i%7D%20%5Cqquad%20%285%29%0A&id=E34ip)

再回想一下上面新闻分类的例子,尽管所有 “体育” 类的文本都没有出现 “罗纳尔多” 这个词,但使用拉普拉斯修正后,这个词(文本分类中每个词是一个属性)对应的条件概率就不为0了,而是一个很小的值;而该新闻的其他词,比如 “足球”、“球场” 等等在体育类新闻中都出现得很频繁,所以最后累乘计算出的体育类的类条件概率就大于其他类,从而能正确地进行划分了。

拉普拉斯修正保证了不会因为训练集样本不充分导致概率估值为零。但它实际上是假设了类别和属性值是均匀分布的,相当于额外引入了先验,这个假设并不总是成立。不过当训练集规模足够大时,引入先验所产生的影响会变得非常低。也可以理解为,此时式(4)和式(5)的分母很大,使得分子中引入的1带来的变化非常小,此时概率的估计值会趋向于真实值。

实际使用

朴素贝叶斯分类器和前面学习的模型有一个不同的地方就是,我们并不是基于训练集和某些算法来学习模型的参数;而是利用训练集来算出一些概率,在预测时,根据新样本的情况,使用不同的概率计算出它被分到各个类的后验概率,然后取后验概率最大的一个类作为结果。

在实际任务中,有两种使用方式:

  • 查表:若对预测速度要求较高,可以先根据训练集把所有涉及到的概率计算出来,然后存储好,在预测新样本时只需要查表然后计算就可以了。
  • 懒惰学习:若数据更替比较频繁,也可以理解为用训练集算出的概率可能很快就失效了,更新换代的速度很快,那就采取懒惰学习(lazy learning)的方式,仅当需要预测时才计算涉及到的概率。

特别地,当我们采取了预先计算所有概率的方式时,如果有新数据加入到训练集,我们只需要更新新样本涉及到的概率(或者说计数)就可以了,可以很方便地实现增量学习