计算机系统应用教程网站

网站首页 > 技术文章 正文

MLAP2-机器学习项目实战2-Python实现岭回归算法模型

btikc 2024-10-25 10:53:48 技术文章 6 ℃ 0 评论

预设条件

  1. 中级IDE使用经验(Jetbrain Pycharm优先)
  2. 了解Python运行环境及其命令使用
  3. 对Python编程语言有很好的理解
  4. 基本了解Pandas(处理数据框架)、Numpy、Scikit Learn和Matplot库
  5. 一些统计学知识对分析数据是有帮助的

运行环境

以下运行软件的版本号是经过验证的可成功运行的版本号,以供参考。

编号

软件名称

版本号

1

Python

3.9.19

2

conda

22.9.0

3

pip

23.3.1

4

numpy

1.26.4

5

pandas

2.2.1

6

matplotlib

3.8.4

7

scikit-learn

1.4.2

8

scipy

1.13.0

9

seaborn

0.13.2

10

statsmodels

0.14.2

项目背景

在机器学习和统计学领域,回归分析是一种重要的预测建模技术,用于研究变量之间的关系以及估计因变量基于自变量的变化情况。其中,岭回归(Ridge Regression)作为一种线性模型正则化方法,在处理多重共线性、过拟合等问题上具有显著的优势。当特征之间高度相关,即存在多重共线性时,普通最小二乘法可能导致系数估计值不稳定且方差过大,进而影响模型的泛化能力。因此,岭回归在维持模型解释力的同时,通过对系数向量添加L2范数惩罚项来约束模型复杂度,从而改善模型性能,降低了模型过拟合的风险。

本篇通过一个汽车动力趋势预测的案例来实战化学习使用Python一步一步实现岭回归算法模型。

数据获取

本篇项目实战数据来源于网络,数据项统计如下:

编号

变量名称

描述

1

model

车型

2

mpg

英里/加仑

3

cyl

气缸数

4

disp

排量(立方英寸)

5

hp

总功率

6

drat

后桥速比

7

wt

重量(单位千磅)

8

qsec

四分之一英里加速时间

9

vs

引擎类型(0-V型,1-直列型)

10

am

变速箱类型(0-自动挡,1-手动挡)

11

gear

前进档位数

数据详情如下(部分展示):

数据预处理

查看元数据

使用pandas工具的info()方法查看元数据:

从图中可以看到:数据集的类型是pandas.core.frame.DataFrame,索引范围从0到31,一共32条数据,数据字段一共有12个,以及列出了每个字段的名称、非空个数、数据类型等信息。

查看数据

使用pandas工具的head()方法查看前5行数据:

使用pandas工具的tail()方法查看最后5行数据:

数据描述性统计

通过Pandas工具的describe()方法来查看数据的个数(count)、平均值(mean)、标准差(std)、最小值(min)、分位数(25%位、50%位、75%位)、最大值(max)。如下图所示:

去除无关数据项

数据集中的model字段记录的是车型信息,对于机器学习来讲,只有汽车的特征数据才有意义,而车型没有意义,所以这个字段可以去除。

使用Pandas工具的drop()方法可以去掉model数据项,去除model字段后的数据集如图所示:

关键代码:

特征数据项处理

数据集中的数据来源于1974年美国汽车趋势杂志,包括32种汽车(1973- 74种车型)的燃料消耗和汽车设计和性能的10个方面,所以很多数据单位是美制单位的,比如mpg是每加仑跑的英里数,disp是按立方英寸为单位的排量,wt是以千磅为单位的重量数,qsec是按四分之一英里计量的加速时间,这些数值跟公制单位不同,对于使用公制单位的人们造成阅读困难,所以需要对这些数据项进行公制单位的转换处理。

mpg是每加仑跑的英里数,可按照以下方法转为公制单位:

1 英里≈1.60934 公里,1 加仑(美制)≈3.78541 升。如果是英里 / 加仑要转换成公制单位公里 / 升,可以这样计算:假设数值为 A 英里 / 加仑,换算后为 A×1.60934÷3.78541 公里 / 升。例如,20 英里 / 加仑换算后为 20×1.60934÷3.78541≈8.5095 公里 / 升。

wt是以千磅为单位的重量数,可按照以下方法转为公制单位:

1 千磅(kilopound,缩写为 kip)等于 1000 磅。1 磅约等于 0.453592 千克。所以如果有以千磅为单位的重量数 X kip,换算成千克为 X×1000×0.453592 千克。例如,5 kip 换算后为 5×1000×0.453592 = 2267.96 千克。

数据集中的mpg字段代表每加仑跑的英里数,转换成公制单位后,字段名用mpg_mu表示,代表每升跑的公里数,所以需要删除mpg字段,并加入mpg_mu字段。

同理,wt是以千磅为单位的重量数,转换成公制单位后,字段名用wt_mu表示,代表以千克为单位的重量数,所以需要删除wt字段,并加入wt_mu字段。

使用Pandas工具的insert()可以增加mpg_mu数据项,增加mpg_mu字段后的数据集如图所示:

关键代码:

数据缺失值查看

使用Pandas工具的isnull()方法来查看数据项的缺失值情况,如下图所示:

从上图中可以看出,mpg_mu、wt_mu、drat、qsec、hp等字段都没有缺失值的情况,无须对缺失值情况进行额外处理。

关键代码:

异常值处理

异常值是指与其他观测值显著不同的数据点,它们会导致模型的性能下降。

根据上图所示的用四分位间距规则找到异常值。基于四分位数的概念,将数据集分成四个相等的部分。IQR(四分位范围规则)特别关注数据中间50%内的值范围,并使用该范围识别潜在的异常值。

关键代码:

根据IQR规则,编写查找hp字段异常点的程序,执行代码发现数据集中有6个异常值,如下图所示:

关键代码:

对于找到的异常值,可以考虑删除,但此处需要谨慎删除,因为不是所有的异常值都是不正确的,某些异常值可能是合理的观察结果。

一般可在两种情况下删除异常值:

  1. 异常值是由于输入或测量数据不正确造成的
  2. 异常点是一个强影响点

那么针对此例,采用如下办法来删除异常值。

如果hp(总功率)低于60,超过260的,这些都视同是异常值,可以用不同颜色来标识它们,将这些异常值的索引保存在removing_indices变量中,使用seaborn库以散点图格式绘制它们,将每列与我们的目标列进行比较。

如下图所示显示出来的散点图,表示了哪些点是删除点、哪些点是异常点、哪些点是正常点:

关键代码:

探索性数据分析

特征数据项分布分析

使用双变量分析法查看数值型特征mpg_mu、wt_mu、drat、qsec与hp数据项之间关系的分布情况,用散点图显示出来。

使用双变量分析法查看分类型特征ov、am与hp数据之间关系的分布情况,用散点图显示出来。

根据上述两个绘图,可以获得以下结论:

  1. 随着mpg增大,hp减小,两者成反比,即功率越大,耗油也就越大,所以每升跑的公里数就越小
  2. 随着wt增大,hp也增大,两者成正比,即车重越大,耗油就越大,所以功率也越大
  3. hp与drat成反比
  4. 随着qsec增加,hp却减少,两者成反比,即功率越大,马力就越大,即动力更强,所以零百加速需要的时间就越小
  5. 从引擎类型来看hp,V型的功率大多数情况下大于直列型的
  6. 从变速箱类型来看hp,自动挡的功率普遍高于手动挡的

关键代码:

独热编码变换

为每个分类特征的每个可能值创建一个新的二进制特征(即“独热”特征),其中只有一个特征在任何给定时间被激活(标记为1),而其他所有特征都被标记为0。

使用Pandas提供的get_dummies()方法可以实现独热编码处理。处理后的数据集格式如下:

关键代码:

相关性分析

相关矩阵是一种特殊的矩阵,用于表示变量之间的相关性。在Seaborn中,可以使用heatmap()方法计算相关性矩阵。在Seaborn热力图中,颜色的深浅表示相关性的强度,颜色的种类表示相关性的方向。艳色表示正相关,淡色表示负相关。图中的数字则表示相关性的具体数值。

如果两个特征变量的相关性系数是正值,则这两个特征变量之间的关系成正比关系;如果两个特征变量的相关性系数是负值,则这两个特征变量之间的关系成反比关系。

相关性系数的取值范围在 -1 到 1 之间。具体解读如下:

  1. 如果两个特征的相关性接近 1,那么它们之间存在很强的正相关关系,也就是说,当一个特征值增大时,另一个特征值也会增大。
  2. 如果相关性接近 -1,那么它们之间存在很强的负相关关系,也就是说,当一个特征值增大时,另一个特征值会减小。
  3. 如果相关性接近 0,那么这两个特征之间几乎没有线性关系。

相关矩阵的元素表示两个变量之间的相关系数,通常按照相关系数的绝对值大小划分为低度、显著性和高度线性相关。

以下图形显示了hp的相关矩阵:

从上图中可以得到结论:hp与mpg、wt、vs有很高的相关性。

关键代码:

构建模型

本章节将采用sklearn库中的RidgeCV()方法来拟合岭回归模型,再用该模型进行训练和测试。

数据准备

将数据集中的mpg、wt、drat、qsec列作为输入端X(训练集),将数据集中的hp列作为输出端Y(标签)。

X数据集如图所示:

Y数据集如图所示:

关键代码:

把整个数据集分成两个部分,一个部分是训练集,另一个部分是测试集,训练集占整个数据集的70%,测试集占整个数据集的30%。

训练集输入数据如图:

测试集输入数据如图:

训练接标签数据如图:

测试集标签数据如图:

关键代码:

为便于将预测数据跟原始结果数据进行比较,在开始建模预测前,先将原始结果数据进行备份复制。

关键代码:

规范化数据

在机器学习中,为了确保模型泛化能力,需要在训练集上计算标准化参数(如均值和标准差),然后应用于测试集。 这是因为测试集代表未知数据,使用训练集参数能模拟真实世界中新数据的情况。 如果在测试集上重新计算参数,可能会导致过拟合,影响模型评估的准确性。

Sklearn中的StandardScaler类在机器学习和数据分析领域是专门用于特征向量的标准化和规范化的数据预处理技术。标准化是将特征缩放到给定的范围(通常是均值为0,标准差为1)的过程,也就是说标准化的主要目的是对数据进行线性变换,使每个特征(即每个属性或每列)的数据都服从标准正态分布,即均值为0,标准差为1。这种转换是通过计算特征的均值和标准差来完成的。

标准化转换后的训练集如图所示:

标准化转换后的测试集如图所示:

关键代码:

需要注意的是,在实际应用中,fit和transform通常是分开调用的。这样做的一个好处是,可以先在训练数据上调用fit方法来计算均值和标准差,然后在训练数据和测试数据上分别调用transform方法进行标准化。这样可以确保测试数据使用与训练数据相同的均值和标准差进行标准化,从而避免数据泄露。

训练模型

RidgeCV()方法中的alpha是正则化系数,这个系数是float类型,默认为1.0。正则化系数改善了问题的条件并减少了估计的方差。较大的值指定较强的正则化。在本例中采用的正则化系数是自定义的从0.01到1.0之间,每一步增长0.01。

通过一下代码对数据集进行训练。

训练完成后,可以查看训练集中每一列的截距和系数,如图所示:

关键代码:

预测数据

模型训练好之后,可以用来对测试集进行预测。

以下是预测代码:

预测出来的结果跟实际结果进行对比查看如下:

关键代码:

评估模型

sklearn提供了一系列评估模型的方法,比如均方误差(MSE)、平均绝对误差(MAE)、均方根误差(RMSE)、决定系数(R2)。

评估结果如下:

关键代码:

MAE、MSE、RMSE值较大,导致这种误差较大的原因主要在于训练数据不足,如果训练数据的数量过少,模型无法充分学习到数据的分布和规律,从而导致在新数据上的预测误差较大。

结果可视化

根据已预测的数据和实际数据,可以放到柱状图上查看可视化的结果。

上图中,蓝色条柱代表实际价格,橙色条柱代表预测价格,除了一些预测价格是负数之外,大多数的价格都预测的非常好。当然这也不是一个完美的模型,如果想再预测出更好的结果,那么需要对模型进行一些微调,这个话题留待后续再写一篇专门讲解微调的文章。

结论

本文主要介绍了通过使用岭回归(Ridge Regression)算法进行建模和预测的实战案例,希望能够帮助你学习和理解岭回归算法的应用。如果你还想学习更多人工智能/机器学习/深度学习相关的知识,请继续阅读我编写的其他内容的文章。

本文涉及到的机器学习实战项目文件(附带数据+代码+文档)名称如下:

说明:这是一个机器学习实战项目(附带数据+代码+文档),如需数据+代码+文档直接私信联系获取下载链接。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表