朴素贝叶斯

来源:互联网 发布:时时彩模拟软件 编辑:程序博客网 时间:2024/06/05 08:42

贝叶斯和朴素的解释

在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(X),要么是条件分布P(Y|X)。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布P(X,Y),然后用P(Y|X)=P(X,Y)/P(X)得出P(Y|X)

什么是贝叶斯?和传统的频率学派不同,贝叶斯学派的思想可以概括为先验概率+数据=后验概率。也就是说我们在实际问题中需要得到的后验概率P(Y|X),可以通过先验概率(P(Y)和X的分布)和数据(根据数据得到参数,即P(X|Y))一起综合得到。数据大家好理解,被频率学派攻击的是先验概率,一般来说先验概率就是我们对于数据所在领域的历史经验,但是这个经验常常难以量化或者模型化,于是贝叶斯学派大胆的假设先验分布的模型,比如正态分布,beta分布等。这个假设一般没有特定的依据,因此一直被频率学派认为很荒谬。虽然难以从严密的数学逻辑里推出贝叶斯学派的逻辑,但是在很多实际应用中,贝叶斯理论很好用,比如垃圾邮件分类,文本分类。

首先根据条件独立公式,如果X和Y相互独立,则有:

P(X,Y)=P(X)P(Y)

条件概率公式:

P(Y|X)=P(X,Y)/P(X)

P(X|Y)=P(X,Y)/P(Y)

或者说:

P(Y|X)=P(X|Y)P(Y)/P(X)

接着看看全概率公式

P(X)=kP(X|Y=Yk)P(Yk)
其中kP(Yk)=1

从上面的公式很容易得出贝叶斯公式:

P(Yk|X)=P(X|Yk)P(Yk)kP(X|Y=Yk)P(Yk)

其中P(Yk|X)是后验概率,给定一个样本,属于第k类的概率。放在kNN,决策树或者SVM中,根据算法可直接求出,成为判别模型。这里利用贝叶斯,首先计算出P(X,Y)联合概率,然后根据全概率公式计算,成为生成模型。如何求P(X,Y),要根据先验概率和数据,估计P(Yk)P(X|Yk)。其中P(Yk)是第k类的概率,可根据类别标签的频率估计。P(X|Yk)则需要进一步分析。

什么是朴素?这一部分主要解决如何简单计算P(X|Yk)。当X只有一个特征时,很好计算,即第k类中X的概率。但是当X的特征个数大于1时,需要计算联合概率P(X1,...Xm|YK),计算量很大,而且很难计算。但是如果将X的各个特征假设为独立,根据条件独立公式,P(X1,...Xm|YK)=P(X1|Yk)...P(Xm|Yk),每一个特征的条件概率计算是很简单的。这样一个独立分布的假设,就是朴素的含义。

所以综上所述,给定一个测试样本(x1,x2,...,xm),计算其属于第k类的概率的公式为:

P(Yk|X=(x1,x2,...,xm))=P(X1=x1|Yk)P(X2=x2|Yk)...P(Xm=xm|Yk)P(Yk)P(X)
——(1)

参数估计

朴素贝叶斯的重点在于如何估计上面等式后面的各个参数。参数主要有两个,P(Yk)P(Xi=xj|Yk)

P(Yk)是第k类的概率,可根据类别标签的频率估计。

P(Yk)=k
—–(2)

P(Xi=xj|Yk)表示第k类中第i个特征等于xj的概率。如何计算这个值,取决于先验条件,X的分布。利用极大似然估计,估计参数。

  1. Xi取值只有0和1,伯努利分布。Xi等于1,表示出现,等于0,表示不出现。P(Xi=xj|Yk)表示在第k类中,第i个特征出现的次数。

    P(Xi=1|Yk)=ki1k

    P(Xi=0|Yk)=ki0k

  2. Xi取离散值,是多项式分布。和第1中情况一样,改变的只有Xi的取值从两个变成多个。

    P(Xi=j|Yk)=kijk

  3. Xi取连续值,是高斯分布。我们通常假设在第k类中,样本的第i个特征服从高斯分布。如果可以确定特征的分布,通过极大似然估计可得到相应的计算公式。在高斯分布的假设下

    P(Xi=a|Yk)=12πσ2kexp((aμk)22σ2k)

    其中μk是第k类中样本第i个特征的均值,σ2k是对应的方差

根据样本的先验分布,计算出每一个特征的P(Xi|Yk)之后,再根据公式(1)计算每一类的概率,取概率最大的类作为该样本的标签。

算法流程

有n个样本,每个样本有m个特征,有K个类别。

训练过程:

根据(2)式计算P(Yk),得到每类的概率,是一个向量

判断样本每个特征的分布,根据不同的分布选择不同的公式计算P(Xi|Yk)

  1. 伯努利分布,只需计算出P(Xi=1|Yk),共K个值。(Xi=0|Yk)=1(Xi=1|Yk)
  2. 多项式分布,需要统计每个特征的取值,然后计算每类下特征不同取值的概率
  3. 高斯分布,只需计算每类下每个特征的均值和方差,然后利用式(3)计算

测试过程

给定一个测试数据,对于每一个特征,确定其值,然后找到训练过程中这个特征对应取值的概率,然后利用式(1)计算每个类别的概率,取概率最大的作为预测的类标签。

注意事项

1、平滑:在估计参数时,当特征服从伯努利分布或多项式分布,计算参数可能得到0,故需要平滑

2、取对数:计算参数后,需要将各个特征的概率相乘。当很多个小数相乘时,对于计算机会下溢,所以可以对特征取对数,然后对数相加,可避免下溢。

3、利用公式(1)计算时,分母可以省略,因为计算所有类别的公式中,分母都一样

4、在文本分类中,需要估计所有训练文本的词袋中每个词的后验概率,可以将这些后验概率存储在哈希表中,需要时取值即可。在二分类中,可以将每个词属于类别1的后验概率和属于类别0的后验概率相除,得到的数字为该词在分类中的重要性,值越大,越重要。此时设置一个阈值,大于该阈值的词汇为关键词。

两个问题

在《统计学习方法》P53有两道课后习题:

  1. 用极大似然估计推出朴素贝叶斯中的条件概率估计公式(特征服从多项式分布)

    P(Y=ck)=Ni=1I(yi=ck)n

    P(x(j)=ajl|Y=ck)=Ni=1I(x(j)i=ajl,yi=ck)Ni=1I(yi=ck)

    参考https://www.zhihu.com/question/33959624/answer/93958363中@幻大米的回答

    P(y=ck)P(x(j)=ajl|y=ck)作为参数

    P(y)=Kk=1P(y=ck)I(y=ck)

    P(x|y=ck)=mj=1P(x(j)|y=ck)=mj=1Sjl=1P(x(j)=ajl|y=ck)I(x(j)=ajl,y=ck)

    其中x(j)表示第j个特征,公有n个特征,ajl是样本第j个特征的第l个取值。

    下面用φ表示参数集合{P(y=ck),P(x(j)=ajl|y=ck)}

    首先写出log似然函数

    l(φ)=logi=1NP(xi,yi;φ)=logi=1NP(xi|yi;φ)P(yi;φ)=log(i=1N(j=1nP(x(j)i|yi;φ))P(yi;φ))=i=1NlogP(yi;φ)+i=1Nj=1nlogP(x(j)i|yi;φ)=i=1Nlogk=1KP(y=ck)I(yi=ck)+i=1Nj=1nlogl=1SjP(x(j)=ajl|y=ck)I(x(j)i=ajl,yi=ck)=i=1Nk=1KI(yi=ck)logP(y=ck)+i=1Nj=1nl=1SjI(x(j)i=ajl,yi=ck)logP(x(j)=ajl|y=ck)

    首先令l(φ)P(y=ck)=0,k=1,2,...,K

    l(φ)P(y=c1)=P(y=c1)i=1Nk=1KI(yi=ck)logP(y=ck)=P(y=c1)i=1N(k=1K1I(yi=ck)logP(y=ck)+I(yi=cK)logP(y=cK))=P(y=c1)i=1N(k=1K1I(yi=ck)logP(y=ck)+I(yi=cK)log(1a=1K1P(y=ca)))=i=1N(I(yi=c1)P(y=c1)I(yi=cK)1K1a=1P(y=ca))=i=1N(I(yi=c1)P(y=c1)I(yi=cK)P(y=cK))=0

    由上式可以得到

    P(y=c1)=Ni=1I(yi=c1)Ni=1I(yi=cK)P(y=cK)

    同理可以得到

    P(y=c1)=Ni=1I(yi=c1)Ni=1I(yi=cK)P(y=cK)...P(y=cK1)=Ni=1I(yi=cK1)Ni=1I(yi=cK)P(y=cK)P(y=cK)=Ni=1I(yi=cK)Ni=1I(yi=cK)P(y=cK)

    将上述K个式子左右分别相加得到

    1=NNi=1I(yi=cK)P(y=cK)

    得到

    P(y=cK)=Ni=1I(yi=cK)N

    将其带入P(y=ck),k=1,2,...,K得到

    P(y=ck)=Ni=1I(yi=ck)N

    P(x(j)=ajl|y=ck)的计算同理

  2. 用贝叶斯估计法推出朴素贝叶斯法的概率估计公式(特征服从多项式分布)

    Pλ(Y=ck)=Ni=1I(yi=ck)+λN+Kλ

    Pλ(x(j)=ajl|Y=ck)=Ni=1I(x(j)i=ajl,yi=ck)+λNi=1I(yi=ck)+Sjλ

    其中λ0,当λ=1时,称为laplace平滑。Sj是第j个特征的取值个数。相当于对参数P(y=ck),P(x(j)=ajl|y=ck)分别加上狄利克雷分布先验分布,是对参数的约束,然后用MAP(最大后验概率估计得到上式?参考http://blog.csdn.net/bumingqiu/article/details/73397812,推理过程?)

极大似然估计和贝叶斯估计

具体参考http://blog.csdn.net/liu1194397014/article/details/52766760

http://www.2cto.com/net/201608/542594.html

极大似然估计与贝叶斯估计是统计中两种对模型的参数确定的方法,两种参数估计方法使用不同的思想。前者来自于频率派,认为参数是固定的,我们要做的事情就是根据已经掌握的数据来估计这个参数;而后者属于贝叶斯派,认为参数也是服从某种概率分布的,已有的数据只是在这种参数的分布下产生的。所以,直观理解上,极大似然估计就是假设一个参数 θ,然后根据数据来求出这个θ. 而贝叶斯估计的难点在于p(θ) 需要人为设定,之后再考虑结合MAP (maximum a posterior)方法来求一个具体的θ.
所以极大似然估计与贝叶斯估计最大的不同就在于是否考虑了参数的先验,而两者适用范围也变成了:极大似然估计适用于数据大量,估计的参数能够较好的反映实际情况;而贝叶斯估计则在数据量较少或者比较稀疏的情况下,考虑先验来提升准确率。

朴素贝叶斯和logistic回归的关系

参考文章T.M. Mitchell, Generative and Discriminative Classifiers: Naive Bayes and Logistic Regression, (2010) Accessed on April 16, 2014

  1. 首先,朴素贝叶斯是生成模型,logistics回归是判别模型。

  2. 朴素贝叶斯中的参数是根据数据直接计算出来的,而logistics中的参数是由优化算法一步一步优化得到的。

  3. 当先验分布,即X的分布是指数分布族中的任何一个分布时都可以推导出logistics回归模型,反之则不成立,logistics回归的先验概率分布不一定是指数分布族中的成员。因而也说明了logistics回归模型更具有鲁棒性。比如当数据呈连续型,假设服从高斯分布,每一维特征XiP(Xi|Y=ck)N(μik,σi),这里的每一维特征的方差和Y无关,和之前定义的稍有不一样。Y服从伯努利分布,则根据朴素贝叶斯得到

    P(Y=1|X)=P(X|Y=1)P(Y=1)P(X|Y=1)P(Y=1)+P(X|Y=0)P(Y=0)=11+P(X|Y=0)P(Y=0)P(X|Y=1)P(Y=1)=11+exp(logP(Y=0)P(Y=1)+mi=1logP(Xi|Y=0)P(Xi|Y=1))

    其中

    logP(Xi|Y=0)P(Xi|Y=1)=log12πσ2iexp((Xiμi0)22σ2i)12πσ2iexp((Xiμi1)22σ2i)=log(exp((Xiμi1)2(Xiμi0)22σ2i))=2Xi(μi0μi1)+μi1μi02σ2i=μi0μi1σ2iXi+μi1μi02σ2i

    P(Y=1)=φ得到

    P(Y=1|X)=11+exp(log1φφ+mi=1μi0μi1σ2iXi+μi1μi02σ2i)=11+exp(w0+mi=1wiXi)

    其中

    w0=log1φφ+i=1mμi1μi02σ2i

    wi=μi0μi1σ2i

    当数据X是连续值,并服从高斯分布时,称作高斯判别分析(GDA)。GDA与logistics是特化和泛化的关系,GDA比logistics有更多的前置设置。当数据大致服从高斯分布时,使用GDA可以达到更好的效果,因为GDA利用了更多的信息构建模型。但是当数据不服从高斯分布时,logistics回归更有效,在更少的假设条件下,得到更好的效果。由此还可以看出,logistics回归的有两种方式,一种是由广义线性模型的方式,一种是从朴素贝叶斯中推导。

小结

朴素贝叶斯算法的主要原理基本已经做了总结,这里对朴素贝叶斯的优缺点做一个总结。

朴素贝叶斯的主要优点有:

  1. 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
  2. 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
  3. 对缺失数据不太敏感,算法也比较简单,常用于文本分类。

朴素贝叶斯的主要缺点有: 

  1. 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
  2. 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
  3. 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
  4. 对输入数据的表达形式很敏感。
  5. 只能用于分类,不能回归

sklearn.naive_bayes

朴素贝叶斯是一类比较简单的算法,scikit-learn中朴素贝叶斯类库的使用也比较简单。相对于决策树,KNN之类的算法,朴素贝叶斯需要关注的参数是比较少的,这样也比较容易掌握。在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。

这三个类适用的分类场景各不相同,一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。

  1. GaussianNB:主要参数仅有一个,即先验概率priors ,对应Y的各个类别的先验概率P(Yk)。这个值默认不给出,如果不给出此时P(Yk)=mkm。其中m为训练集样本总数量,m_k为输出为第k类别的训练集样本数。如果给出的话就以priors 为准。

    在使用GaussianNB的fit方法拟合数据后,我们可以进行预测。此时预测有三种方法,包括predict,predict_log_proba和predict_proba。

    predict方法就是我们最常用的预测方法,直接给出测试集的预测类别输出。

    predict_proba则不同,它会给出测试集样本在各个类别上预测的概率。容易理解,predict_proba预测出的各个类别概率里的最大值对应的类别,也就是predict方法得到类别。

    predict_log_proba和predict_proba类似,它会给出测试集样本在各个类别上预测的概率的一个对数转化。转化后predict_log_proba预测出的各个类别对数概率里的最大值对应的类别,也就是predict方法得到类别。

  2. MultinomalNB: MultinomialNB参数比GaussianNB多,但是一共也只有仅仅3个。其中,参数alpha为平滑参数,如果你没有特别的需要,用默认的1即可。如果发现拟合的不好,需要调优时,可以选择稍大于1或者稍小于1的数。布尔参数fit_prior表示是否要考虑先验概率,如果是false,则所有的样本类别输出都有相同的类别先验概率。否则可以自己用第三个参数class_prior输入先验概率,或者不输入第三个参数class_prior让MultinomialNB自己从训练集样本来计算先验概率。总结如下:

fit_prior class_prior 最终先验概率 false 填或者不填没有意义 P(Yk)=1/k true 不填 P(Yk)=mkm true 填 P(Yk)=class_prior

在使用MultinomialNB的fit方法或者partial_fit方法拟合数据后,我们可以进行预测。此时预测有三种方法,包括predict,predict_log_proba和predict_proba。由于方法和GaussianNB完全一样,这里就不累述了。 

  1. BernoulliNB:BernoulliNB一共有4个参数,其中3个参数的名字和意义和MultinomialNB完全相同。唯一增加的一个参数是binarize。这个参数主要是用来帮BernoulliNB处理二项分布的,可以是数值或者不输入。如果不输入,则BernoulliNB认为每个数据特征都已经是二元的。否则的话,小于binarize的会归为一类,大于binarize的会归为另外一类。

    在使用BernoulliNB的fit或者partial_fit方法拟合数据后,我们可以进行预测。此时预测有三种方法,包括predict,predict_log_proba和predict_proba。由于方法和GaussianNB完全一样,这里就不累述了。

  2. partial_fit 方法,可实现大规模数据的分批学习,也可以实现在线学习