前言:在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(X),要么是条件分布P(Y|X)。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布,然后用P(Y|X)=P(X,Y)/P(X)得出。
朴素贝叶斯很直观,计算量也不大,在很多领域有广泛的应用。
1. 朴素贝叶斯分类
在给出贝叶斯公式之前先介绍一下贝叶斯学派。
贝叶斯学派很古老,但是从诞生到一百年前一直不是主流。主流是频率学派。频率学派的权威皮尔逊和费歇尔都对贝叶斯学派不屑一顾,但是贝叶斯学派硬是凭借在现代特定领域的出色应用表现为自己赢得了半壁江山。
贝叶斯学派的思想可以概括为先验概率+数据=后验概率。也就是说我们在实际问题中需要得到的后验概率,可以通过先验概率和数据一起综合得到。数据大家好理解,被频率学派攻击的是后延概率,一般来说先验概率就是我们对于数据所在领域的历史经验,但是这个经验常常难以量化或者模型化,于是贝叶斯学派大胆的假设先验分布的模型,比如正态分布,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(A):在不考虑任何情况下,A事件发生的概率。
注意:1)先验概率是已经给定的。
2)根据历史统计出来的
条件概率P(B|A):A事件发生的情况下,B事件发生的概率。
后验概率P(A|B):在B事件发生之后,对A事件发生的概率的重新评估。
全概率:如果A和A'构成样本空间的一个划分,那么事件B的概率为:A和A'的概 率分别乘以B对这两个事件的概率之和。
朴素贝叶斯分类算法的核心是什么?
下面是贝叶斯公式,换个通俗易懂的表达式。,我们最终出P(类别|特征)即可!
算法思想:基于概率预测
逻辑回归通过拟合曲线(或者学习超平面)实现分类,决策树通过寻找最佳划分特征进而学习样本路径实现分类,支持向量机通过寻找分类超平面进而最大化类别间隔实现分类。相比之下,朴素贝叶斯独辟蹊径,通过考虑特征概率来预测分类。
2. 朴素贝叶斯的类型
朴素贝叶斯按照数据的先验概率的不同可以分为高斯朴素贝叶斯,伯努利朴素贝叶斯,多项式朴素贝叶斯。
1. 高斯朴素贝叶斯
Gaussian Naive Bayes是指当特征属性为连续值时,而且分布服从高斯分布,那么在计算P(x|y)的时候可以直接使用高斯分布的概率分布:
因此只需要计算出各个类别中此特征划分的各个均值和标准差。
2. 伯努利朴素贝叶斯
Bernoulli Naive Bayes是指当特征属性为连续值时,而且分布服从伯努利分布,那么在计算P(x|y)的时候可以直接使用伯努利分布的概率分布公式:
伯努利分布是一种离散分布,只有两种可能的结果。1表示成功,出现的概率为p;0表示失败,出现的概率为q=1-p;其中均值为E(x)=p,方差为Var(X)=p(1-p)
3. 多项式朴素贝叶斯
Multinomial Naive Bayes是指当特征属性服从多项分布,从而,对于每个类别 y,参数为θy=(θy1,θy2,...,θyn),其中n为特征属性数目,那么P(xi|y)的概率为θyi.
api 介绍:
朴素贝叶斯是一类比较简单的算法,scikit-learn中朴素贝叶斯类库的使用也比较简单。相对于决策树,KNN之类的算法,朴素贝叶斯需要关注的参数是比较少的,这样也比较容易掌握。在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。
这三个类使用的分类场景各不相同,一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者和稀疏的多元离散值,应该使用BernoulliNB。
在使用GaussianNB的fit方法拟合数据后,我们可以进行预测。此时预测有三种方法,包括predict,predict_log_proba和predict_proba。
predict方法就是我们最常用的预测方法,直接给出测试集的预测类别输出。
predict_proba则不同,它会给出测试集样本在各个类别上预测的概率。容易理解,predict_proba预测出的各个类别概率里的最大值对应的类别,也就是predict方法得到类别。
predict_log_proba和predict_proba类似,它会给出测试集样本在各个类别上预测的概率的一个对数转化。转化后predict_log_proba预测出的各个类别对数概率里的最大值对应的类别,也就是predict方法得到类别。
3. 拉普拉斯平滑
为了解决零概率的问题,法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,所以加法平滑也叫做拉普拉斯平滑。假定训练样本很大时,每个分量x的计数加1造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题
对于离散的特征,我们还要考虑后验条件概率等于0的情况,因为这样的情况可能会带来较大偏差。比如,当输入的数据某个特征出现了一个训练集中没有出现的值,那么此时的条件概率=0。然而不管其他特征值再这个中出现了多少次,这个数据点都不再属于。这就好像一个从来都只看过鸟在天上飞的人,突然有一天看到了一只在地上走的鸟,不管它的其它特征多么像鸟,这个人都断定所看到的的绝对不是鸟。为了避免这种莫名其妙的变化,我们需要让概率值“平滑”一些,宁愿这个值很小也不要让它是0。这就要用到下列的拉普拉斯平滑来估计后验概率:
,其中表示训练集中可能的取值数,是一个玄学参数,取0时上式就是极大似然估计,所以通常取1.
4. 朴素贝叶斯分类的优缺点
优点:
1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
缺点:
1) 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
4)对输入数据的表达形式很敏感。
适用场景:文本分类。