机器学习-sklearn第十四天——笔记

sklearn中的朴素贝叶斯

1 概述

1.1 真正的概率分类器

在许多分类算法应用中,特征和标签之间的关系并非是决定性的。比如说,我们想预测一个人究竟是否会在泰坦尼克号海难中生存下来,那我们可以建一棵决策树来学习我们的训练集。在训练中,其中一个人的特征为:30岁,男,普通舱,他最后在泰坦尼克号海难中去世了。当我们测试的时候,我们发现有另一个人的特征也为:30岁,男,普通舱。基于在训练集中的学习,我们的决策树必然会给这个人打上标签:去世。然而这个人的真实情况一定是去世了吗?并非如此。
也许这个人是心脏病患者,得到了上救生艇的优先权。又有可能,这个人就是挤上了救生艇,活了下来。对分类算法来说,基于训练的经验,这个人“很有可能”是没有活下来,但算法永远也无法确定”这个人一定没有活下来“。即便这个人最后真的没有活下来,算法也无法确定基于训练数据给出的判断,是否真的解释了这个人没有存活下来的真实情况。这就是说,算法得出的结论,永远不是100%确定的,更多的是判断出了一种“样本的标签更可能是某类的可能性”,而非一种“确定”。我们通过某些规定,比如说,在决策树的叶子节点上占比较多的标签,就是叶子节点上所有样本的标签,来强行让算法为我们返回一个固定结果。但许多时候,我们也希望能够理解算法判断出的可能性本身。
每种算法使用不同的指标来衡量这种可能性。比如说,决策树使用的就是叶子节点上占比较多的标签所占的比例(接口predict_proba调用),逻辑回归使用的是sigmoid函数压缩后的似然(接predict_proba调用),而SVM使用的是样本点到决策边界的距离(接口decision_function调用)。但这些指标的本质,其实都是一种“类概率”的表示,我们可以通过归一化或sigmoid函数将这些指标压缩到0~1之间,让他们表示我们的模型对预测的结果究竟有多大的把握(置信度)。但无论如何,我们都希望使用真正的概率来衡量可能性,因此就有了真正的概率算法:朴素贝叶斯。朴素贝叶斯是一种直接衡量标签和特征之间的概率关系的有监督学习算法,是一种专注分类的算法。朴素贝叶斯的算法根源就是基于概率论和数理统计的贝叶斯理论,因此它是根正苗红的概率模型。接下来,我们就来认识一下这个简单快速的概率算法。

1.2 朴素贝叶斯是如何工作的

朴素贝叶斯被认为是最简单的分类算法之一。首先,我们需要了解一些概率论的基本理论。假设有两个随机变量X和 Y,他们分别可以取值为x和y。有这两个随机变量,我们可以定义两种概率:
在这里插入图片描述

1.2.1 瓢虫冬眠:理解P(Y|X)

在这里插入图片描述

1.2.2 贝叶斯的性质与最大后验估计

在过去的许多个星期内,我们学习的分类算法总是有一个特点:这些算法先从训练集中学习,获取某种信息来建立模型,然后用模型去对测试集进行预测。比如逻辑回归,我们要先从训练集中获取让损失函数最小的参数,然后用参数建立模型,再对测试集进行预测。在比如支持向量机,我们要先从训练集中获取让边际最大的决策边界,然后用决策边界对测试集进行预测。相同的流程在决策树,随机森林中也出现,我们在fit的时候必然已经构造好了能够让对测试集进行判断的模型。而朴素贝叶斯,似乎没有这个过程。我给了大家一张有标签的表,然后提出说,我要预测零下的时候,年龄为20天的瓢虫,会冬眠的概率,然后我们就顺理成章地算了出来。没有利用训练集求解某个模型的过程,也没有训练完毕了我们来做测试的过程,而是直接对有标签的数据提出要求,就可以得到预测结果了。这说明,朴素贝叶斯是一个不建模的算法。以往我们学的不建模算法,比如KMeans,比如PCA,都是无监督学习,而朴素贝叶斯是第一个有监督的,不建模的分类算法。在我们刚才举的例子中,有标签的表格就是我们的训练集,而我提出的要求“零下的时候,年龄为20天的瓢虫”就是没有标签的测试集。我们认为,训练集和测试集都来自于同一个不可获得的大样本下,并且这个大样本下的各种属性所表现出来的规律应当是一致的,因此训练集上计算出来的各种概率,可以直接放到测试集上来使用。即便不建模,也可以完成分类。
但实际中,贝叶斯的决策过程并没有我们给出的例子这么简单。
在这里插入图片描述
在这里插入图片描述

在现实中,要求解分子也会有各种各样的问题。比如说,测试集中出现的某种概率组合,是训练集中从未出现的状况,这种时候就会出现某一个概率为0的情况,贝叶斯概率的分子就会为0。还有,现实中的大多数标签还是连续型变量,要处理连续型变量的概率,就不是单纯的数样本个数的占比的问题了。接下来我们就来看看,如何对连续型特征求解概率。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 sklearn中的朴素贝叶斯

Sklearn基于这些分布以及这些分布上的概率估计的改进,为我们提供了四个朴素贝叶斯的分类器
在这里插入图片描述

虽然朴素贝叶斯使用了过于简化的假设,这个分类器在许多实际情况中都运行良好,著名的是文档分类和垃圾邮件过滤。而且由于贝叶斯是从概率角度进行估计,它所需要的样本量比较少,极端情况下甚至我们可以使用1%的数据作为训练集,依然可以得到很好的拟合效果。当然,如果样本量少于特征数目,贝叶斯的效果就会被削弱。

2 不同分布下的贝叶斯

2.1 高斯朴素贝叶斯GaussianNB

2.1.1 认识高斯朴素贝叶斯

class sklearn.naive_bayes.GaussianNB (priors=None,var_smoothing=1e-09)

  1. 展示我所使用的设备以及各个库的版本
    在这里我们来使用watermask这个便利的模块来帮助我们,这是一个能够帮助我们一行代码查看设备和库的版本的模块。如果没有watermask的你可能需要在cmd中运行pip来安装。也可以直接使用魔法命令%%cmd作为一个cell的开头来帮助我们在jupyter lab中安装你的watermark。
    在这里插入图片描述

  2. 导入需要的库和数据
    在这里插入图片描述

  3. 建模,探索建模结果
    在这里插入图片描述

  4. 使用混淆矩阵来查看贝叶斯的分类结果
    在这里插入图片描述

2.1.2 探索贝叶斯:高斯朴素贝叶斯擅长的数据集

那高斯普斯贝叶斯擅长什么样的数据集呢?我们还是使用常用的三种数据分布:月亮型,环形数据以及二分型数据。
在这里插入图片描述

从图上来看,高斯贝叶斯属于比较特殊的一类分类器,其分类效果在二分数据和月亮型数据上表现优秀,但是环形数据不太擅长。我们之前学过的模型中,许多线性模型比如逻辑回归,线性SVM等等,在线性数据集上会绘制直线决策边界,因此难以对月亮型和环形数据进行区分,但高斯朴素贝叶斯的决策边界是曲线,可以是环形也可以是弧线,所以尽管贝叶斯本身更加擅长线性可分的二分数据,但朴素贝叶斯在环形数据和月亮型数据上也可以有远远胜过其他线性模型的表现。

2.1.3 探索贝叶斯:高斯朴素贝叶斯的拟合效果与运算速度

我们已经了解高斯朴素贝叶斯属于分类效果不算顶尖的模型,但我们依然好奇,这个算法在拟合的时候还有哪些特性呢?比如说我们了解,决策树是天生过拟合的模型,而支持向量机是不调参数的情况下就非常接近极限的模型。我们希望通过绘制高斯朴素贝叶斯的学习曲线与分类树,随机森林和支持向量机的学习曲线的对比,来探索高斯朴素贝叶斯算法在拟合上的性质。过去绘制学习曲线都是以算法类的某个参数的取值为横坐标,今天我们来使用sklearn中自带的绘制学习曲线的类learning_curve,在这个类中执行交叉验证并从中获得不同样本量下的训练和测试的准确度。

  1. 首先导入需要的模块和库
    在这里插入图片描述

  2. 定义绘制学习曲线的函数
    在这里插入图片描述

  3. 导入数据,定义循环
    在这里插入图片描述

  4. 进入循环,绘制学习曲线
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值