详解使用sklearn实现一元线性回归和多元线性回归

news2025/3/13 18:42:44

[Open In Colab]

文章目录

  • 1. 线性回归简介
  • 2. 使用sklearn进行一元线性回归
  • 3. 线性回归的`coef_`参数和`intercept_`参数
  • 4. 使用sklearn实现多元线性回归
    • 4.1 利用PolynomialFeatures构造输入
    • 4.2 进行多元线性回归
  • 5. 总结

import numpy as np
import matplotlib.pyplot as plt

1. 线性回归简介

简单的线性回归就是使用一根直线去拟合一种趋势。

例如:我们有一批房屋面积与房价的数据。将其作成散点图如下:

X = [100, 110, 120, 130, 140]  # 房屋面积(m^2)
y = [100 * 1, 110 * 1.05, 120 * 1.1, 130 * 0.95, 140 * 0.9]  # 房价(万元)

plt.scatter(X, y, c='red')
plt.ylim(80, 160)
plt.xlim(80, 160)
plt.show()

在这里插入图片描述

此时,我们通过观察图像,可以假设房屋面积与房价是呈一种线性关系的。也就是: 房价 = a ∗ 房屋面积 + b 房价=a * 房屋面积 + b 房价=a房屋面积+b 。但我们并不知道 a a a b b b 的值。

线性回归的目标就是求出这条直线,也就是 a a a, b b b 的值。

通过我上面的数据可以很容易看出,它们的线性关系为: 房价 = 1 ∗ 房价 + 0 房价 = 1 * 房价 + 0 房价=1房价+0。即 a = 1 , b = 0 a=1, b=0 a=1,b=0

plt.ylim(80, 160)
plt.xlim(80, 160)
plt.scatter(X, y, c='red')
plt.plot(np.arange(80, 160), np.arange(80, 160) * 1 + 0, c='green')
plt.show()

在这里插入图片描述

接下来,需要使用sklearn去实现这条直线的计算。

2. 使用sklearn进行一元线性回归

sklearn进行线性回归使用的是sklearn.linear_model,只需要给出上面的X和y即可自动进行数据拟合。

首先定义模型:

from sklearn import linear_model

model = linear_model.LinearRegression()

之后构造数据集:

需要有X和Y,其中X的维度必须是(样本数, 特征数)
在该例子中,我们有5条数据,一个面积的特征。因此需要将X的维度处理成(5, 1)
而Y因为是一个具体的值,因此其维度必须是(样本数,)

在上面定义X,y时,y已经满足了维度。而X维度为(样本数, ),因此需要对其进行转换。

X = np.array(X).reshape(-1, 1)  # -1表示自动计算维度,因此效果等同于`.reshape(5, 1)`
model.fit(X, y)  # 训练模型
LinearRegression()

模型训练后,即可使用predict方法进行预测:

print(model.predict(X))
[107.4 113.4 119.4 125.4 131.4]

现在我们将训练好的进行绘制

X_ = np.arange(80, 160).reshape(-1, 1)
y_ = model.predict(X_)

plt.scatter(X, y, c='red')
plt.plot(X_, y_, c='blue')
plt.show()

在这里插入图片描述

可以看到,我们训练出的模型和预测的模型还是有一定的差距的。这是因为我们的样本太少,导致无法拟合出真实的模型。

3. 线性回归的coef_参数和intercept_参数

上面我们训练好了模型。如果我们想要用数学表达式的方式写出来,可以通过查看模型的coef_intercept_参数。

上面我们说过,X的特征只有一个。因此我们的线性回归模型的基础假设就是 y=f(x)=ax+b。因此,线性回归过程就是求a,b两个值。

我们可以通过coef_参数查看a的值,通过intercept_查看b的值

a = model.coef_[0]
b = model.intercept_
print("a =", model.coef_)
print("b =", model.intercept_)
a = [0.6]
b = 47.39999999999998

上面可以看到model.coef_返回的是一个数组,这是因为实际应用中,我们不止有一个特征,因此是一个数组。

下面我们尝试使用公式的方式去计算y,并进行绘制。

X_ = np.arange(80, 160).reshape(-1, 1)
y_ = a * X_ + b

plt.scatter(X, y, c='red')
plt.plot(X_, y_, c='blue')
plt.show()

在这里插入图片描述

可以看到,我们使用ax+b的计算方式得到了同样的结果。

4. 使用sklearn实现多元线性回归

在实际应用中,并不是所有的数据都是线性关系。数据可能会呈现出二次或三次曲线。例如,我们先构造出一个符合三次曲线的样本

X = np.sort(np.random.uniform(-3, 3, size=100))  # 定义100个X
y_true = -0.5 * (X ** 3) + 0.8 * (X ** 2) + 1 * (X ** 1) + 10  # 真实的y值
y_label = y_true + np.random.normal(-1, 1, size=100)  # y的标签值,含噪音

plt.scatter(X, y_label, c='red')
plt.plot(X, y_true, c='green')
plt.show()

在这里插入图片描述

对于该样本,我们需要假设样本符合三次曲线,也就是: f ( x ) = a x 3 + b x 2 + c x + d f(x) = ax^3+bx^2+cx+d f(x)=ax3+bx2+cx+d

也就是我们线性回归的目标是求出a,b,c,d

然而,sklearn.linear_model本身并不直接支持 x n x^n xn次方,但是我们可以利用它支持多个特征的特性来完成三次曲线的拟合。

sklearn.linear_model支持多个特征。因此我们假设的模型函数为: f ( x 3 , x 2 , x 1 ) = a x 3 + b x 2 + c x 1 + d f(x_3, x_2, x_1) = a x_3 + bx_2 + cx_1 + d f(x3,x2,x1)=ax3+bx2+cx1+d

其中该模型具有三个特征 x 3 , x 2 , x 1 x_3, x_2, x_1 x3,x2,x1。而实际我们只有一个特征 x x x,因此我们需要利用 x x x构造出三个特征,即:
x 3 = x 3 x 2 = x 2 x 1 = x \begin{aligned} x_3 = x^3 \\ x_2 = x^2 \\ x_1 = x \end{aligned} x3=x3x2=x2x1=x

通过这种方式,我们就巧妙利用linear_model多特征特性,解决了一个特征的多元线性回归。

4.1 利用PolynomialFeatures构造输入

sklearn提供了帮你构造 x 3 , x 2 , x 1 x_3,x_2,x_1 x3,x2,x1的方法sklearn.preprocessing.PolynomialFeatures

我们先来尝试一下:

from sklearn.preprocessing import PolynomialFeatures

X_temp = np.arange(0, 3).reshape(-1, 1)
X_ = PolynomialFeatures(degree=3).fit_transform(X_temp)
print("X_temp:", X_temp.reshape(-1))
print("\nX_:\n", X_)
X_temp: [0 1 2]

X_:
 [[1. 0. 0. 0.]
 [1. 1. 1. 1.]
 [1. 2. 4. 8.]]

上面的例子中,我们使用PolynomialFeatures(degree=3)X_temp进行了处理。

其中X_temp是我们的输入,一共有3个样本[0, 1, 2],每个样本有1个特征。经过PolynomialFeatures(degree=3).fit_transform(X_temp)处理后,我们得到了新的输入X_

X_同样是3个样本,但每个样本有4(3+1)个特征,通过观察很容易发现。这4个特征与原始的1个特征的关系为: x 0 , x 1 , x 2 , x 3 x^0, x^1, x^2, x^3 x0,x1,x2,x3

实际我们在使用时,其实不需要 x 0 x^0 x0,因为linear_model中的intercept_已经具备了 x 0 x^0 x0的功能,所以我们可以使用PolynomialFeatures(degree=3, include_bias=False)中的include_bias=False来去掉 x 0 x^0 x0

接下来我们对一开始的X进行一下处理:

X_p = PolynomialFeatures(degree=3, include_bias=False).fit_transform(X.reshape(-1, 1))

4.2 进行多元线性回归

对输入X处理后,接下来的线性回归过程和一元线性回归就没什么区别了:

model = linear_model.LinearRegression()
model.fit(X_p, y_label)
LinearRegression()

我们再来看下coef_intercept_

print("model.coef_:", model.coef_)
print("model.intercept_:", model.intercept_)
model.coef_: [ 0.91962613  0.76846728 -0.49995355]
model.intercept_: 9.211345527598573

这次model.coef_一共有3个数值,分别对应 x 1 , x 2 , x 3 x^1, x^2, x^3 x1,x2,x3前面的系数。

我们先用模型的方式绘制一下预测结果:

plt.scatter(X, y_label, c='red')
plt.plot(X, model.predict(X_p), c='green')
plt.show()

在这里插入图片描述

接下来我们再用公式的方式将结果绘制一下,公式为:y=ax+bx^2+cx^3+d

a = model.coef_[0]
b = model.coef_[1]
c = model.coef_[2]
d = model.intercept_
y_predict = a * X + b * X**2 + c * X**3 + d

plt.scatter(X, y_label, c='red')
plt.plot(X, y_predict, c='green')
plt.show()

在这里插入图片描述

可以看到结果一致与模型结果一致

5. 总结

一元线性回归:

  1. 线性回归需要使用model.linear_modelLinearRegression()方法
  2. 一元线性回归需要将 X X Xreshape成(样本数, 1)的维度
  3. 使用model.fit(X, y)进行模型拟合
  4. model.coef_存储的是 x x x前面的系数,model.intercept_存储的是截距

多元线性回归:

  1. 多选线性回归需要使用PolynomialFeatures对X进行处理,它会将X转化为多个特征,分别对应 x 0 , x 1 , x 2 , . . . x^0, x^1, x^2, ... x0,x1,x2,...
  2. 使用PolynomialFeaturesinclude_bias=False参数可以去掉 x 0 x^0 x0。建议使用
  3. 对X处理后,后续的流程与一元线性回归一致
  4. model.coef_存储了多个系数,分别为 x 0 , x 1 , x 2 , . . . x^0, x^1, x^2, ... x0,x1,x2,...前面的系数。model.intercept_存储的是截距

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的洗衣店管理系统

基于SSM的洗衣店管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 管理员界面 预约列表 种类管理 用户界面 摘要 洗衣店管理系统是一种利用现代技…

java 通过Tess4j 读取图片中的文字

Maven依赖导入Tess4j <!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j --><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.4</version></de…

UI设计师岗位的基本职责八篇(合集)

UI设计师岗位的基本职责1 职责&#xff1a; 1. 负责公司互联网产品app、web、h5等的用户界面设计工作; 2. 负责运营活动相关的平面及视频设计支持; 3. 负责完成产品相关的界面、图标、动画等的图形界面设计&#xff0c;并参与制定、编写产品视觉设计规范文档; 4. 整理和分…

音频抓取代码示例

以下是一个使用DefaultsKit库的简单爬虫程序&#xff0c;用于爬取音频。代码中使用了https://www.duoip.cn/get_proxy的API获取代理服务器。 import Foundation import DefaultsKit ​ let url "https://www.douban.com/music" // 目标网站URL let proxyUrl "…

代码随想录算法训练营第二十五天丨 回溯算法part03

39. 组合总和 思路 题目中的无限制重复被选取&#xff0c;提示&#xff1a;1 < candidates[i] < 200。 本题和77.组合 (opens new window)&#xff0c;216.组合总和III (opens new window)的区别是&#xff1a;本题没有数量要求&#xff0c;可以无限重复&#xff0c;但…

【二层环路】交换机二次原路排查思路

以太网交换网络中为了提高网络可靠性&#xff0c;通常会采用冗余设备和冗余链路&#xff0c;然而现网中由于组网调整、配置修改、升级割接等原因&#xff0c;经常会造成数据或协议报文环形转发&#xff0c;不可避免的形成环路。如图1所示&#xff0c;三台设备两两相连就会形成环…

[解决]修复 win 32/64 位操作系统上的 PyAudio pip 安装错误

一、说明 Python3.7 无法安装pyaudio&#xff0c;度娘的结果基本都是这个&#xff0c;pip install pyaudio.....然而十有八九你的电脑不买账&#xff0c;会报错。本篇将介绍如何在win10anaconda安装pyaudio。 二、过程叙述 我有一台 Windows 10 电脑&#xff0c;我想安装 pyau…

本地jar打包成maven依赖,上传到私服

本地打包jar成maven依赖 mvn install:install-file -Dfile“\oss\xmlBeans\rvdMsgWrapper.jar” -DgroupId“hk.gov.xmlBeans” -DartifactId“noNamespace” -Dversion“1.0.0” -Dpackaging“jar” 上传到私服 登录进入到Upload 页面 上传 上传完成&#xff0c;到仓库查看…

LED路灯浪涌保护器行业应用解决方案

LED路灯是一种利用LED发光二极管作为光源的节能环保的城市道路照明设备。LED路灯具有寿命长、光效高、色温可调、无污染等优点&#xff0c;已经成为城市道路照明的主流选择。 然而&#xff0c;LED路灯也面临着一些问题&#xff0c;其中之一就是雷击浪涌的威胁。雷击浪涌是指由…

用Python做一个文件夹整理工具

文章目录 简介文件夹对话框文件映射组件完整组件 简介 我们的目的是做一个像下面这样的工具&#xff0c;前面两个输入框&#xff0c;用于输入源路径和目标路径&#xff0c;下面的图片、视频、音乐表示在目标路径中创建的文件夹&#xff0c;后面的文件后缀&#xff0c;表示将这…

HTML 表格及练习

表格 概述 表格是一种二维结构&#xff0c;横行纵列。 由单元格组成。 表格是一种非常“强” 的结构&#xff1a; 每一行有相同的列数&#xff08;单元格&#xff09;&#xff0c;每一列有相同的行数&#xff08;单元格&#xff09; 同一列的单元格&#xff0c;宽度&#…

《实验细节》使用PEFT库常见错误

《实验细节》使用PEFT库常见错误 安装问题常用命令使用问题问题1安装问题 首先给出用到的网站 更新NVIDIA网站https://www.nvidia.com/Download/index.aspx 2. 使用PEFT的优秀demo https://www.philschmid.de/fine-tune-flan-t5-peft 3. 下载一些库的必备网站 https://pypi.or…

(完全解决)latex如何设置某段文字向右对齐

开门见山&#xff0c;老子就是想要下图中日期的效果&#xff0c;可以看到&#xff0c;日期向右对齐。 很多人给的是下面这个方案&#xff1a; \begin{flushright}Sep 2020-July 2023 \end{flushright}但是试过了好像不行&#xff0c;其是换一行&#xff0c;然后向右对齐。 …

下拉选择器的树状结构图

类似&#xff1a;【Vue-Treeselect 和 vue3-treeselect】树形下拉框 一&#xff1a;图 二&#xff1a;如果有多层级的数据结构&#xff0c;可以用treeselect插件实现 1、安装&#xff1a; npm install --save riophae/vue-treeselect 2、实现&#xff1a; <el-form ref&qu…

深入了解RPA业务流程自动化的关键要素

在RPA业务流程自动化实施过程中&#xff0c;哪些因素起着至关重要的作用&#xff1f;这其实没有一个通用的答案&#xff0c;每一个RPA业务流程自动化的部署&#xff0c;都需要结合具体场景去调整&#xff0c;并且进行全面的规划。 首当其冲是要关注以下几点&#xff1a; 1、专…

想提高工作效率?这里有五款实用工具推荐

​ 想提高工作效率&#xff1f;这里有五款实用工具推荐&#xff01;搜索一下就能下载到。 1.鼠标控制——MouseInc ​ MouseInc是一款创新的鼠标控制软件&#xff0c;可以让用户通过手势、声音或眼睛来控制鼠标的移动和点击。MouseInc利用了人工智能和计算机视觉的技术&#…

景联文科技语音数据标注:AUTO-AVSR模型和数据助力视听语音识别

ASR、VSR和AV-ASR的性能提高很大程度上归功于更大的模型和训练数据集的使用。 更大的模型具有更多的参数和更强大的表示能力&#xff0c;能够捕获到更多的语言特征和上下文信息&#xff0c;从而提高识别准确性&#xff1b;更大的训练集也能带来更好的性能&#xff0c;更多的数据…

九章云极DataCanvas多模态大模型平台实践与思考

导读&#xff1a;本文将分享九章云极DataCanvas在多模态大模型平台方面的一些思考和实践。 今天的介绍会围绕下面四点展开&#xff1a; 多模态大模型的历史发展 九章云极DataCanvas的多模态大模型平台 九章云极DataCanvas多模态大模型的实践 对未来的思考与展望 ▌多模态…

单片机点亮led管(01)

如何开始学习单片机 1&#xff1a;实践第一 2&#xff1a;补充必要的理论知识&#xff0c;缺什么补什么 3&#xff1a;做工程积累经验&#xff08;可以在网络上收集题目&#xff0c;也可以有自己的想法大胆的实验&#xff09; 单片机是什么&#xff1f; 单片机&#xff08…

活动回顾 | MatrixOne 在 SaaS 企服领域的应用解读

9月3日&#xff0c;矩阵起源产品总监邓楠于 QCon 北京站首次分享了 MatrixOne 在 SaaS 企服领域的应用&#xff0c;本篇文章将对该次分享进行回顾。 Part 1 MatrixOne 是什么&#xff1f; MatrixOne 是一款面向未来的超融合异构云原生数据库管理系统。通过全新从零自研的统一…