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

[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_modelmodel = 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_ + bplt.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 PolynomialFeaturesX_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 + dplt.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.hqwc.cn/news/139396.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于内存的分布式NoSQL数据库Redis(六)AOF设计

文章目录 知识点21:Redis持久化:AOF设计知识点22:Redis持久化:AOF实现附录一:Jedis Maven依赖 知识点21:Redis持久化:AOF设计 目标:掌握Redis的AOF持久化机制 路径 step1&#xff1…

竞赛选题 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 🔥 优质竞赛项目系列,今天…

小程序的console中出现:。。。不在以下 request 合法域名列表中,请参考文档:。。。的报错解决

报错效果: 其实这个报错不代表自己的代码有问题 但是本强迫症研究了一下,按照以下方法关掉就不会显示这个报错了。 点微信开发者工具中的右上角的详情。点本地设置。勾选不校验。。。HTTPS证书。 即可关闭该报错:

企业c#语言源代码防泄密解决方案

在当今数字化时代,企业的核心业务往往依赖于软件应用程序。为了保护企业的知识产权和敏感信息,源代码的保密至关重要。对于制造类企业尤其是智能制造业来讲,最近几年是高速发展的时期,很多公司在做工厂流水线设备时,就…

使用Premiere、PhotoShop和Audition做视频特效

今天接到一个做视频的任务,给一个精忠报国的视频,要求:   ①去掉人声,就是将唱歌的人声去掉,只留下伴奏;   ②截图视频中的横幅,做一个展开的效果,类似卷纸慢慢展开;…

UE4 快速入门 1

安装 https://www.unrealengine.com/zh-CN/download Launcher ue4.23 editor visual studio 2019 社区版 文档学习

ssm+vue基本微信小程序的今日菜谱系统

项目介绍 谈到外出就餐,我们除了怕排队,也怕这家餐厅的服务员不够用,没人为我们点餐,那么一餐饭排队一小时,点餐恐怕也要花个半小时,这样不仅给消费者的用餐体验大打折扣同时也给商家的口碑造成了严重负面…

Git reset current branche here操作请谨慎停留3秒

Idea git弹框请谨慎操作 下面几个选项要慎选 reset操作说明 soft,将版本回滚,工作区不动,暂存区原来的回滚后和回滚前的版本差异。 mixed,将版本回滚,回滚到了所有 git add 和 git commit 的命令执行之前。暂存区变…

一步步掌握Java IO的奥秘:深入学习BIO、NIO,实现客户端与服务器通信

众所周知,Java IO是一个庞大的知识体系,很多人在学习的过程中会感到迷茫,甚至学得一头雾水,而我也曾有同样的困惑。因此,本文的目标是帮助大家一步一步深入学习Java IO,从BIO开始,然后引出JDK1.…

2023年中国彩色滤光片竞争格局、市场规模及行业技术趋势分析[图]

彩色滤光片指实现液晶彩色显示的重要组件,该膜片可使经液晶控制的光线被过滤为红、蓝、绿三种基本色素点阵,并最终实现彩色显示画面的显示,彩色滤光片与LCD面板为一对一对应关系,即大尺寸彩色滤光片用于生产大尺寸LCD面板&#xf…

小程序开发——认识小程序

目录 1.小程序简介 2.小程序开发准备 3.小程序开发工具的使用 4.小程序项目目录结构 5.小结 1.小程序简介 小程序是一个不需要下载安装就可使用的应用,它实现了应用触手可及的梦想,用户扫一扫二维码或者搜索名称即可打开应用,用户不用…

看完就会,从抓包到接口测试的全过程解析【1500字保姆级教程】

一、为什么抓包 1、从功能测试角度 通过抓包查看隐藏字段 Web 表单中会有很多隐藏的字段,这些隐藏字段一般都有一些特殊的用途,比如收集用户的数据,预防 CRSF 攻击,防网络爬虫,以及一些其他用途。这些隐藏字段在界面…