1、贝叶斯决策论
贝叶斯决策论是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。
假设有N种可能的类别标记,即
γ={c1,c2,...,cN},
λij是将一个真实标记为
ci的样本误分类为
cj所产生的的损失。基于后验概率
P(ci∣x)可获得将样本x分类为
cj所产生的期望损失,即在样本x上的“条件风险”
R(ci∣x)=j=1∑NλijP(cj∣x)我的理解是对于某一个样本,总共可以预测为N种不同的类别,预测为每种类别的概率为
P(cn∣x),其中只有一种类别为正确的类别,其余的N-1种为错误预测。期望损失就是求损失的平均,也就是预测错误的代价,现在知道预测错误的每一种代价为
λij和对应的预测错误的概率
P(cj∣x),这样就可以得到期望损失。
我们的任务是寻找一个判定准则
h:χ→γ以最小化总体风险:
R(h)=Ex[R(h(x)∣x)]显然,对每个样本x,若h能最小化条件风险
R(h(x)∣x),则总体风险
R(h)也将被最小化,这就产生了贝叶斯判定准则:为最小化总体风险,只需在每个样本上选择能使条件风险
R(c∣x)最小的类别标记,即:
h∗(x)=argminc∈γR(c∣x)此时,
h∗称为贝叶斯最优分类器,与之对应的总体风险
R(h∗)称为贝叶斯风险。
与之对应,
1−R(h∗)反映了分类器所能达到的最好性能,即通过机器学习所能产生的模型精度的理论上限。
具体来说,若目标是最小化分类错误,则误判损失
λij可写为:
λij={0,if i=j1,otherwise此时条件风险为
R(c∣x)=1−P(c∣x)公式中的
P(c∣x)是x被正确预测的概率,当正确预测的概率越大,则风险越小,也就是损失越小。
于是最小化分类错误率的贝叶斯最优分类器为
h∗(x)=argmaxc∈λP(c∣x)即对每个样本x,选择能使后验概率
P(c∣x)最大的类别标记。
要使用贝叶斯判定准则来最小化决策风险,首先要获得后验概率
P(c∣x),这在现实人物中通常很难直接获得。从这个角度看,机器学习所要实现的是基于有限的训练样本尽可能准确地评估出后验概率
P(c∣x)。
大体上来讲,主要有两种策略:
- 给定x,可通过直接建模
P(c∣x)来预测c,这样得到的是“判别式模型”;
- 先对联合概率分布
P(x,c)建模,然后再由此获得
P(c∣x),这样得到的是“生成式模型”;
对生成式模型来说,必然考虑:
P(c∣x)=P(x)P(x,c)基于贝叶斯定理,
P(c∣x)可写为
P(c∣x)=P(x)P(c)P(x∣c)其中,
P(c)是类先验概率,
P(x∣c)是样本x相对于类标记c的类条件概率,或称为似然,
P(x)是用于归一化的证据因子。
对于给定样本x,证据因子
P(x)与类标记无关,因此估计P(c|x)的问题就转化为如何基于训练数据D来估计先验
P(c)和似然
P(x∣c)。
类先验概率
P(c)表达了样本空间中各类样本所占的比例,根据大数定律,当训练样本包含充足的独立同分布样本时,
P(c)可通过各类样本出现的频率来进行估计。
对于类条件概率
P(x∣c)来说,由于它涉及关于x所有属性的联合概率,直接根据样本出现的概率来估计将会遭到严重的困难。例如,假设样本的d个属性都是二值的,则样本空间将有
2d种可能的取值。在现实应用中,这个值往往远大于训练样本数m,也就是说,很多样本取值在训练集中根本没有出现,直接使用频率来估计
P(x∣c)显然不可行,因为“未被观测到”与“出现概率为零”通常是不同的。
2、朴素贝叶斯分类器
基于贝叶斯公式来估计后验概率
P(c∣x)的主要困难在于:类条件概率
P(x∣c)是所有属性上的联合概率,难以从有限的训练样本直接估计而得。为避免这个障碍,朴素贝叶斯分类器采用了“属性条件独立性假设”:对于已知类别,假设所有属性相互独立,换言之,假设每种属性独立地对分类结果发生影响。
上面这段话,可以用一个例子说明,假设现在训练数据有3个特征
{x1,x2,x3},每个特征中的类别都为2,那么一共有8种特征组合,当使用传统的贝叶斯公式计算后验概率的时候,需要训练样本中出现这八种训练数据才能有效计算其概率。
但如果是使用朴素贝叶斯概率公式,则只要分别计算
P(x1∣c)和
P(x2∣c)和
P(x3∣c)就可以计算
P(x∣c),不用训练数据中一定要出现特定特征组合的训练样本。
因此,基于属性条件独立性假设,有:
P(c∣x)=P(x)P(c)P(x∣c)=P(x)P(c)i=1∏dP(xi∣c)其中d为属性数目,x_i为x在第i个属性上的取值。由于对所有类别来说
P(x)相同,因此基于上式的贝叶斯判定准则为:
hnb(x)=argmaxc∈γP(c)i=1∏dP(xi∣c)这就是朴素贝叶斯分类器的表达式。
朴素贝叶斯分类器的训练过程就是基于训练集D来估计类先验概率
P(c),并为每个属性估计条件概率
P(xi∣c)。
令
Dc表示训练集D中第c类样本组成的集合,若有充足的独立同分布样本,则可以容易地估计出类先验概率:
P(c)=∣D∣∣Dc∣对于离散属性而言,令
Dc,xi表示
Dc中在第i个属性上取值为
xi的样本组成的集合,则条件概率
P(xi∣c)可估计为
P(xi∣c)=∣Dc∣∣Dc,xi∣对连续属性可考虑概率密度函数,假定
P(xi∣c)∼N(μc,i,σc,i2),其中
μc,i和
σc,i2分别是第c类样本在第i个属性上取值的均值和方差,则有
P(xi∣c)=2π
σc,i1exp(−2σc,i2(xi−μc,i)2)意思就是假设数据符合正态分布,然后使用训练数据中属于c类的数据来获得均值和标准差得到概率密度函数。
2.1 朴素贝叶斯理论基础
朴素贝叶斯模型在对未知类别的样本进行预测时具有几大优点,首先在算法运行过程中简单而高效;其次算法拥有古典概率的理论支撑,分类效率稳定;最后算法对缺失数据和异常数据不太敏感。
同时缺点也是存在的,例如模型的判断结果依赖于先验概率,所以分类结果存在一定的错误率;对输入的自变量X要求具有相同的特征(如变量均为数值型或离散型或0-1型);模型的前提假设在实际应用中很难满足等。
先回顾一下概率论与数理统计中的条件概率和全概率公式:
P(B∣A)=P(A)P(AB)如上等式为条件概率的计算公式,表示在已知事件A的情况下事件B发生的概率,其中
P(AB)表示事件A与事件B同时发生的概率。所以,根据条件概率公式得到概率的乘法公式:
P(AB)=P(A)P(B∣A)全概率公式表示为:
P(A)=i=1∑nP(ABi)=i=1∑nP(Bi)P(A∣Bi)其中事件
B1,B2,...,Bn构成了一个完备的事件组,并且每一个
P(Bi)均大于0。该公式表示,对于任意一个事件A来说,都可以表示成n个完备事件组与其乘积的和。
在具备上述的基础指点之后,来看看贝叶斯公式,贝叶斯公式的核心就是在已知X的情况下,计算样本属于某个类别的概率,故这个条件概率的计算可以表示为:
P(Ci∣X)=P(X)P(CiX)=∑i=1kP(Ci)P(X∣Ci)P(Ci)P(X∣Ci)其中,
Ci表示样本所属的某个类别。假设数据集的因变量y一共包含k个不同的类别。对于上面的条件概率公式而言,样本最终属于哪个类别
Ci,应该将计算所得的最大概率值
P(Ci∣X)对应的类别作为样本的最终分类,所以上式可以表示为:
y=f(X)=P(Ci∣X)=argmax∑i=1kP(Ci)P(X∣Ci)P(Ci)P(X∣Ci)如上公式所示,对于已知的X,朴素贝叶斯分类器就是计算样本在各分类器中的最大概率值。接下来详细拆解公式中的每一个部分,为获得条件概率的最大值,寻找最终的影响因素。
分母
P(X)=∑i=1kP(Ci)P(X∣Ci)是一个常量,它与样本属于哪个类别没有直接关系,所以计算
P(Ci∣X)的最大值就变换成了计算分子的最大值,即
argmaxP(Ci)P(X∣Ci)。如果分子中的
P(Ci)项未知的话,一般会假设每个类别出现的概率相等,只需计算
P(X∣Ci)的最大值,然而在绝大多数情况下,
P(Ci)是已知的,它以训练数据集中类别
Ci的频率作为先验概率,可以表示为
NCi/N。
所以,现在的主要任务是计算
P(X∣Ci)的值,即已知某个类别的情况下自变量X为某种值的概率。假设数据集中一共包含p个自变量,则X可以表示成
(x1,x2,...,xp),进而条件概率
P(X∣Ci)可以表示为
P(X∣Ci)=P(x1,x2,...,xp∣Ci)很显然,条件联合概率值的计算还是比较复杂的,尤其是当数据集的自变量个数非常多的时候。为了使分类器在计算过程中提高速度,提出了一个假设前提,即自变量是条件独立的(自变量之间不存在相关性),所以上面的计算公式可以重新改写为:
P(X∣Ci)=P(x1,x2,...,xp∣Ci)=P(x1∣Ci)P(x2∣Ci)...P(xp∣Ci)如上式所示,将条件联合概率转换成各条件概率的乘积,进而可以大大降低概率值
P(X∣Ci)的运算时长。但问题是,在很多实际项目的数据集中,很难保证自变量之间满足独立的假设条件。根据这条假设,可以得到一般性的结论,即自变量之间的独立性越强,贝叶斯分类器的效果就越好;如果自变量之间存在相关性,就会在一定程度提高贝叶斯分类器的错误率,但通常情况下,贝叶斯分类器的效果不会低于决策树。
3、几种贝叶斯模型
上面提过,朴素贝叶斯网络的自变量X的数据类型可以是连续的数值型,也可以是离散的字符型,或者是仅含有0-1两种值的二元类型。通常会根据不同的数据类型选择不同的贝叶斯分类器。例如高斯贝叶斯分类器、多项式贝叶斯分类器和伯努利贝叶斯分类器。下面将结合案例详细介绍这几种分类器的使用方法。
3.1 高斯贝叶斯分类器(自变量为连续型)
如果数据集中的自变量X均为连续的数值型,则在计算
P(X∣Ci)时会假设自变量X服从高斯正态分布,所以自变量X的条件概率可以表示成:
P(xj∣Ci)=2π
σj,i1exp(−2σj,i2(xj−μj,i)2)其中,
xj表示第j个自变量的取值,
μji为训练数据集中自变量
xj属性属于类别
Ci的均值,
σji为训练数据集中自变量
Xj属于类别
Ci的标准差。所以,在已知均值
μji和标准差
σji时,就可以利用如上的公式计算自变量
xj取某种值的概率。
下面通过一个例子理解高斯贝叶斯分类的计算过程,这里虚拟一个数据集,并通过手工的方式计算某个新样本属于各个类别的概率值。
如下表所示,假设某金融公司是否愿意给客户放贷会优先考虑两个因素,分别是年龄和收入。现在根据已知的数据信息考察一位新客户,他的年龄为24岁,并且收入为8500元,请问该公司是否愿意给客户放贷?
Age |
Income |
Loan |
23 |
8000 |
1 |
27 |
12000 |
1 |
25 |
6000 |
0 |
21 |
6500 |
0 |
32 |
15000 |
1 |
45 |
10000 |
1 |
18 |
4500 |
0 |
22 |
7500 |
1 |
23 |
6000 |
0 |
20 |
6500 |
0 |
手工计算
P(Ci∣X)的步骤如下:
(1)因变量各类别概率:
P(loan=0)=5/10=0.5
P(loan=1)=5/10=0.5
(2)均值:
μage0=21.40
μage1=29.8
μincome0=5900
μincome1=10500
(3)标准差:
σage0=2.42
σage1=8.38
σincome0=734.85
σincome1=2576.81
(4)单变量条件概率:
P(Age=24∣loan=0)=2π
∗2.421exp(−2∗2.422(24−21.4)2)=0.0926
P(Age=24∣loan=1)=2π
∗8.381exp(−2∗8.382(24−29.8)2)=0.0375
P(Income=8500∣loan=0)=2π
∗734.851exp(−2∗734.852(8500−5900)2)=1.0384∗10−6
P(Income=8500∣loan=1)=2π
∗2576.811exp(−2∗2576.812(8500−10500)2)=1.1456−4
(5)贝叶斯后验概率
P(loan=0∣Age=24,Income=8500)=P(loan=0)∗P(Age=24∣loan=0)∗P(Income=8500∣loan=0)=4.8079∗10−8
P(loan=1∣Age=24,Income=8500)=P(loan=1)∗P(Age=24∣loan=1)∗P(Income=8500∣loan=1)=2.1479∗10−6
通过上面的计算可知,当客户的年龄为24岁,并且收入为8500时,被预测为不放贷的概率小于放贷的概率,因此该金融公司决定给客户放贷。
高斯分类器的计算过程是比较简单的,其关键核心是假设数值型变量服从正态分布,如果实际数据近似服从正态分布,分类结果会更加准确。
sklearn模块提供了实现该分类器的计算功能,它就是naive_bayes子模块中的GaussianNB类。首先介绍一下该类的语法和参数函数:
GaussianNB(priors=None)
- priors:用于指定因变量各类别的先验概率,默认以数据集中的类别频率作为先验概率。
由于该类仅包含一个参数,且参数的默认值是以各类别的频率为先验概率,因此在调用GaussianNB类构造高斯贝叶斯分类器时,可以不传递任何参数值。
3.2 多项式贝叶斯分类器(自变量为离散型)
如果数据集中的自变量X均为离散型变量,就无法使用高斯贝叶斯分类器,而应该选择多项式贝叶斯分类器。在计算概率值
P(X∣Ci)时,会假设自变量X的条件概率满足多项式分布,故概率值
P(X∣Ci)的计算公式可以表示为:
P(xj=xjk∣Ci)=Ni+nαNik+α其中,
xjk表示自变量
xj的取值,
Nik表示因变量为类别
Ci时自变量
xj
取
xjk的样本个数;
Ni表示数据集中类别
Ci的样本个数;
α为平滑系数,用于防止概率值取0的可能,通常将该值取值为1,表示对概率值做拉普莱斯平滑;n表示因变量的类别个数。
现在以一个例子进行说明:如下图所示,假设影响女孩是否参加相亲活动的重要因素有三个,分别是男孩的职业、受教育水平和收入状况;如果女孩参加相亲活动,则对应的Meet变量为1,否则为0。请问在给定的信息下,对于高收入的公务员,并且其学历为硕士的男生来说,女孩是否愿意参与他的相亲?接下来通过手动的方式,计算女生是否与该男生见面的概率。
Ocuupation |
Edu |
Income |
Meet |
公务员 |
本科 |
中 |
1 |
公务员 |
本科 |
低 |
1 |
非公务员 |
本科 |
中 |
0 |
非公务员 |
本科 |
高 |
1 |
公务员 |
硕士 |
中 |
1 |
非公务员 |
本科 |
低 |
0 |
公务员 |
本科 |
高 |
1 |
非公务员 |
硕士 |
低 |
0 |
非公务员 |
硕士 |
中 |
0 |
非公务员 |
硕士 |
高 |
1 |
(1)因变量各类别频率
P(Meet=0)=0.4
P(Meet=1)=0.6
(2)单变量条件概率
P(Occupation=公务员∣Meet=0)=1/6
P(Occupation=公务员∣Meet=1)=5/8
P(Edu=硕士∣Meet=0)=3/6
P(Edu=硕士∣Meet=1)=3/8
P(Income=高∣Meet=0)=1/6
P(Income=高∣Meet=1)=4/8
(3)贝叶斯后验概率
P(Meet=0∣Occupation=公务员,Edu=硕士,Income=高)=1/180
P(Meet=1∣Occupation=公务员,Edu=硕士,Income=高)=18/256
因此该女生会选择和男生进行相亲。需要注意的是,如果在某个类别样本中没有出现自变量
xj取某种值的观测时,条件概率
P(xj=xjk∣Ci)就会变为0。例如,当因变量Meet为0时,自变量Occupation中没有取值为公务员的样本,所以就会导致单变量条件概率为0,进而使得
P(Ci)P(X∣Ci)的概率为0。为了避免贝叶斯后验概率为0的情况,就会使用平滑系数
α,这就是为什么自变量X的条件概率写成
P(xj=xjk∣Ci)=Ni+nαNik+α的原因。
多项式贝叶斯分类器的计算过程也同样比较简单,可以使用python中sklearn的子模块naive_bayes模块,然后调用MultinomialNB类。有关该类的语法和参数含义如下:
MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
- alpha:用于指定平滑系数
α的值,默认为1.0。
- fit_prior:bool类型参数,是否以数据集中各类别的比例作为
P(Ci)的先验概率,默认为True。
- class_prior:用于人工指定各类别的先验概率
P(Ci),如果指定该参数,则参数fit_prior不再有效。
3.3 伯努利贝叶斯分类器
当数据及中的自变量X均为0-1二元值时(例如在文本挖掘中,判断某个词语是否出现在句子中,出现用1表示,不出现用0表示),通常会优先选择伯努利贝叶斯分类器。利用该分类器计算概率值
P(X∣Ci)时,会假设自变量X的条件满足伯努利分布,故概率值
P(X∣Ci)的计算公式可以表示为:
P(xj∣Ci)=pxj+(1−p)(1−xj)其中,
xj为第j个自变量,取值为0或1;p表示类别为
Ci时自变量取1的概率,该概率值可以使用经验频率代替,即
p=P(Xj=1∣Ci)=Ni+nαNxj+α其中,
Ni表示类别
Ci的样本个数:
Nxj表示在类别为
Ci时,
xj变量取1的样本量;
α为平滑系数,同样是为了避免概率为0而设置的;n是因变量中的类别个数。
举一个通俗提懂的例子,说明伯努利贝叶斯分布器在文本分类中的应用。假设对10条评论数据做分词处理后,得到下面的文档词条矩阵,矩阵中含有5个词语和一个表示情感的结果。其中类别为0表示正面情绪,1表示负面情绪。如果一个用户的评论中仅包含“还行”一词,请问该用户属于哪种情绪?
x_1=推荐 |
x_2=给力 |
x_3=吐槽 |
x_4=还行 |
x_5=太烂 |
类别 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
(1)因变量各类别概率
P(类别=0)=2/5
P(类别=1)=3/5
(2)单变量条件概率
P(x1=0∣类别=0)=1/3
P(x1=0∣类别=1)=5/8
P(x2=0∣类别=0)=1/3
P(x2=0∣类别=1)=5/8
P(x3=0∣类别=0)=5/6
P(x3=0∣类别=1)=1/4
P(x4=1∣类别=0)=1/2
P(x4=1∣类别=1)=1/8
P(x5=0∣类别=0)=5/6
P(x5=0∣类别=1)=1/4
(3)贝叶斯后验概率
P(类别=0∣x1=0,x2=0,x3=0,x4=1,x5=0)=5/324
P(类别=1∣x1=0,x2=0,x3=0,x4=1,x5=0)=3/4096因此根据贝叶斯后验概率最大原则则将该评论预判为正面情绪。
伯努利贝叶斯分类器的计算与多项式贝叶斯分类器的计算非常相似,在文本分类问题中,如果构造的数据集是关于词语出现的次数,通常会选择多项式贝叶斯分类器进行预测;如果构造的数据集是关于词语是否会出现的0-1值,则会选择伯努利贝叶斯分类器进行预测。当需要构造伯努利贝叶斯分类器时,可以直接调用sklearn子模块naive_bayes中的BernoulliNB类。有关该类的语法和参数含义如下:
BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
- alpha:用于指定平滑系数
α,默认为1.0
- binarize:如果该参数为浮点型数据,则将以该值为界限,当自变量的值大于该值时,自变量的值将被转换为1,否则被转换为0;如果该参数为None时,则默认训练数据集的自变量均为0-1值;
- fit_prior:bool类型参数,是否以数据集中各类别的比例作为
P(Ci)的先验概率,默认为True;
- class_prior:用于人工指定各类别的先验概率
P(Ci),如果指定该参数,则参数fit_prior不再有效;
参考资料:机器学习(周志华)、从零开始学Python(数据分析与挖掘)