贝叶斯分类器(10X单细胞和10X空间转录组的基础算法)
贝叶斯分类器,即是以贝叶斯决策理论为基础的分类器,什么是贝叶斯决策理论呢?
贝叶斯决策论
1 统计推断中的贝叶斯学派和频率学派
贝叶斯决策论是贝叶斯学派关于统计推断(根据已有资料或者说数据,对未知问题作出判断)的理论,要理解贝叶斯理论,就不得不和他的 “老对手”——频率学派(经典学派)一起聊。
首先我们看看统计推断的问题是什么。statistical inference 是学统计的目的,即根据样本数据,对总体进行统计推断(假设检验 或 预测).是指统计学中研究如何根据样本数据去推断总体数量特征的方法。统计推断主要可以分为两大类:一类是参数估计问题;另一类是假设检验问题。
image关于这些问题,从20世纪上半页至今,频率学派和贝叶斯学派两大学派一直在辩论,也一直互相不服。贝叶斯学派的发展在二十世纪滞后于频率学派,所以我们在学校教材上学到的统计推断的方法基本上都是频率学派的,比如最大似然估计、卡方检验、T检验、矩估计等等。
两个学派争论的点是什么呢?
-
频率学派 认为频率即概率,我们所看到的样本只是无数可能的试验结果的一部分展现,样本中未出现的结果不是不可能出现,只是这次抽样没有出现而已,综合考虑我们看到的和没看到的全部可能的结果,总体分布F(X,θ)是确定的,因此其中参数θ也是确定的,按我的理解,频率学派是忽略我们观察者,而从事件本身出发,希望以纯粹的客观事实来描述事件。所以我们看像极大似然估计、区间估计等方法,都是希望尽可能的找到那个未知的、确定的参数。
-
贝叶斯学派 认为概率是反映事件发生可能性的一个度量,并且不认为样本X是无数可能中的一部分,既然样本X出现了,那么就只能依靠事件X去做判断,我们不知道是什么分布生成了这些样本,所以什么分布都有可能,因此其中参数θ是不确定的,只是不同的θ的概率不同,而且应该是服从一个分布H(θ)的,而H(θ)为“先验分布”(指抽样之前得到的分布),这是贝叶斯学派引入的主观概率的概念(主观概率是根据对事件的周密观察所得到的先验知识,并不是唯心主义的),这里的“验”就是这些样本X的作用,H(θ)经过真实样本的“验”之后,就得到了“后验概率”H(θ|X)(后验概率是条件概率的形式,但不可以理解为这个形式的就是后验概率,重点要看有没有后验概率的思想)。因此我们可以理解为贝叶斯学派没有忽略观察者的作用,在做判断时需要不仅要考虑抽样信息,也要考虑观察者对事件的先验知识,同时还引入了各种推断结果所带来的损失,显然这与频率学派的出发点是不同的,从拉普拉斯所说的Probability theory is nothing but common sense reduced to calculation也可窥一二。
现在应该对贝叶斯学派的思想有了一点认识了。那我们看看在分类问题上贝叶斯分类器是怎么一回事呢?
2 贝叶斯分类器
2.1 贝叶斯分类器概述
贝叶斯分类器是一类分类算法的总称,贝叶斯定理是这类算法的核心,因此统称为贝叶斯分类。
在分类问题中,我们可以根据样本x计算出在样本中各个类别c出现的概率,即后验概率P(c|x),根据之前对贝叶斯统计推断的介绍,还需要引入各种推断结果所带来的损失,我们定义λi,j为将cj误分为ci时所产生的损失,根据误判出现的概率和导致的损失,可以计算出错误分类是产生的期望损失,称之为“风险”:
设想我们制定了一个判定准则h来对x进行分类得到h(x),如果每个分类结果h(x)
都是风险最小的结果,那个总体的风险R(h)也是最小的,这就是贝叶斯判定准则,称h为贝叶斯最优分类器。
image
贝叶斯最优分类器为:
image
后验概率最大化与风险最小化:对于二分类问题,λ要么等于0要么等于1
image当i = i,即正确分类时,λii = 0,所以可以计算此时所以条件风险(该条件下的风险)为
即
image
P(c|x)就是根据样本x进行分类,想想以前讲过的KNN、LR等,所做的不就是这个工作吗,这种直接对P(c|x)进行建模来预测c的方法,都叫做判别式模型(Discriminative Model),判别式模型不考虑样本的产生模型,直接研究预测模型。如果我们换一种思路,先得到联合分布P(c,x),再得到后验概率P(c|x),这就是生成式模型(Generative Model),顾名思义,生成式模型会研究样本的产生模型,判别式模型和生成式模型都是监督学习中的概念。
显然生成模型比判别模型包含更多的信息,可以做到更多的事,实际上由生成模型可以得到判别模型,但由判别模型得不到生成模型,贝叶斯分类器就是从生成模型的角度来解决分类问题,怎么实现呢?
image.pngP(c)是类“先验”(prior)概率;P(c|x)是样本x相对于类标记c的类条件概率(class-conditional probability);P(c|x)是用于归一化的“证据”(evidence)因子。
2.2 求解方法
类先验概率P(c)表达了样本空间中各类样本所占的比例,根据大数定律,当训练集包含充足的独立同分布样本时,P(c)可通过各类样本出现的频率来进行估计.P(x)看起来是样本出现的概率,对给定样本x,从形式上也可以看出与样本的类标记无关,因此估计P(c|x)的问题就转化为如何基于训练数据D来估计先验P(c)和P(x|c)的问题,所以问题的重点就是怎么求P(x|c),得到P(x|c)
就能得到联合概率P(x,c),也能能得到一个贝叶斯分类器了。那么怎么完成呢?能直接通过样本中的频率来统计吗?
对P(x|c)来说,由于它涉及关于x 所有属性的联合概率,直接根据样本出现的频率来估计将会遇到严重的困难,例如,假设样本的 d 个属性都是二值的,则样本空间将有2d种可能的取值,在现实应用中,这个值往往远大于训练样本数m,也就是说,很多样本取值在训练集中根本没有出现,直接使用频率来估计P(x|c)显然不可行,因为"未被观测到"与"出现概率为零"通常是不同的。
那应该怎么计算呢?先说第一种方法:最大似然估计。
要求得类条件概率P(x|c),如果我们什么信息都没有肯定是不行的,所以一般假设我们知道它的概率分布,然后用一定方法来求出分布的参数即可。对于求分布的参数,一般使用最大似然估计MLE,虽然MLE是频率学派的估计方法,不过好用的东西大家一起用嘛,贝叶斯学派有个差不多的估计方法:最大后验估计MAP,不过MAP比MLE多了个作为因子的先验概率P(θ),更复杂一些,这些内容咱们下回再讲。
说回最大似然估计,说到最大似然估计就不得不问一句,什么是似然?这里需要好好的说道说道,只有搞清楚似然的概念才能理解怎么计算它。
2.3 似然
2.3.1 似然、似然与概率的区别和联系
极大似然是频率学派的参数估计方法,似然即参数的似然,是由频率学派建立的、极大似然估计中的重要概念。从前文可知,频率学派认为参数是确定值,参数的似然就表达了给定样本x下某参数为这个确定值的可能性。在计算上,参数的似然值等于在该参数下事件发生的概率L(θ|x) = P(X = x|θ)。也就是说,似然值可以用概率来计算,但似然却不是概率,因为频率学派的体系下,参数不是随机变量,故似然不是概率,概率是在确定参数的情况下,观测结果发生的可能性,概率的对象是概率空间中的事件,而似然的对象是参数。
因此,似然函数定义为:似然函数L(θ|x)是给定样本x时,关于参数θ的函数,其在数值上等于给定参数θ后变量X的概率
-
如果x
是离散型随机变量时f(x;θ)是概率分布,f(x;θ) = Pθ(x)
-
如果x
是连续型随机变量时f(x;θ)是概率密度,此时在x (一个样本点)处f(x;θ) = 0
image.png ,这也是概率的一个基本性质,而似然是不满足这一点的, image.png 并不为1,比如两个不均匀的硬币,正面的概率未知作为θ,给定x为观察到一次正面,θ=0.6时P = 0.6,θ=0.8时P = 0.8,显然加和大于1,其实甚至可以说这样相加是没有意义的,因为θ
(那给定这一个点的θ的似然也是0,是不是可以理解为根据这点信息判断出θ是否为真值的可能性太低),此时应该给定一段x区间来积分得到似然值。
值得注意的是,因为θ不是随机变量,所以各个θ所对应的似然值是不能做累加的,我们都知道:
只是似然函数的自变量,并不是概率空间里的取值。这也从一方面说明似然是不满足概率定理(柯尔莫果洛夫公理)的三个条件的,似然并不是概率。
2.3.2 一个例子
关于似然,知乎上还有一个很形象的例子,他山之石,可以借鉴一下,如何理解似然函数?HiTao的回答
其中的核心观点是:似然和概率两个函数有着不同的名字,却源于同一个函数。P(x|θ)是一个有着两个变量的函数。如果,你将θ设为常量,则你会得到一个概率函数(关于x的函数);如果,你将x设为常量你将得到似然函数(关于θ的函数)。
举一个例子:
有一个硬币,它有θ的概率会正面向上,有1-θ的概率反面向上。现有正反序列:
image.png
比如,如果θ=0,则得到这个序列的概率值为0。如果θ=1/2,概率值为1/1024。尝试所有θ
可取的值,画出了下图,即为似然函数的函数图像:
image
可以看出θ=0.7时的似然值最大,即0.7是最可能是真值的参数值,这就是最大似然估计的思想了。
2.4 回到贝叶斯分类
现在应该对似然有了一定的了解了,我们回忆一下贝叶斯分类器说到哪了,对:
我们的目标是用最大似然估计计算得到P(x|c),得到联合分布.
1 极大似然估计
1.1 极大似然估计的步骤
我们已经知道,似然即参数的似然,表示给定样本下,参数θ为真值的可能性,所以,极大似然估计就是以最大化参数的似然值的方法来估计参数的真值的算法。
极大似然函数估计值的一般步骤:
假设概率服从某种确定的概率分布(或者分布已知);
- 写出似然函数: image.png
对似然函数取对数,并整理;
求导数;
解似然方程,得到极大似然的参数;
对于一批样本,共有M个属性值和N个类别,那么x就是一个M维向量,要求得[图片上传中...(image-e088df-1618739940424-51)],其实就是要求
image.png ,因为对不同的类别c,类条件概率P(c|x)应该是不同的分布,所以应该有N个不同的分布假设和似然函数。我们按极大似然估计的步骤来看看怎样计算P(c|x)- 假设分布:假设P(c|x)具有确定的形式并且被参数向量θc唯一确定,则我们的任务就是利用训练集D估计参数θc。我们将假设的P(c|x)分布记为P(x,θc)
-
似然函数,取对数:Dc表示训练集D中第c类样本组成的集合,假设这些样本是独立同分布的,则参数θc对于数据集Dc**的似然函数是:
image.png
取对数得到对数似然函数,连乘转换为累加,求导之类的计算更加方便:
image.png
-
求导数:当似然函数取得极大值时,自变量θc的导数应该为0,所以可以得到针对参数向量θc中每个参数θi
求偏导之后的方程组:
image.png
- 解似然方程:求解方程组得到参数向量θc,确定P(x|c)所假设的分布,根据x的取值 image.png 得到其概率。
注意:
- 当属性值的个数M=1时,属于假设的分布是单个属性的分布,还比较好计算;
- 当属性值的个数M>1时,多个属性的分布是多维随机变量分布,需要计算其多个属性的联合分布概率,这个计算方法是比较困难的。
1.2 从散度的角度解读极大似然估计
知乎上大神详细介绍了从散度的角度解读极大似然估计:知乎 - 微调的回答,跟随大神的脚步学习一下(原回答了引入了期望,我觉得其实不用期望也没问题):
MLE的第一步是假设分布(或者已有一个分布),接下来就是通过最大化X发生的概率来求得分布参数,认为这就是最可能真实的分布,这个思路其实还是有一点绕的,凭什么说X发生的概率最大的参数就是真的参数呢?我们的目的是求出真实分布,最直观的思路应该是看我们算出来的分布跟真实分布的相似程度,这刚好可以通过散度来解释。
这里的散度是机器学习的散度,也就是信息论中的散度,与物理上的散度不太一样。机器学习中我们常用的散度是KL散度(KL-Divergence)。信息论中,KL(P||Q)可以理解为:用来衡量在同一份数据P下,使用P的编码方案和Q的编码方案的平均编码长度的差异,如果我们把真实的分布Pθ和计算得到的分布
image.png
注意上面两个分布的顺序是不能变的,因为定义中的P必须是真实分布,数据就是由P产生的。我们的目标是人是让KL(P||Q)最小,注意到式中 image.png 是定值,所以:
image.png
看上面的推导,再看看极大似然的公式:
image.png
image.png
是不是根本就是一样的?所以其实如果我们正向考虑极大似然估计,当模型是条件概率分布,损失函数是对数损失函数时,极大似然估计就是做经验风险最小化;如果我们反过来考虑,即上面从散度推导的过程,MLE就是在寻找最接近真实分布的分布。
1.3 极大似然估计实例
以上一篇提到的西瓜好坏分类为例:
西瓜数据集如下图:
显然样本共有M=6个属性值和N=2个类别,首先根据样本估计类先验概率P(好瓜)=8/17 = 0.47,P(坏瓜)=9/17 = 0.53,然后为每个属性估计条件概率P(x|c),要求P(x|c)
,应该假设两个六维概率分布,比如我们假设样本为6元正态分布:
image.png
均值向量 image.png
为6维向量,协方差矩阵 image.png
是一个6*6的正定矩阵。
然后分别写出似然函数的对数形式:
image.png
image.png
最后再求偏导解方程即可,多元正态分布求导计算还是挺复杂的,本篇主要讲极大似然估计,具体计算过程就不写了,大家明白是怎么做的就好。
讲完了极大似然估计的理论和操作,再来看看它和一个跟它很像的算法最大后验估计MAP的关系。
2 MLE和MAP的区别和联系
极大似然估计MLE是频率学派的参数估计方法,最大后验估计MAP是贝叶斯学派的参数估计方法。因此,同样是参数估计的问题,MLE中参数是确定值,故定义为P(x,θ);MAP中参数是一个随机变量,故定义为
P(θ|c),是一个后验概率,受到先验P(c)和样本x的共同作用,这就是他们最本质的区别了,由此可得到其计算过程的区别:极大似然估计MLE对参数θ的估计是:
最大后验估计MAP对参数θ的估计是: image
我们发现原来MAP与MLE在计算上的不同就是多了一个先验概率项,因此如果有一个合理的先验的话,MAP会比MLE对样本数据的依赖更小一些,如果数据量很大的话他们基本就是一样的了,以我们上一篇中的抛硬币例子来说:
有一个硬币,它有θ的概率会正面向上,有1-θ
image.png
的概率反面向上。现有正反序列:x=HHTTHTHHHH 。无论θ的值是多少,这个序列的概率值为
如果按极大似然估计计算,取对数求导后计算得到θ=0.7,这似乎不太符合我们的常识,如果是用MAP呢?对抛硬币问题,我们先验是
image.png(注意MAP中的θ=0.7是随机变量,先验是一个分布,不能是一个数值哦,如果给一个数值的话,样本就不起作用了),因此:
image.png
正态分布的概率密度函数:
image
因此:
image.png
在MAP中使用一个高斯分布的先验的效果就类似于在MLE中采用L2正则(Seurat分析的时候也有),相当于结构风险最小化,可以说,当模型是条件概率分布、损失函数是对数损失函数、模型复杂度由模型的先验概率表示时,结构风险最小化就等价于最大后验估计。
回到θ的计算上来, image.png 进行取对数、求导,可得θ=0.558,结果受到了先验和样本共同的作用。
显然MAP的计算要麻烦的多,现实中很多问题都要比我们的例子复杂的多,其求解通常不会像我们的例子这样求导计算。
总结一下:
- MLE是频率学派的参数估计方法,MAP是贝叶斯学派的参数估计方法,基本思想不同;
- MLE是一种经验风险最小化,MAP是一种结构风险最小化;
- 在计算上,MAP比MLE多了一个先验概率项,随着数据量的增加,先验的影响力会越来越小;
- MAP对先验的假设比较依赖,需要有好的先验假设。
3 极大似然估计求解P(x|c)总结
我们将贝叶斯分类器转化为了求解P(x|c)的问题,使用极大似然估计是我们介绍的第一个求解方法,它还存在一些不足:
- 对P(x|c)分布的假设强依赖,所假设的概率分布形式需要符合潜在的真实数据分布,这个比较难;
- 对于多个属性值的样本,使用极大似然估计计算比较困难。
求解P(x|c)问题的另一个方法:朴素贝叶斯。
根据贝叶斯分类器(1)贝叶斯决策论概述、贝叶斯和频率、概率和似然,我们对贝叶斯分类器所要解决的问题、问题的求解方法做了概述,将贝叶斯分类问题转化成了求解P(x|c)的问题,上面我们分析了第一个求解方法:极大似然估计。这里我们来介绍一个更加简单的P(x|c)求解方法,并在此基础上讲讲常用的一个贝叶斯分类器的实现:朴素贝叶斯分类器(Naive Bayes classifier)。
1 朴素贝叶斯分类原理
1.1 分类问题回顾
我们的目标是通过对样本的学习来得到一个分类器,以此来对未知数据进行分类,即求后验概率P(x|c)
。在[贝叶斯分类器(1)贝叶斯决策论概述、贝叶斯和频率、概率和似然】(https://www.jianshu.com/p/88b6ada7fa0e)中,我们描述了贝叶斯分类器是以生成式模型的思路来处理这个问题的,如下面的公式所示,贝叶斯分类器通过求得联合概率P(x,c)来计算P(x|c),并将联合概率P(x,c)转化成了计算类先验概率P(c)、类条件概P(x|c)、证据因子P(x)。
其中的难点是类条件概率P(x|c)的计算,因为样本x本身就是其所有属性的联合概率,各种属性随意组合,变幻莫测,要计算其中某一种组合出现的概率真的是太难了,而朴素贝叶斯的出现就是为了解决这个问题的。
要想计算联合概率P(a,b),我们肯定是希望事件a与事件b是相互独立的,可以简单粗暴的 image.png ,多想对着流星许下心愿:让世界上复杂的联合概率都变成简单的连乘!
1.2 朴素贝叶斯
朴素贝叶斯实现了我们的梦想!朴素贝叶斯中的朴素就是对多属性的联合分布做了一个大胆的假设,即x
的n个维度之间相互独立:
朴素贝叶斯通过这一假设大大简化了P(x|c)的计算,当然,使用这个假设是有代价的,一般情况下,大量样本的特征之间独立这个条件是弱成立的,毕竟哲学上说联系是普遍的,所以我们使用朴素贝叶斯会降低一些准确性;如果实际问题中的事件的各个属性非常不独立的话,甚至是无法使用朴素贝叶斯的。总的来说,朴素贝叶斯大大简化了计算,同时牺牲了一些结果的准确性,具体要不要使用、怎么使用就看我们在实际问题中的权衡了。
在朴素贝叶斯的思想下再看回分类问题,事件x有m个属性,可将分类问题按下式转化:
image
只需要计算出上式不同类别c下的值,令值最大的类别c<xub>i即为分类结果。其中,根据大数定律, image.png ,!](https://img.haomeiwen.com/i18814178/3d55b2af6ab486c1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)是类别c下的后验概率,其计算要取决于先验c,这里需要分为X是离散或连续两种情况:
1.2.1 特征/属性是离散型随机变量
-
1)先验服从多项式分布:假设x的特征取值服从多项式分布,那么同样根据大数定律,可通过频率来计算P(xi|c)
image.png
Nc为样本中类别为c的频数,Nci*为类别为c的样本中,第i个属性中i*出现的频数。
不过有些出现的概率比较低的属性,在我们的样本中不一定会出现,即频数为0,如果不作处理的话会导致其P(xi|c)为0,会导致包含这个属性的样本永远都不会被分类到类别c,而现实不一定是这样,因此我们需要对没出现的情况做平滑处理,比如常见的拉普拉斯平滑,给分子i*的频数加上一个定值λ,而分母加上a * λ,,表示为第i个属性中的每一种取值的频数都加定值λ:
image.png
举例:垃圾邮件判断
朴素贝叶斯分类在垃圾邮件的判断上有不错的实践效果,这是一个二分类问题,
image.png
现在收到一封邮件包含一些关键词:【中奖,笔记本电脑,特朗普,大选,...】,根据大量的数据可以统计出这些词出现的频数,除以类别中所有词的总频数得到其出现的后验概率,在垃圾邮件中:
1.png
c = c0时的值是c = c1时值的26倍,所以判断此邮件是垃圾邮件。
我们判断西瓜好坏的问题也可以转化成离散型随机变量的分类问题,过程与上面类似。
-
2)先验服从伯努利分布:在x的属性是离散型随机变量的分类问题中,如果一个属性只关注其出现或者不出现,而不关注其在一个样本内出现的次数,也就是其取值只有0和1,那么我们可以假设这个属性是服从伯努利分布的(注意:不要求属性为伯努利分布,只要业务需要,我们可以把它变成伯努利分布,比如对于销量,我们让小于100的都是0,大于100的为1)。其后验概率的计算为:
image.png
比如垃圾邮件的例子,在多项式朴素贝叶斯中:
image.png
如果我们只关心“中奖”出现与否,不管词频,则在伯努利朴素贝叶斯中:
image.png
1.2.2 特征/属性是连续型随机变量
-
连续变量离散化,使用多项式分布或伯努利分布:当x的属性是连续型随机变量时,如果我们对取值的业务理解较好,一些情况下可以选择将连续变量离散化,比如在一个商品的分类中,我们根据业务理解把低于100块的映射到“便宜”,100到200块的映射到“一般”,高于100块的映射到“好贵”,这样就可以转化为离散变量的问题,这是比较简单的处理方式,不过对业务理解的要求比较高,而且要求样本的量不能太少,要保证每个区间有一定的样本量。
-
假设x** 的连续型属性服从某种分布,比如正态分布:** P(xi|c)服从正态分布,其中参数μ通过类别为c的所有样本中属性xi的各种取值的平均得到,参数σ同理,通过样本的标准差得到,以此概率密度函数来计算P(xi=xi*|c)。
image
举例:性别判断
下面是一组人类身体特征的统计资料。
有人身高6英尺、体重130磅,脚掌8英寸,判断此人性别:
各属性为连续变量,假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差。男性的身高是均值5.855、方差0.035的正态分布。所以,例如男性的身高为6英尺的概率的相对值等于1.5789(密度函数的值,并不是概率,只用来反映各个值的相对可能性)。
image分布确定后,就可以计算性别的分类了:
图片.png图片.png
女性的概率比男性要高出将近10000倍,所以判断该人为女性。
1.3 朴素贝叶斯分类的平滑方法
在前文1.2.1小节中我们已经提过平滑处理,主要针对于那些在样本中没有出现过的词,它们的概率是0,导致在分类中完全没有存在感,所以要对这些进行平滑处理。
平滑处理的方法也有很多种,包括我们上面说过的拉普拉斯平滑,除此之外还有古德图灵平滑,线性插值法,回退法(K-Z回退)等,不过这些方法在自然语言处理中比较常用,我们暂时先不多介绍了,还是聚焦在朴素贝叶斯上,下面我们看看朴素贝叶斯在sklearn中的实现。
2 朴素贝叶斯的sklearn实现
sklearn中有3种常用的不同类型的朴素贝叶斯:
- 高斯分布型 (Gaussian NB):用于上面所说的连续型变量的分类问题,假定属性/特征服从正态分布;
- 多项式型 (Multinomial NB):用于离散值模型里。比如我们在1.2.1中的例子;
- 伯努利型 (Bernoulli NB):用于离散值模型里,最后得到的特征只有0(没出现)和1(出现过)。
1)高斯分布型朴素贝叶斯
sklearn.naive_bayes.GaussianNB(*, priors=None, var_smoothing=1e-09)
Parameters
priors:array-like of shape (n_classes,)
类别的先验概率,如果指定,则不再根据数据计算调整
var_smoothing:float, default=1e-9
Portion of the largest variance of all features that is added to variances for calculation stability.(不是很明白)
>> import numpy as np
>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>> Y = np.array([1, 1, 1, 2, 2, 2])
>> from sklearn.naive_bayes import GaussianNB
>> clf = GaussianNB()
>> clf.fit(X, Y)
GaussianNB()
>> print(clf.predict([[-0.8, -1]]))
[1]
>> clf_pf = GaussianNB()
>> clf_pf.partial_fit(X, Y, np.unique(Y)) # 增量训练
GaussianNB()
>> print(clf_pf.predict([[-0.8, -1]]))
[1]
>> clf.predict_proba(np.array([[2,2]])) # 输出概率
array([[2.31952419e-16, 1.00000000e+00]])
>> clf.predict_log_proba(np.array([[2,2]])) # 输出对数概率
array([[-35.99999941, 0. ]])
2)多项式分布型朴素贝叶斯
sklearn.naive_bayes.MultinomialNB(*, alpha=1.0, fit_prior=True, class_prior=None)
Parameters
alpha:float, default=1.0
Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing).
fit_prior:bool, default=True
Whether to learn class prior probabilities or not. If false, a uniform prior will be used.
class_prior:array-like of shape (n_classes,), default=None
Prior probabilities of the classes. If specified the priors are not adjusted according to the data.
其常用函数与高斯型一样。
>> import numpy as np
>> rng = np.random.RandomState(1)
>> X = rng.randint(5, size=(6, 100))
>> y = np.array([1, 2, 3, 4, 5, 6])
>> from sklearn.naive_bayes import MultinomialNB
>> clf = MultinomialNB()
>> clf.fit(X, y)
MultinomialNB()
>> print(clf.predict(X[2:3]))
[3]
3)伯努利分布型朴素贝叶斯
sklearn.naive_bayes.BernoulliNB(*, alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
Parameters
binarize:float or None, default=0.0
Threshold for binarizing (mapping to booleans) of sample features. If None, input is presumed to already consist of binary vectors.(用于设置二值化的阈值)
官方例子与多项式型的基本一样,而且也没有设置binarize,相当于默认使用binarize=0.0,根据源码 sklearn/preprocessing/_data.py
中的binarize(X, *, threshold=0.0, copy=True)函数可以发现,大于binarize的都赋值为1,其他为0。
>> import numpy as np
>> rng = np.random.RandomState(1)
>> X = rng.randint(5, size=(6, 100))
>> Y = np.array([1, 2, 3, 4, 4, 5])
>> from sklearn.naive_bayes import BernoulliNB
>> clf = BernoulliNB()
>> clf.fit(X, Y) # X中各个特征的取值为[0,1,2,3,4],二值化后大于0的都为1
BernoulliNB()
>> print(clf.predict(X[2:3]))
[3]
3 朴素贝叶斯总结
优点
- 朴素贝叶斯算法假设了数据集属性之间是相互独立的,因此算法的逻辑性十分简单,并且算法较为稳定,当数据呈现不同的特点时,朴素贝叶斯的分类性能不会有太大的差异;
- 当数据集属性之间的关系相对比较独立时,朴素贝叶斯分类算法会有较好的效果;
- 数据量要求不大,适合增量式训练,能直接处理多分类;
- 算法简单直观,具有很好的可解释性,可以直接输出概率。
缺点
- 属性独立性的条件也是朴素贝叶斯的不足之处,数据集属性的独立性在很多情况下很难满足;
- 需要知道先验概率,且先验概率很多时候也是取决于假设,故对假设的合理性较为依赖。
可见,朴素贝叶斯的缺点很大程度来来源于其假设太强,对于其假设符合程度较低的问题会损失较多的准确性,因此,如果我们能把假设弱化一下,是不是就能提高朴素贝叶斯的性能呢?需要我们来继续探索。