关注微信号夫子程序社,更多精彩
什么是分类?
对于分类问题,我们并不陌生。日常生活中我们经常有意或无意的进行分类。当一辆保时捷从你面前飞驰而过,你可能会想“车主是个有钱人”;当一部电影是周星驰主演,你可能会想“这是一部搞笑电影”。
我们为什么能进行分类呢?这是因为我们之前已经学习到相关的知识:豪车很贵,周星驰演的大多是搞笑电影。
同理,机器学习中的分类也是一个两步过程:
第一步是建立模型。模型是在带有类别信息数据集上运行特定算法建立的,这个过程叫做训练(或者学习)。使用的数据集叫做训练集。
第二步是使用模型进行分类。
训练集是由一组样例构成。一个样例可以形式化的表示为(x, c),其中x为样本特征,是一个d维向量,可表示为(x1,x2,…,xd),每个维度代表一个属性。c为样本特征对应的分类,我们用C表示所有可能分类的集合。每个样本特征x是关于某个事件或对象的描述。例如样例“((症状=头痛; 职业=建筑工人),脑震荡)”中,样本特征“(症状=头痛; 职业=建筑工人)”是对一个病人的描述,“脑震荡”是类别,表示一类疾病。
贝叶斯分类
根据贝叶斯定理,对一个分类问题,给定样本特征x,它属于类别c的概率是:
其中,P(c)为类先验(prior)概率;P(x|c) 为样本x相对于类别c的类条件概率,或称为似然(likelihood);P(x)是用于归一化的“证据”(evidence)因子。使用这个公式,对于给定的x,针对所有可能类别计算相应的概率,找到概率最大的类别即可。因此,贝叶斯分类器可以表示为:
由于P(x)和类别无关,对于给定的训练集,P(x)对于任何类别都是一样的。换句话说,它对最终的分类结果没有影响。贝叶斯分类器可进一步简化为:
由上面公式可以看出,要使分类器可用,需要估算P(c)和P(x|c),因此训练的过程就是根据训练集估算P(c)和P(x|c)的过程。
对于P(c),根据伯努利大数定律,当训练集中包含充足的独立同分布样本时,可通过类别在训练集中出现的频率来估计。
对于P(x|c),由于它涉及到x所有属性的联合概率,估算比较困难。例如,假设x的每个属性都是二值的,则x有2d个可能的取值。这个值通常情况下要远远大于训练集的大小,会导致一些值在训练集中没有出现。直接使用频率来估算是不可行的,因为“没被观测到”和“出现概率为零”通常是不一样的。估算P(x|c)有若干策略,由此可以产生出不同的贝叶斯分类器,这里不一一介绍。下面仅介绍朴素贝叶斯分类器。
朴素贝叶斯分类
为了解决P(x|c)的估算问题,朴素贝叶斯分类使用了属性条件独立性假设。该假设认为:对于已知类别,假设所有属性相互独立。换言之,假设每个属性独立地对分类结果发生影响。基于此假设,P(x|c)可以表示为:
替换原先贝叶斯分类器中的P(x|c)就得到朴素贝叶斯分类器:
至此,问题就变成了如何估算P(c)和P(xi|c)。
令Dc表示训练集D中c类样本组成的集合,若有充足的独立同分布样本,则P(c)可用如下公式估算:
若是离散属性,令表示Dc中在第i个属性上取值为xi的样本组成的集合,则P(xi|c)可用下面公式估算:
若是连续属性,有两类处理方法。一类是把连续属性离散化。例如属性“体重”的取值范围是 [1,400],可以拆分为20个等长的区间[1,20), [20,40),…,[380,400];另一类是假设连续属性服从某种分布,然后根据训练集来估计分布中的参数。比如假设P(xi|c)服从高斯分布,其中和分别是第c类样本在在第i个属性上取值的均值和方差,则P(xi|c) 可用下面公式估算:
实例
这个例子中,我们使用朴素贝叶斯分类器来预测用户是否可能拖欠银行贷款。下面的表格是训练集:
为了计算方便,我们对上面数据进行初步统计。属性“有房”、“婚姻”的值是离散的,只计数即可。“年收入”是离散的,需要计算样本均值和样本方差。统计表如下:
举个例子说明均值和方差的计算,样本均值90和样本方差25(注意计算时分母是2,不是3)是这样算出来的:
(85+90+95)/3=90
((85-90)2+(90-90)2+(95-90)2)/(3-1)=25
由上表结合公式可以计算出如下概率:
P(Yes)=3/10=0.3;
P(No)=7/10=0.7
P(有房=是|No) = 3/7
P(有房=否|No) = 4/7
P(婚姻=单身|No) = 2/7
P(婚姻=已婚|No) = 4/7
P(婚姻=离婚|No) = 1/7
P(有房=是|Yes) = 0/3=0
P(有房=否|Yes) = 3/3=1
P(婚姻=单身|Yes) = 2/3
P(婚姻=已婚|Yes) = 0
P(婚姻=离婚|Yes) = 1/3
假设有新样本x=(有房=否,婚姻=已婚,年收入=120)
P(No|x)=P(No)*P(有房=否|No)*P(婚姻=已婚|No)*P(年收入=120K|No)=0.7*4/7*4/7*0.0072=0.0024
P(Yes|x)=P(Yes)*P(有房=否|Yes)*P(婚姻=已婚|Yes)*P(年收入=120K|Yes)=0.3*1*0*1.2*10-9=0
由于0.0024大于0,所以x分类为No。
聪明的读者可能已经发现,上面的概率中P(有房=是|Yes) 和P(婚姻=已婚|Yes)均为0。因此,不管其它概率为多少,相乘之后结果总为0。这就意味着,有房的人或者已婚的人,拖欠贷款的概率为0,哪怕这个人没有收入。这显然不合理。为了避免这种情况,在估算概率时需要进行“平滑”。常用“拉普拉斯修正”。令N表示可能的类别数,Ni表示第i个属性可能的取值数,则P(c)和P(xi|c)和估算修正为:
具体计算这里不再讲解,读者可以自行尝试。
总结
-
本文简单介绍了分类的概念,贝叶斯分类器、朴素贝叶斯分类器,并通过一个例子演示了计算过程。
-
朴素贝叶斯分类器的优点是逻辑简单,易于实现,在许多领域被证明了有较好的效果。
-
朴素贝叶斯分类器参数估算过程中使用到一些假设,一旦这些假设不成立,分类结果会变的较差。
-
本文并未对参数估算过程中其它可行的假设进行介绍,有兴趣的读者可以通过其它资料进行研究。
—————END—————
扫描关注夫子程序社,更多精彩