机器学习基础:朴素贝叶斯笔记–阿里云天池
真正的概率分类器
在许多分类算法应用中,特征和标签之间的关系并非是决定性的。比如说,我们想预测一个人究竟是否会在泰坦尼克号海难中生存下来,那我们可以建一棵决策树来学习我们的训练集。在训练中,其中一个人的特征为:30岁,男,普通舱,他最后在泰坦尼克号海难中去世了。当我们测试的时候,我们发现有另一个人的特征也为:30岁,男,普通舱。基于在训练集中的学习,我们的决策树必然会给这个人打上标签:去世。然而这个人的真实情况一定是去世了吗?并非如此。也许这个人是心脏病患者,得到了上救生艇的优先权。又有可能,这个人就是挤上了救生艇,活了下来。对分类算法来说,基于训练的经验,这个人“很有可能”是没有活下来,但算法永远也无法确定”这个人一定没有活下来“。即便这个人最后真的没有活下来,算法也无法确定基于训练数据给出的判断,是否真的解释了这个人没有存活下来的真实情况。这就是说,算法得出的结论,永远不是100%确定的,更多的是判断出了一种“样本的标签更可能是某类的可能性”,而非一种“确定”。
我们通过某些规定比如说,在决策树的叶子节点上占比较多的标签,就是叶子节点上所有样本的标签,来强行让算法为我们返回一个固定结果。但许多时候,我们也希望能够理解算法判断出的可能性本身。每种算法使用不同的指标来衡量这种可能性。比如说,决策树使用的就是叶子节点上占比较多的标签所占的比例(接口predict_proba调用),逻辑回归使用的是sigmoid函数压缩后的似然(接口predict_proba调用),而SVM使用的是样本点到决策边界的距离(接口decision_function调用)。但这些指标的本质,其实都是一种“类概率”的表示,我们可以通过归一化或sigmoid函数将这些指标压缩到0~1之间,让他们表示我们的模型对预测的结果究竟有多大的把握(置信度)。但无论如何,我们都希望使用真正的概率来衡量可能性,因此就有了真正的概率算法:朴素贝叶斯。
朴素贝叶斯是一种直接衡量标签和特征之间的概率关系的有监督学习算法,是一种专注分类的算法。朴素贝叶斯的算法根源就是基于概率论和数理统计的贝叶斯理论,因此它是根正苗红的概率模型。接下来,我们就来认识一下这个简单快速的概率算法。
1.1 朴素贝叶斯的介绍
朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数学基础,以及稳定的分类效率。NB模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。当年的垃圾邮件分类都是基于朴素贝叶斯分类器识别的。
什么是条件概率,我们从一个摸球的例子来理解。我们有两个桶:灰色桶和绿色桶,一共有7个小球,4个蓝色3个紫色,分布如下图:
从这7个球中,随机选择1个球是紫色的概率p是多少?选择过程如下:
先选择桶
再从选择的桶中选择一个球
𝑝(球=紫色)=𝑝(选择灰桶)⋅𝑝(从灰桶中选择紫色)+𝑝(选择绿桶)⋅𝑝(从灰桶中选择紫色)=12⋅24+12⋅12
上述我们选择小球的过程就是条件概率的过程,在选择桶的颜色的情况下是紫色的概率,另一种计算条件概率的方法是贝叶斯准则。
贝叶斯公式是英国数学家提出的一个数据公式:
𝑝(𝐴|𝐵)=𝑝(𝐴,𝐵)𝑝(𝐵)=𝑝(𝐵|𝐴)⋅𝑝(𝐴)∑𝑎∈ℱ𝐴𝑝(𝐵|𝑎)⋅𝑝(𝑎)
p(A,B):表示事件A和事件B同时发生的概率。
p(B):表示事件B发生的概率,叫做先验概率;p(A):表示事件A发生的概率。
p(A|B):表示当事件B发生的条件下,事件A发生的概率叫做后验概率。
p(B|A):表示当事件A发生的条件下,事件B发生的概率。
我们用一句话理解贝叶斯:世间很多事都存在某种联系,假设事件A和事件B。人们常常使用已经发生的某个事件去推断我们想要知道的之间的概率。 例如,医生在确诊的时候,会根据病人的舌苔、心跳等来判断病人得了什么病。对病人来说,只会关注得了什么病,医生会通道已经发生的事件来 确诊具体的情况。这里就用到了贝叶斯思想,A是已经发生的病人症状,在A发生的条件下是B_i的概率。
1.2 朴素贝叶斯的应用
朴素贝叶斯算法假设所有特征的出现相互独立互不影响,每一特征同等重要,又因为其简单,而且具有很好的可解释性一般。相对于其他精心设计的更复杂的分类算法,朴素贝叶斯分类算法是学习效率和分类效果较好的分类器之一。朴素贝叶斯算法一般应用在文本分类,垃圾邮件的分类,信用评估,钓鱼网站检测等。
2.1 朴素贝叶斯算法
朴素贝叶斯法 = 贝叶斯定理 + 特征条件独立。
输入 𝑋∈𝑅𝑛 空间是n维向量集合,输出空间 𝑦={𝑐1,𝑐2,…,𝑐𝐾} . 所有的X和y都是对应空间上的随机变量. 𝑃(𝑋,𝑌) 是X和Y的联合概率分别. 训练数据集(由 𝑃(𝑋,𝑌) 独立同分布产生):
𝑇={(𝑥1,𝑦1),(𝑥2,𝑦2),…,(𝑥𝑁,𝑦𝑁)}
计算测试数据x的列表,我们需要依次计算 𝑃(𝑌=𝑐𝑘|𝑋=𝑥) ,取概率最大的值,就是x对应的分类。
𝑃(𝑌=𝑐𝑘|𝑋=𝑥) 我们一般这样解释,当给定 (𝑋=𝑥) 的条件下, 𝑌=𝑐𝑘 的概率,这就是条件概率. 这就简单了,我们只需要每个的x,计算其对应的 𝑐𝑘,𝑘∈[1,2,…,𝐾] 的概率,选择最大的概率作为这个x的类别进行了.
通过贝叶斯公式进行变形,得到预测的概率计算公式:
𝑃(𝑌=𝑐𝑘|𝑋=𝑥)=𝑃(𝑋=𝑥|𝑌=𝑐𝑘)𝑃(𝑌=𝑐𝑘)∑𝑘𝑃(𝑋=𝑥|𝑌=𝑐𝑘)𝑃(𝑌=𝑐𝑘)
我们只需要计算以下两个概率即可,又由于朴素贝叶斯假设条件独立,我们可以单独计算每个特征的条件概率: 𝑃(𝑋(𝑖)=𝑥(𝑖)|𝑌=𝑐𝑘) 和类目 𝑐𝑘 的先验概率: 𝑃(𝑌=𝑐𝑘) 。为了更好的理解这个公式,看下图解释:
其中:
𝑃(𝑌=𝑐𝑘)=∑𝑁𝑖=1𝐼(𝑦𝑖=𝑐𝑘)𝑁,𝑘=1,2,…,𝐾
当涉及到多个条件时,朴素贝叶斯有一个提前的假设,我们称之为 条件独立性假设(或者 简单假设:Naive):公式如下
𝑃(𝐴,𝐵|𝑌)=𝑃(𝐴|𝑌)⋅𝑃(𝐵|𝑌)
这个公式是朴素贝叶斯的基础假设,即各个条件概率是相互独立的,A不影响B,B不影响A。 而对这里来说,假设 𝑋=[𝑥1,𝑥2,…,𝑥𝑛]
𝑃(𝑋=𝑥|𝑌=𝑐𝑘)=𝑃(𝑋(1)=𝑥(1),𝑋(2)=𝑥(2),…,𝑋(𝑛)=𝑥(𝑛)|𝑌=𝑐𝑘)=∏𝑖=1𝑛𝑃(𝑥𝑖|𝑦)
由此原式可以等价为:
𝑃(𝑌=𝑐𝑘|𝑋=𝑥)=∏𝑛𝑖=1𝑃(𝑥𝑖|𝑌=𝑐𝑘)𝑃(𝑌=𝑐𝑘)∑𝑘∏𝑛𝑖=1𝑃(𝑥𝑖|𝑌=𝑐𝑘)𝑃(𝑌=𝑐𝑘)
我们为了选择后验概率最大的结果,进行概率的比较,由于分母一致,这里直接去掉分母,得到最后的计算公式。
𝑦=𝑎𝑟𝑔𝑚𝑎𝑥𝑐𝑘𝑃(𝑌=𝑐𝑘)∏𝑗𝑃(𝑋(𝑗)=𝑥(𝑗)|𝑌=𝑐𝑘)
我们来看一个实例,更好的理解贝叶斯的计算过程,根据天气和是否是周末预测一个人是否会出门。
index 𝑋1: 天气的好坏 𝑋2: 是否周末 𝑌: 是否出门
1 好 是 出门
2 好 否 出门
3 好 是 不出门
4 好 否 出门
5 不好 是 出门
6 不好 否 不出门
根据上述数据,为了更好的理解计算过程,我们给出几个计算公式:
a. 当出门的条件下,X_1是天气不好的概率:
𝑝(𝑋1=不好|𝑌=出门)=𝑝(𝑋1=不好,𝑌=出门)𝑝(𝑌=出门)=14
b. 出门的概率
𝑝(𝑌=出门)=46
c. X_1天气不好的概率、
𝑝(𝑋1=不好)=26
d. 在X_1天气不好的情况下,出门的概率:
𝑝(𝑌=出门|𝑋1=不好)=𝑝(𝑋1=不好|𝑌=出门)⋅𝑝(𝑌=出门)𝑝(𝑋=不好)=14⋅4626=12
f. 在X_1天气不好的情况下,不出门的概率:
𝑝(𝑌=出门|𝑋1=不好)=1−𝑝(𝑌=不出门|𝑋1=不好)=1−12=12
2.2 朴素贝叶斯的优缺点
优点: 朴素贝叶斯算法主要基于经典的贝叶斯公式进行推倒,具有很好的数学原理。而且在数据量很小的时候表现良好,数据量很大的时候也可以进行增量计算。由于朴素贝叶斯使用先验概率估计后验概率具有很好的模型的可解释性。
缺点: 朴素贝叶斯模型与其他分类方法相比具有最小的理论误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进,例如为了计算量不至于太大,我们假定每个属性只依赖另外的一个。解决特征之间的相关性,我们还可以使用数据降维(PCA)的方法,去除特征相关性,再进行朴素贝叶斯计算。