机器学习算法之朴素贝叶斯模型
基本原理
从统计学知识回到我们的数据分析。假如我们的分类模型样本是:
即我们有m个样本,每个样本有n个特征,特征输出有k个类别,定义为C1,C2,…,Ck,。从样本我们可以学习得到朴素贝叶斯的先验分布P(Y=Ck)(k=1,2,…,K),接着学习到条件概率分布P(X=x|Y=Ck)=P(X1=x1,X2=x2,…,Xn=xn|Y=Ck),然后我们就可以用贝叶斯公式得到X和Y的联合分布P(X,Y)了。联合分布P(X,Y)定义为:
从上面的式子可以看出P(Y=Ck)比较容易通过最大似然法求出,得到的P(Y=Ck)就是类别Ck在训练集里出现的频数。但是P(X=x|Y=Ck)=P(X1=x1,X2=x2,…,Xn=xn|Y=Ck)很难求出,这是一个超级复杂的有n个维度的条件分布。朴素贝叶斯模型在这里做了一个大胆的假设,即X的n个维度之间相互独立,这样就可以得出:
从上式可以看出,这个很难的条件分布大大简化了,但是这也可能带来预测的不准确性。如果特征之间非常不独立怎么办?如果真是非常不独立的话,那就尽量不要使用朴素贝叶斯模型,而考
虑使用其他的分类方法比较好。但是一般情况下,样本的特征之间独立这个条件的确是弱成立的,尤其是数据量非常大的时候。虽然牺牲了准确性,但是模型的条件分布的计算大大简化了,这就是贝叶斯模型的选择。
最后回到我们要解决的问题,我们的问题是给定测试集的一个新样本特征(X1(test),X2(test),…,Xn(test)),我们如何判断它属于哪个类型?
既然是贝叶斯模型,当然是用后验概率最大化来判断分类了。只要计算出所有的k个条件概率P(Y=Ck|X=X(test)),然后找出最大的条件概率对应的类别,这就是朴素贝叶斯的预测了。
推导过程
我们预测的类别Cresult是使P(Y=Ck|X=X(test))最大化的类别,数学表达式为:
由于对于所有的类别计算P(Y=Ck|X=X(test))时,上式的分母是一样的,都是P(X=X(test)) ,因此,预测公式可以简化为:
接着,利用朴素贝叶斯的独立性假设,就可以得到通常意义上的朴素贝叶斯推断公式:
朴素贝叶斯的参数估计
只要求出P(Y=Ck)和P(Xi=Xi(test)|Y=Ck)(i=1,2,…,n),通过
比较就可以得到朴素贝叶斯的推断结果。那么,如何通过训练集计算这两个概率呢?
对于P(Y=Ck),比较简单,通过极大似然估计很容易得到P(Y=Ck)为样本类别Ck出现的概率,即样本类别Ck出现的次数mk除以样本总数m。
对于P(Xi=Xi(test)|Y=Ck)(i=1,2,…,n),取决于先验条件:
(1)如果Xj是离散值,可以假设Xj符合多项式分布,得到P(Xi=Xi(test)|Y=Ck)是在样本类别Ck中,Xi(test)出现的概率。即:
其中mk为样本类别Ck出现的次数,而mkI(test)为类别为Ck的样本中,第i维特征Xi(test)出现的次数。
某些时候,可能某些类别在样本中没有出现,这样可能导致P(Xi=Xi(test)|Y=Ck)为0,这样会影响后验的估计,为解决这种情况,引入了拉普拉斯平滑,即此时有:
其中为一个大于0的常数,常取为1。 O!为第i特征的取值个数。
(2)如果Xi是非常稀疏的离散值,即各个特征出现的概率很低,可以假设Xi符合伯努利分布,即特征Xi出现记为1,不出现记为0。即只要Xi出现即可,不关注Xi的次数。这样得到P(Xi=XI(test)|Y=Ck)是在样本类别Ck中,Xi(test)出现的概率。此时有:
其中,Xi(test)取值为0和1。
(3)如果Xi是连续值,可以有两种方法。
第一种是把连续型变量分成j个箱,把连续型强行变成分类型变量。分箱后,将每个箱中的均值当作一个特征Xi上的取值,然后计算箱j中Y=1所占的比例,就是P(xi|Y=1)。这个过程的主要问题是,箱子不能太大也不能太小,如果箱子太大,就失去了分箱的基本意义,如果箱子太小,可能每个箱子里就没有足够的样本来帮助计算P(xi|Y),因此必须要适当地衡量分箱效果。
但其实,没有必要这样做,因为可以直接通过概率论中来计算连续型变量的概率分布。在分类型变量的情况中,比如掷骰⼦子的情况,有且仅有六种可能的结果1~6,并且每种结果的可能性为1/6。此时每个基本的随机事件发生的概率都是相等的,所以可以使1/N用来表示有N个基本随机事件可以发生的情况。
基于此,来思考一个简单的问题:汉堡王向客户承诺说他们的汉堡⾄至少是100g一个,但如果去汉堡王买个汉堡,可以预料到它肯定不是标准的100g。设汉堡重量为特征Xi,100g就是取值,买到一个汉堡是100g的概率P(100g|Y)是多少呢?如果买n个汉堡,很可能n个汉堡都不一样重,只要称重足够精确,100.000001g和100.00002gi就可以是不一致的。这种情况下,买无限个汉堡,可能得到无限个重量,有无限个基本随机事件的发生,所以有:
P(100g|Y) = = 0
即买到的汉堡刚好是100g概率为0。当⼀一个特征下有无数种可能发生的事件时,这个特征的取值就是连续型的,比如现在的特征“汉堡的重量”。从上面的例子可以看得出,当特征为连续型时,随机取到某一个事件发生的概率就为0。
换一个问题,随机买一个汉堡,汉堡的重量量在98g~102g之间的概率是多少?
求解概率P(98g<x<102g)。随机购买100个汉堡,称重后记下所有重量在98g~102g之间的汉堡个数,假设为m,则有:
P(98g<x<102g)=m/100
如果基于100个汉堡绘制直方图,并规定每4g为一个区间,横坐标为汉堡的重量分布,纵坐标为区间上汉堡的个数。
可以看到最左边的图。m就是中间的浅绿⾊色区间中所对应的纵坐标轴。则对于概率,可以变换为:
P(98g<x<102g)==
如果我们购买一万个汉堡并绘制直方图(如中间的图),将直方图上的区间缩小,P(98g<x<102g)依然是所有浅绿色区域的面积除以所有柱状图的面积,直方图变得更更加平滑,更像一座山了。假设购买10W个,或者无限个汉堡,则可以想象直方图最终会变成仿佛一条曲线,而汉堡重量的概率P(98g<x<102g)依然是所有浅绿色柱子的面积除以曲线下所有柱状图的总面积。当购买无数个汉堡的时候形成的这条曲线就叫做概率密度曲线(probability density function,PDF)。
一条曲线下的面积,就是这条曲线所代表的函数的积分。如果定义曲线可以用函数f(x)来表示,整条曲线下的面积就是:
其中dx是f(x)在x上的微分。在某些特定的f(x)下,可以证明,上述积分等于1。总面积是1,这说明一个连续型特征X的取值x取到某个区间[ xi, xi+ ]之内的概率,为这个区间上概率密度曲线下的面积,所以特征Xi在区间[ xi, xi+ ]中取值的概率可以表示为:
非常幸运的是,在后验概率的计算过程中,可以将常量抵消掉,然后就可以利用的f(xi)的某种变化来估计P(xi|Y)了。现在,就将求解连续型变量下某个点取值的概率问题,转化成了求解一个函数f(x)在点xi上的取值问题。接下来,只要找到f(x),就可以求解出不同的条件概率了。
在现实中,我们往往假设f(x)是满足某种统计学中的分布的,最常见的就是高斯分布(正态分布,像购买汉堡的例子),常用的还有伯努利分布,多项式分布。这些分布对应着不同的贝叶斯算法,其实他们的本质都是相同的,只不过计算的f(x)不同。每个f(x)都对应着一系列需要去估计的参数,因此在贝叶斯中,fit过程其实是在估计对应分布的参数,predict过程是在该参数下的分布中去进行概率预测。