不难发现,基于贝叶斯公式来估计后验概率P(c|x)的主要困难在于:类条件概率P(x|c)是所有属性上的联合概率,难以从有限的训练样本直接估计得到。为避开这个障碍,朴素贝叶斯分类器(naive Bayes classifier)采用了“属性条件独立性假设”(attribute conditional independence assumption):对已知类别,假设所有属性相互独立。换言之,假设每个属性独立地对分类结果发生影响。基于属性条件独立性假设,贝叶斯公式可重写为
其中d为属性数目,为x在第i个属性上的取值。由于对所有类别来说P(x)相同,因此基于贝叶斯判定准则有
这就是朴素贝叶斯分类器的表达式。显然,朴素贝叶斯分类器的训练过程就是基于训练集D来估计类先验概率P(c),并为每个属性估计条件概率。令表示训练集D中第c类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率
对离散属性而言,令表示中在第i个属性上取值为的样本组成的集合,则条件概率可估计为
对连续属性可考虑概率密度函数,假定,其中和分别是第c类样本在第i个属性上取值的均值和方差,则有
下面我们用西瓜数据集3.0训练一个朴素贝叶斯分类器,对测试例“例1”进行分类;
编号 | 色泽 | 根蒂 | 纹理 | 脐部 | 触感 | 密度 | 含糖率 | 敲声 | 好瓜 |
测1 | 青绿 | 蜷缩 | 清晰 | 凹陷 | 硬滑 | 0.607 | 0.460 | 浊响 | ? |
首先估计类先验概率P(c),显然有
- P(好瓜=是)=8/170.471
- P(好瓜=否)=9/170.529
然后为每个属性估计条件概率:
- P青绿|是=P(色泽=青绿|好瓜=是)=3/8=0.375
- P青绿|否=P(色泽=青绿|好瓜=否)=3/80.333
- P蜷缩|是=P(根蒂=蜷缩|好瓜=是)=3/8=0.625
- P蜷缩|否=P(根蒂=蜷缩|好瓜=否)=3/80.333
- P浊响|是=P(敲声=浊响|好瓜=是)=3/8=0.750
- P浊响|否=P(敲声=浊响|好瓜=否)=3/80.444
- P清晰|是=P(纹理=清晰|好瓜=是)=3/8=0.875
- P清晰|否=P(纹理=清晰|好瓜=否)=3/80.222
- P凹陷|是=P(脐部=凹陷|好瓜=是)=3/8=0.750
- P凹陷|否=P(脐部=凹陷|好瓜=否)=3/80.222
- P硬滑|是=P(触感=硬滑|好瓜=是)=3/8=0.750
- P硬滑|否=P(触感=硬滑|好瓜=否)=3/80.667
p密度:0.667|是=p(密度=0.697|好瓜=是)=
p密度:0.667|是=p(密度=0.697|好瓜=是)=
p密度:0.667|是=p(密度=0.697|好瓜=是)=
p密度:0.667|是=p(密度=0.697|好瓜=是)=
于是,有
P(好瓜=是)P青绿|是P蜷缩|是P浊响|是P凹陷|是P硬滑|是p密度:0.697|是p含糖:0.460|是0.063
P(好瓜=否)P青绿|否P蜷缩|否P浊响|否P凹陷|否P硬滑|否p密度:0.697|否p含糖:0.460|否
由于0.063>,因此,朴素贝叶斯分类器将测试样本“测1”判别为“好瓜”。
需注意,肉某个属性值在训练集中没有与某个类同时出现过,则直接基于进行概率估计,再根据进行判别将出现问题。例如,在使用西瓜数据集3.0训练朴素贝叶斯分类器时,对一个“敲声=清脆”的测试例,有
P清脆|是=P(敲声=清脆|好瓜=是)==0
由的连乘计算出的概率值为零,因此,无论该样本的其他属性是什么,哪怕在其他属性上明显像好瓜,分类的结构都是“好瓜=否”,这显然不太合理。
为了避免其他属性携带的信息被训练中未出现的属性值“抹去”,在估计概率值时通常要进行“平滑”,常用“拉普拉斯修正”(Laplace correction)。具体来说,令N表示训练集中可能的类别数,Ni表示第i个属性可能的取值,则P(c)和分别修正为
例如,在本例中,类先验概率可估计为
(好瓜|是)=(8+1)/(17+2)0.474
(好瓜|否)=(9+1)/(17+2)0.526
类似地,P青绿|是和P青绿|否,可估计为
青绿|是=(色泽=青绿|好瓜=是)=(3+1)/(8+3)0.364
青绿|否=(色泽=青绿|好瓜=否)=(3+1)/(9+3)0.333
同时,上文提到的概率P清脆|是,可估计为
青绿|是=(敲声=清脆|好瓜=是)=(0+1)/(8+3)0.091
显然,拉普拉斯修正避免了因训练集样本不允许而导致概率估值为零的问题,并且在训练集变大时,修正过程所引入的先验(prior)的影响也会逐渐变得可忽略,使得估值趋向于实际概率值。在现实任务中朴素贝叶斯分类器有多种使用方法。例如,若任务对预测速度要求较高,则对给定训练集,可将朴素贝叶斯分类器设计的所有概率值估值实现算好存储起来,这样在进行预测时只需“查表”即可进行判别;若任务数据更换频繁,则可采用“懒惰学习”(lazy learning)方式,先不进行任何训练,待收到预测请求时再根据当前数据集进行概率估值;若数据不断增加,则可在现有估值基础上,仅对新增样本的属性值所涉及的概率估值进行计数修正即可实现增量学习。