朴素贝叶斯分类器(Naive Bayesian Classifier)
2018-07-07 14:27 bluemapleman 阅读(9685) 评论(0) 编辑 收藏 举报本博客是基于对周志华教授所著的《机器学习》的“第7章 贝叶斯分类器”部分内容的学习笔记。
朴素贝叶斯分类器,顾名思义,是一种分类算法,且借助了贝叶斯定理。另外,它是一种生成模型(generative model),采用直接对联合概率P(x,c)建模,以获得目标概率值的方法。
预备知识
先验概率与后验概率
先验概率(摘自维基百科):
In Bayesian statistical inference, a prior probability distribution, often simply called the prior, of an uncertain quantity is the probability distribution that would express one's beliefs about this quantity before some evidence is taken into account.
翻译:在贝叶斯统计推断论中,一个未确定数目的先验概率分布(一般简称为先验)是一种表达了某人对于该数目的信仰的一种概率分布,这种信仰是没有考虑到一些(当前的)证据的。
解释:通俗来说,对于某一个概率事件,我们都会有基于自己已有的知识,对于这个概率事件会分别以什么概率出现各种结果会有一个预先的估计,而这个估计并未考虑到任何相关因素。
举例来说,假如你考试没及格,老师要求大家拿卷子回家给爸妈签字,按照你已有的对爸妈脾气的了解,以及他们对自己成绩的要求,你在不考虑其它任何因素的情况下,自己已经有了一个对把卷子拿回家给他们签字的后果预估(先验):
- 被胖揍一顿:70%
- 被简单地数落一下:20%
- 被温情地鼓励:10%
暂停,让我们再来看看后验概率是什么:
In Bayesian statistics, the posterior probability of a random event or an uncertain proposition is the conditional probability that is assigned after the relevant evidence or background is taken into account. "Posterior", in this context, means after taking into account the relevant evidence related to the particular case being examined.
翻译:在贝叶斯推断中,一个随机事件的后验概率是指:当与事件相关的一些证据或背景也被考虑进来时的条件概率。“后验”在这个语境下即指的是在考虑了与要被检验的特定事件相关的证据。
所以后验概率就是在先验概率的基础上加了一层“考虑”:结合我们已有的知识,将与待检验事件(即我们正在估计概率的随机事件)相关的因素也考虑进去后,我们队随机事件的概率的预估。
回到卷子签字的例子。
假设,你惶恐地拿着卷子回到家中,还没开口说考试的事,就看到爸爸妈妈在那儿雀跃,好似疯了一样。你一问,他们告诉你说家里中了1亿的大奖,以后就直接过上荣华富贵的生活啦!
这时,你小眼珠子一转,根据当前家里中了亿元大奖的情况,对把不及格试卷给爸妈签字的后果有了新的预估(后验):
- 被胖揍一顿:0%
- 被简单地数落一下:0%
- 被温情地鼓励:100%
没错,因为你觉得按现在家里的情况来看,爸妈会觉得你这一次考试没及格算个屁,以后直接花钱把你送到国外去留学,回来继承家产就是了,什么考试啥的见鬼去吧~~
这就是先验概率和后验概率的区别:先验概率基于已有知识对随机事件进行概率预估,但不考虑任何相关因素(P(c))。后验概率基于已有知识对随机事件进行概率预估,并考虑相关因素(P(c|x))。
贝叶斯定理(Bayesian Theorem)
贝叶斯定义(摘自维基百科):
In probability theory and statistics, Bayes’ theorem (alternatively Bayes’ law or Bayes' rule) describes the probability of an event, based on prior knowledge of conditions that might be related to the event. For example, if cancer is related to age, then, using Bayes’ theorem, a person’s age can be used to more accurately assess the probability that they have cancer, compared to the assessment of the probability of cancer made without knowledge of the person's age.
翻译:在概率论与统计学中,贝叶斯定理(或称贝叶斯法则、贝叶斯规则)描述了一个事件的可能性,这个可能性是基于了预先对于一些与该事件相关的情况的知识。举例来说,如果癌症和年龄有关,那么使用贝叶斯定理的话,相比根本不了解关于此人的任何其他信息,知道了它的年龄的话就可以用来更准确地帮助评估它得癌症与否的概率。
那么其实很明显了,这里的“可能性”也是考虑了与随机事件相关的因素的,所以贝叶斯定理所阐述的也就是后验概率的获得方法。
用数学公式来表述贝叶斯定理:
$$P(c|x)=\frac{P(c)P(x|c)}{P(x)}=\frac{P(x,c)}{P(x)}$$
c表示的是随机事件发生的一种情况。x表示的就是证据(evidence)\状况(condition),泛指与随机事件相关的因素。
- P(c|x):在x的条件下,随机事件出现c情况的概率。(后验概率)
- P(c):(不考虑相关因素)随机事件出现c情况的概率。(先验概率)
- P(x|c):在已知事件出现c情况的条件下,条件x出现的概率。(后验概率)
- P(x):x出现的概率。(先验概率)
那么,落实到实际的问题当中,我们想获得的核心结果其实也就是P(c|x),即我们想知道,在考虑了一些现有的因素后,随机事件会以多大概率出现各种情况,通过参考这个结果,我们针对性地作出决策。
而从计算上来说,我们需要同时知道P(c),P(x|c)和P(x)才能算出目标值P(c|x),而P(x)由于是c无关,而且作为共同的分母,在我们计算c的各种取值的可能性时并不会对各结果的相对大小产生影响。因此可以忽略。
比如c可取值$c_1,c_2,c_3$,并假设已知$$p(c_1)=o,p(c_2)=p,p(c_3)=q,P(x|c_1)=a,P(x|c_2)=b,P(x|c_3)=c,p(x)=m$$,那么最后计算p(c|x)时,分别会得到结果$$p(c_1|x)=\frac{oa}{m},p(c_2|x)=\frac{pb}{m},p(c_3|x)=\frac{q*c}{m}$$,由于$p(c_1|x)+p(c_2|x)+p(c_3|x)$的和一定为1,固我们可以得到$oa+pb+qc=m$,而即使m的值预先不知道也没关系,因为oa,pb,qc的值都是可以计算出来的,m自然也就得到了。
那么,略掉了P(x)后,最后难点也就落在了计算P(x|c)与P(c)上,而这两个概率分布是必须要通过我们手上有的数据集来进行估计的。
朴素贝叶斯分类器
何为“朴素”:属性条件独立性假设
上面讲到,为了获得$p(c|x)$,我们的计算任务最终落脚到了获得P(x|c)和P(c)上。
假设我们有了一个数据集D,那么p(c)的获得其实也较为简单:计算D中c的各个情况出现的频率即可。比如计算$P(c_1)$,直接用$c_1$情况出现次数在所有情况中所占的比例值即可。(这里用到了大数定律:当训练集包含充足的独立同分布样本时,P(c)可通过各类样本出现的频率来进行估计。)
而获得p(x|c)就略显困难,因为x往往包含多个相关因素(是一个多种因素构成的向量),即它可能有多个需要考虑的属性值:
$$x=(x_1,x_2,x_3,...,x_n)$$
任一$x_i$都代表了所有相关因素中的其中一个。在癌症辅助判断中,它可能是患者的年龄,也可能是患者的性别,也可能是患者是否吸烟等等。因此当x是一个向量时,我们若要计算P(x|c),实际上就是要计算$P(x_1,x_2,x_3,...,x_n|c)$。这个理论上也是可以利用我们的数据集D来进行估计的,但是现实情况是,n的值往往非常大(属性非常多),而我们的数据集往往不能保证我们的样本包含了属性值的所有可能组合(假设每个属性都是二值属性,那么就有$2^n$种属性组合)。那么很多p(x|c)我们估计得到的值就是0。然而这些样本很可能仅仅是我们的数据集中没包含到,即“未被观测到”,但不代表它们现实中“出现概率为0”。于是这就给我们计算出真实合理的目标p(c|x)值造成了障碍。
于是,朴素贝叶斯的“朴素”就发挥作用了。
“朴素”是什么,就是“拿衣服”(naive)!就是很幼稚!为什么幼稚,因为我们为了能够获得合理的p(x|c)的值,采用了“很不科学”的属性条件独立性假设。
这个假设用公式表达式这样的:
$$P(c|x)=\frac{P(c)P(x|c)}{P(x)}=\frac{P(c)}{P(x)}\Pi_{i=1}^dP(x_i|c)$$
解释一下:公式的靠左边等式使我们熟悉的贝叶斯定理的公式,而右边新加的一个式子是将P(x|c)(条件联合概率)表达成了$\Pi_{i=1}^dP(x_i|c)$(多个条件概率的相乘)。用俗话说,这个假设认为每个属性取它的各个值的可能性是独立的,与其它属性的取值不相关。
这个假设乍看起来没什么问题,但举个例子你可能就会明白它为了简化问题有多么简单粗暴(naive):还是癌症诊断的例子,假设有两个属性$x_1$:患者性别,$x_2$:患者是否吸烟,那么现实情况下来看,如果我们某个患者吸烟,我们较大概率下会判定这应该是一名男性对吧(一般认为吸烟的男性比较多)?但是属性条件独立性假设认为,吸烟和性别的取值没关系!即不管患者吸不吸烟,这与患者的性别可能性没有一点关系,患者的性别可能性仍然是男(50%)和女(50%)。
因此,属性条件独立性假设实际上是忽略掉了某些属性之间可能存在的关联,假设属性的取值可能性都是独立的,以简化$P(x_1,x_2,x_3,...,x_n|c)$的计算为$\Pi_{i=1}^dP(x_i|c)=P(x_1|c)P(x_2|c)P(x_3|c)...P(x_n|c)$。那么按照这种方式计算,我们前面谈到的“数据集无法覆盖所有可能的属性组合的样本”问题也就基本解决了,因为根本不需要有那么多样本,保证每个属性的各个取值都能有样本取到过就行了。
但是,由于朴素贝叶斯分类器在这种naive的假设下仍能在实际问题中取得比较好的效果,因此这个假设的不合理性也就可以暂时放下不谈了。
分类准则
分类准则用公式表达如下:
$$h_{nb}(x)=argmax_{c\in y} P(c)\Pi_{i=1}^dP(x_i|c)$$
$h_{nb}$代表一个由naive bayesian(nb)算法训练出来的hypothesis(假设),它的值就是贝叶斯分类器对于给定x的因素下,最可能出现的情况c。y是c的取值集合。
解释一下:等式右边的式子就是argmax加上基于属性条件独立性假设的贝叶斯定理的分子部分(分母P(x)前面提到过,可以在计算中略去),即我们的输出值就是这样的一个c,这个c使得$P(c)\Pi_{i=1}^dP(x_i|c)$的计算结果值最大。
离散属性与连续属性值的分别处理
在估计条件概率$P(x_i|c)$时,若$x_i$为离散值属性,那么我们只需计算每个属性取值占所有样本的数量比例就行了:
$$P(x_i|c)=\frac{|D_{c,x_i}|}{|D_c|}$$
$D_c$表示训练集D中第c类样本组成的集合,外加两条竖线表示的是集合的元素数量。$D_{c,x_i}$表示的是$D_c$中在第i个属性值上取值为$x_i$的样本组成的集合。
但是如果$x_i$是连续值属性,那么我们就肯定不能这样做了,而是得用概率密度函数,即假定$p(s_i|c)\sim N(\mu_{c,i},\sigma2_{c,i})$,其中$\mu_{c,i}和\sigma2_{c,i}$分别是第c类样本在第i个属性上取值的均值和方差,则有:
$$p(x_i|c)=\frac{1}{\sqrt{2\pi}\sigma_{c,i}}exp(-\frac{(x_i-\mu_{c,i})2}{2\sigma2_{c,i}})$$
到这里我们已经基本上可以用朴素贝叶斯分类器来做一些实际的尝试了。接下来,我们根据一个西瓜书上的实例来看一下具体的应用步骤。
例子讲解
假设我们的任务是根据一个西瓜的特征来在它被吃之前判断它是否是个好瓜。现在我们有以下数据集:
现在,基于已有的数据,我们想利用朴素贝叶斯算法训练出一个分类器,以判断一个具有特征{色泽=青绿,根蒂=蜷缩,敲声=浊响,纹理=清晰,脐部=凹陷,触感=硬滑,密度=0.697,含糖率=0.460}的测试样例瓜($x_{test}$)是否为好瓜。
那么,首先我们估计先验概率P(c),显然有:
$$P(好瓜=是)=\frac{8}{17}\approx 0.471$$
$$P(好瓜=否)=\frac{9}{17}\approx 0.529$$
其次,我们计算每个属性值的条件概率$P(x_i|c)$:
对于离散值属性:
对于连续值属性:
最后,我们计算测试瓜$x_{test}$分别属于好瓜和坏瓜的概率:
很明显,测试瓜是好瓜的概率0.038远大于测试瓜是坏瓜的概率6.80×$10^{-5}$,于是分类器判断测试瓜为好瓜。
拉普拉斯修正(Laplacian correction)
朴素贝叶斯分类器在实际使用中还需要注意的一个问题是:若某个离散类型的属性值在训练集中没有与某个类同时出现过,那么当我们使用$p(x_i|c)=\frac{|D_{c,x_i}|}{|D_c|}$对其进行估计时,$p(x_i|c)$会等于0,而若某个样本只是在属性i上恰好取值为$x_i$,但是它其它的属性非常符合这个类型c的特征,于是在用最后的连乘式计算该样本属于该类的概率时,不管其它的属性如何取值,就会因为$p(x_i|c)$这一个零值导致分类器认为该样本属于这个类型c的概率为0,这显然是不合理的。
比如在上面的西瓜训练集中,好瓜当中暂时没有具备特征{敲声=清脆}的样本,于是对于一个“敲声=清脆”的测试例:
$$P_{清脆|是}=P(敲声=清脆|好瓜=是)=\frac{0}{8}=0$$
那么,不管该测试瓜在其它属性上有多么接近好瓜,都会被直接判定为是好瓜的概率为0。
这个问题本质上是由于我们的训练集不够完整,没有包括足够多的样本。但是,为了避免这个问题的出现,我们通常还是在估计概率值时,对其进行“平滑”(smoothing)操作,通常使用“拉普拉斯修正”(Laplacian correction)。
具体做法是:令N表示训练集D中可能的类别数,$N_i$表示第i个属性可能的取值数,那么我们估计$类别概率值的P(c)和离散属性条件概率的P(x_i|c)$的两个式子分别被调整为:
$$\hat{P}(c)=\frac{|D_c|+1}{|D|+N},$$
$$\hat{P}(x_i|c)=\frac{|D_{c, x_i}|+1}{|D_c|+N_i}$$
即,我们在分母上都加上取值的可能性个数,分子上都加1,这就保证了即使是存在某个属性i的取值$x_i$未曾与类别$c_i$同时出现过,我们也不会把其概率$P(x_i|c)$算成0.
那么在上面的西瓜数据集中,使用拉普拉斯修正后,对于类别概率就有:
对于具备特征{敲声=清脆}的测试瓜就有: