朴素贝叶斯
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了朴素贝叶斯相关的知识,希望对你有一定的参考价值。
参考技术A 在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,但是朴素贝叶斯却是生成方法。如何理解这句话,看例题:
根据上述数据集,如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?
这里我们联系到朴素贝叶斯公式:
p(不帅、性格不好、身高矮、不上进|嫁) = p(不帅|嫁)*p(性格不好|嫁)*p(身高矮|嫁)*p(不上进|嫁)---------->要使这个公式成立,需要各个特征之间相互独立。
而朴素贝叶斯算法就是假设各个特征之间相互独立。
1、假如没有这个假设,那么我们对右边这些概率的估计其实是不可做的,这么说,我们这个例子有4个特征,其中帅包括帅,不帅,性格包括不好,好,爆好,身高包括高,矮,中,上进包括不上进,上进,那么四个特征的联合概率分布总共是4维空间,总个数为2*3*3*2=36个。36个,计算机扫描统计还可以,但是现实生活中,往往有非常多的特征,每一个特征的取值也是非常之多,那么通过统计来估计后面概率的值,变得几乎不可做,这也是为什么需要假设特征之间独立的原因。
2、假如我们没有假设特征之间相互独立,那么我们统计的时候,就需要在整个特征空间中去找,比如统计p(不帅、性格不好、身高矮、不上进|嫁)。我们就需要在嫁的条件下,去找四种特征全满足分别是不帅,性格不好,身高矮,不上进的人的个数,这样的话,由于数据的稀疏性,很容易统计到0的情况。 这样是不合适的。
根据上面俩个原因,朴素贝叶斯法对条件概率分布做了条件独立性的假设,由于这是一个较强的假设,朴素贝叶斯也由此得名!这一假设使得朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。
所以公式整理以后变为:
整理训练数据中,嫁的样本数如下:
分别计算各个概率:
p(嫁) = 6/12(总样本数) = 1/2
p(不帅|嫁) = 3/6 = 1/2
p(性格不好|嫁)= 1/6
p(矮|嫁) = 1/6
p(不上进|嫁) = 1/6
总样本为:
p(不帅) = 4/12 = 1/3
p(性格不好) = 4/12 = 1/3
p(身高矮) = 7/12
p(不上进) = 4/12 = 1/3
将以上概率带入公式,就能得出嫁的概率。
总结:理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。
而在属性相关性较小时,朴素贝叶斯性能最 为良好。
贝叶斯分类器(3)朴素贝叶斯分类器
参考技术A 根据 贝叶斯分类器(1)贝叶斯决策论概述、贝叶斯和频率、概率和似然 ,我们对贝叶斯分类器所要解决的问题、问题的求解方法做了概述,将贝叶斯分类问题转化成了求解 的问题,在上一篇 贝叶斯分类器(2)极大似然估计、MLE与MAP
中,我们分析了第一个求解方法:极大似然估计。在本篇中,我们来介绍一个更加简单的 求解方法,并在此基础上讲讲常用的一个贝叶斯分类器的实现:朴素贝叶斯分类器(Naive Bayes classifier)。
我们的目标是通过对样本的学习来得到一个分类器,以此来对未知数据进行分类,即求后验概率 。在 贝叶斯分类器(1)贝叶斯决策论概述、贝叶斯和频率、概率和似然 中,我们描述了贝叶斯分类器是以生成式模型的思路来处理这个问题的,如下面的公式所示,贝叶斯分类器通过求得联合概率 来计算 ,并将联合概率 转化成了计算类先验概率 、类条件概率 、证据因子 。
其中的难点是类条件概率 的计算,因为样本 本身就是其所有属性的联合概率,各种属性随意组合,变幻莫测,要计算其中某一种组合出现的概率真的是太难了,而朴素贝叶斯的出现就是为了解决这个问题的。
要想计算联合概率 ,我们肯定是希望事件 与事件 是相互独立的,可以简单粗暴的 ,多想对着流星许下心愿:让世界上复杂的联合概率都变成简单的连乘!
朴素贝叶斯实现了我们的梦想!朴素贝叶斯中的朴素就是对多属性的联合分布做了一个大胆的假设,即 的 个维度之间相互独立:
朴素贝叶斯通过这一假设大大简化了 的计算,当然,使用这个假设是有代价的,一般情况下,大量样本的特征之间独立这个条件是弱成立的,毕竟哲学上说联系是普遍的,所以我们使用朴素贝叶斯会降低一些准确性;如果实际问题中的事件的各个属性非常不独立的话,甚至是无法使用朴素贝叶斯的。总的来说,朴素贝叶斯大大简化了计算,同时牺牲了一些结果的准确性,具体要不要使用、怎么使用就看我们在实际问题中的权衡了。
在朴素贝叶斯的思想下再看回分类问题,事件 有 个属性,可将分类问题按下式转化:
只需要计算出上式不同类别 下的值,令值最大的类别 即为分类结果。
其中,根据大数定律, , 是类别 下的后验概率,其计算要取决于先验 ,这里需要分为 是离散或连续两种情况:
为样本中类别为 的频数, 为类别为 的样本中,第 个属性中 出现的频数。
不过有些出现的概率比较低的属性,在我们的样本中不一定会出现,即频数为0,如果不作处理的话会导致其 为0,会导致包含这个属性的样本永远都不会被分类到类别 ,而现实不一定是这样,因此我们需要对没出现的情况做平滑处理,比如常见的拉普拉斯平滑,给分子 的频数加上一个定值 ,而分母加上 ,表示为第 个属性中的每一种取值的频数都加定值 :
举例:垃圾邮件判断
朴素贝叶斯分类在垃圾邮件的判断上有不错的实践效果,这是一个二分类问题, ,假设 为垃圾邮件, 为正常邮件,统计出:
现在收到一封邮件包含一些关键词:【中奖,笔记本电脑,特朗普,大选,...】,根据大量的数据可以统计出这些词出现的频数,除以类别中所有词的总频数得到其出现的后验概率,在垃圾邮件中:
在正常邮件中:
可以计算得到:
时的值是 时值的26倍,所以判断此邮件是垃圾邮件。
我们判断西瓜好坏的问题也可以转化成离散型随机变量的分类问题,过程与上面类似。
比如垃圾邮件的例子,在多项式朴素贝叶斯中:
如果我们只关心“中奖”出现与否,不管词频,则在伯努利朴素贝叶斯中:
举例:性别判断
下面是一组人类身体特征的统计资料。
有人身高6英尺、体重130磅,脚掌8英寸,判断此人性别:
各属性为连续变量,假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差。男性的身高是均值5.855、方差0.035的正态分布。所以,例如男性的身高为6英尺的概率的相对值等于1.5789(密度函数的值,并不是概率,只用来反映各个值的相对可能性)。
分布确定后,就可以计算性别的分类了:
女性的概率比男性要高出将近10000倍,所以判断该人为女性。
在前文1.2.1小节中我们已经提过平滑处理,主要针对于那些在样本中没有出现过的词,它们的概率是0,导致在分类中完全没有存在感,所以要对这些进行平滑处理。
平滑处理的方法也有很多种,包括我们上面说过的拉普拉斯平滑,除此之外还有古德图灵平滑,线性插值法,回退法(K-Z回退)等,不过这些方法在自然语言处理中比较常用,我们暂时先不多介绍了,还是聚焦在朴素贝叶斯上,下面我们看看朴素贝叶斯在sklearn中的实现。
sklearn中有3种常用的不同类型的朴素贝叶斯:
1)高斯分布型朴素贝叶斯
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.(不是很明白)
2)多项式分布型朴素贝叶斯
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.
其常用函数与高斯型一样。
3)伯努利分布型朴素贝叶斯
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。
优点
缺点
可见,朴素贝叶斯的缺点很大程度来来源于其假设太强,对于其假设符合程度较低的问题会损失较多的准确性,因此,如果我们能把假设弱化一下,是不是就能提高朴素贝叶斯的性能呢?在接下来的篇章中我们来继续探索。
主要参考资料
《机器学习》周志华
《统计学习方法》 李航
scikit-learn Naive Bayes文档
以上是关于朴素贝叶斯的主要内容,如果未能解决你的问题,请参考以下文章