机器学习——线性回归(LinearRegression)

Python 线性回归详解:从原理到实战

线性回归(Linear Regression)是机器学习中最基础也是最重要的算法之一,广泛应用于预测分析领域,例如房价预测、销售额预测等。本文将带你从理论出发,用 Python 手把手实现线性回归,助你迈出机器学习实战第一步。


一、线性回归是什么?

线性回归是一种用于预测目标变量(因变量)与一个或多个特征变量(自变量)之间关系的模型,其核心思想是拟合一条“最佳直线”:

y=w1​x1​+w2​x2​+⋯+wn​xn​+b

其中:

  • y:预测值

  • x1​,x2​,…,xn:特征

  • w1​,w2​,…,wn​:系数(权重)

  • b:截距项


二、使用 sklearn 实现一元线性回归

我们从简单的一元线性回归入手,使用 scikit-learn 库实现。

先创建一个csv数据:
import csv# 数据
data = [["广告投入", "销售额"],[29, 77],[28, 62],[34, 93],[31, 84],[25, 59],[29, 64],[32, 80],[31, 75],[24, 58],[33, 91],[25, 51],[31, 73],[26, 65],[30, 84]
]# 创建 CSV 文件并写入数据
with open('test1.csv', 'w', newline='', encoding='utf-8') as csvfile:writer = csv.writer(csvfile)writer.writerows(data)

实现一元线性回归:

此代码看似长,其实是因为打印了很多数据和注释,为了让初学者加深了解。

实际作用代码就几行

import pandas as pd
from sklearn.linear_model import LinearRegression
import numpy as npdata = pd.read_csv("data.csv")
# 准备训练数据:X为特征矩阵(所有列除了"销售额"),y为目标变量("销售额")
X = data.drop("销售额",axis=1)  # 特征矩阵
y = data[["销售额"]]           # 目标变量# 创建线性回归模型实例
# 使用特征矩阵X和目标变量y训练线性回归模型
lr_model = LinearRegression()
lr_model.fit(X,y)# 计算"广告投入"和"销售额"两列之间的相关系数矩阵
corr = data[["广告投入","销售额"]].corr()   # 关系系数矩阵
print(corr)
print("-----")# 计算模型在训练数据上的拟合优度(R²值),评估模型性能
score = lr_model.score(X,y)
print(f"模型拟合优度(R²): {score}")# 获取模型参数:a为自变量系数(斜率),b为截距(偏置)
a = lr_model.coef_
b = lr_model.intercept_
print(f"自变量系数: {a}")
print(f"截距: {b}")# 打印线性回归方程
print(f"线性回归模型为: y = {a[0][0]:.2f}x1 + {b[0]:.2f}")# 预测广告投入为28时的销售额
print(f"当广告投入为28时,预测销售额为: {lr_model.predict([[28]])}")import matplotlib.pyplot as plt
# 生成用于绘制回归线的新数据点(广告投入范围从24到39)
# 使用模型预测新数据点对应的销售额
x_new = np.arange(20, 40).reshape(-1, 1)
y_new = lr_model.predict(x_new)
# 绘制回归线
plt.plot(x_new, y_new, '--', color='#1F77B4', linewidth=2)
# 绘制散点图
plt.scatter(X,y)
plt.show()


三、多元线性回归示例

如果有多个特征变量:

创建数据:
import csvdata = [["体重", "年龄", "血压收缩"],[76.0, 50, 120],[91.5, 20, 141],[85.5, 20, 124],[82.5, 30, 126],[79.0, 30, 117],[80.5, 50, 125],[74.5, 60, 123],[79.0, 50, 125],[85.0, 40, 132],[76.5, 55, 123],[82.0, 40, 132],[95.0, 40, 155],[92.5, 20, 147]
]with open('test2.csv', 'w', newline='') as csvfile:writer = csv.writer(csvfile)writer.writerows(data)

多元线性回归示例:

import pandas as pd
from sklearn.linear_model import LinearRegression# 导入数据
data = pd.read_csv("test2.csv", encoding='gbk', engine='python')# 打印相关系数矩阵
corr = data[["体重", "年龄", "血压收缩"]].corr()
print("相关系数矩阵:")
print(corr)# 第二步,估计模型参数,建立回归模型
lr_model = LinearRegression()
x = data[['体重', '年龄']]
y = data['血压收缩']# 训练模型
lr_model.fit(x, y)# 第四步,对回归模型进行检验
score = lr_model.score(x, y)  # 利用 score 方法获取模型拟合优度(R²)
print("模型拟合优度(R²):", score)# 第五步,利用回归模型进行预测
print("预测结果 1:", lr_model.predict([[80, 60]]))
print("预测结果 2:", lr_model.predict([[70, 30], [70, 20]]))# 获取自变量系数和截距
a = lr_model.coef_
b = lr_model.intercept_
print("线性回归模型为: y = {:.2f}x1 + {:.2f}x2 + {:.2f}".format(a[0], a[1], b))


四、模型评估:R² 分数

线性回归模型的评估通常使用决定系数 R2:

r2 = model.score(X, y)
print(f"模型 R² 分数: {r2:.2f}")
  • R2=1:完美预测

  • R2=0:模型没有预测能力

  • R2<0:预测还不如使用平均值


五、相关系数矩阵

相关系数矩阵(Correlation Matrix)是描述多个变量之间两两线性相关程度的矩阵,通常使用皮尔逊相关系数(Pearson Correlation Coefficient)来衡量。

一、皮尔逊相关系数公式

皮尔逊相关系数 rrr 公式如下:

其取值范围为:

  • r=1:完全正相关

  • r=−1:完全负相关

  • r=0:无线性关系

二、相关系数的解释

相关系数范围线性相关强度解释
0.9 ~ 1.0极强正相关几乎严格线性关系
0.7 ~ 0.9强正相关明显线性趋势
0.5 ~ 0.7中等正相关有一定线性趋势
0.3 ~ 0.5弱正相关稍有线性趋势
0.0 ~ 0.3极弱或无相关几乎无线性关系
< 0负相关越小,反向关系越强


六、几点注意事项

  1. 特征缩放:当特征尺度差异较大时,应使用 StandardScaler 进行归一化或标准化。

  2. 共线性问题:特征之间高度相关可能导致模型不稳定。

  3. 异常值:极端值会显著影响回归线。

  4. 残差分析:拟合后应分析残差是否符合正态分布。


七、总结

  • 线性回归是回归分析的入门基础;

  • 使用 sklearn.linear_model.LinearRegression 可以快速构建模型;

  • 可以可视化预测结果和分析模型性能;

  • 推荐在实际应用中注重数据预处理、特征选择与残差分析。

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

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

相关文章

H.264视频的RTP有效载荷格式(翻译自:RFC6184 第5节 RTP有效载荷格式)

RTP协议格式 RFC地址&#xff1a;https://datatracker.ietf.org/doc/html/rfc6184 RTP报头的格式在RFC3550中指定 0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1------------------------…

秒级构建消息驱动架构:描述事件流程,生成 Spring Cloud Stream+RabbitMQ 代码

在消息驱动架构开发中&#xff0c;Spring Cloud Stream 与 RabbitMQ 的整合往往需要手动配置绑定器、定义消息通道、编写消费逻辑&#xff0c;流程繁琐且易出错。而飞算JavaAI 作为高效的 IDE 插件&#xff0c;能让开发者通过自然语言描述事件流程&#xff0c;自动生成可运行的…

从零搭建3D激光slam框架-基于mid360雷达节点实现

目录 MID360雷达介绍 雷达SDK编译与测试 雷达驱动的修改、编译与测试 去ros的编译方式 livox_ros_driver2的代码框架介绍 livox_ros_driver2编译 雷达IP配置文件介绍 常见问题介绍 优化改进 MID360雷达介绍 1 硬件介绍&#xff1a; livox-mid360是大疆的一款非重复扫描…

【Spring】日志级别的分类和使用

文章目录介绍日志级别的分类日志级别的顺序日志级别的使用介绍 日志级别代表着日志信息对应问题的严重性&#xff0c;为了更快的筛选符合目标的日志信息 试想一下这样的场景&#xff0c;假设你是一家 2 万人公司的老板&#xff0c;如果每个员工的日常工作和琐碎的信息都要反馈…

【C++】第十九节—一文万字详解 | AVL树实现

好久不见&#xff0c;我是云边有个稻草人&#xff0c;偶尔中二博主与你分享C领域专业知识^(*&#xffe3;(oo)&#xffe3;)^ 《C》—本篇文章所属专栏—持续更新中—欢迎订阅~喔 目录 一、AVL的概念 二、AVL树的实现 2.1 AVL树的结构 2.2 AVL树的插入 【AVL树插入⼀个值…

【Delphi】快速理解泛型(Generics)

Delphi的泛型&#xff08;generics&#xff09;是一项强大的特性&#xff0c;它使得代码更加灵活、类型安全&#xff0c;并且可以实现各种通用的数据结构和算法。下面我将为你详细介绍Delphi中的泛型&#xff0c;包括基本概念、语法、常用实例&#xff0c;以及使用建议。Delphi…

Java Stream流的使用

获取Stream流 单列集合直接使用stream()方法 List<String> list Arrays.asList("a", "b", "c"); Stream<String> stream list.stream(); // 获取顺序流数组使用静态方法Arrays.stream() String[] array {"a", "b&…

前端实现添加水印,两种方式

一、自定义指令的方式/*需求&#xff1a;给整个页面添加背景水印。思路&#xff1a;1、使用 canvas 特性生成 base64 格式的图片文件&#xff0c;设置其字体大小&#xff0c;颜色等。2、将其设置为背景图片&#xff0c;从而实现页面或组件水印效果使用&#xff1a;设置水印文案…

使用LangChain构建法庭预定智能体:结合vLLM部署的Qwen3-32B模型

文章目录 技术架构概述 核心实现步骤 1. 配置vLLM与Qwen3-32B模型 2. 定义工具(Tools) 3. 构建Agent系统 4. 运行与交互 关键技术亮点 1. 工具调用自动化 2. Hermes解析器优势 3. 对话记忆管理 实际运行效果 性能优化建议 扩展应用场景 总结 在人工智能应用开发中,如何让大语…

vscode开发微信小程序

下载插件 插件下载位置 1.微信小程序开发工具 2.vscode weapp api 3.vscode wxml 4.vscode-wechat 创建项目 终端运行命令 cd 到要创建项目的目录执行命令&#xff1a;vue create -p dcloudio/uni-preset-vue test test就是项目名称 选择默认模板&#xff0c;回车 出现下图这…

板凳-------Mysql cookbook学习 (十二--------3_3)

https://cloud.tencent.com/developer/article/1454690 侯哥的Python分享 # 创建节点 class Node(object):def __init__(self,item):self.element itemself.next None# 创建单链表类 class SingleLinkList(object):def __init__(self):self.header Noneself.length 0# 1、判…

Flutter开发实战之CI/CD与发布流程

第12章:CI/CD与发布流程 在前面的章节中,我们学习了Flutter应用开发的各个方面,从基础UI构建到复杂的状态管理,从网络请求到本地存储。现在,我们将探讨一个同样重要但常被忽视的话题:如何将我们精心开发的应用高效、可靠地发布到各大应用商店。 想象一下,你花费了数月…

ElasticSearch 的3种数据迁移方案

在实际工作中&#xff0c;我们经常会遇到需要将自建的 Elasticsearch 迁移上云&#xff0c;或者迁移到其他 ES 集群的情况。这时&#xff0c;选择合适的数据迁移方案就显得尤为重要啦。今天就来给大家介绍三种常用的迁移方案&#xff0c;分别是 COS 快照、logstash 和 elastics…

MySQL 中的“双路排序”与“单路排序”:原理、判别与实战调优

一句话导读 ORDER BY 不能走索引时&#xff0c;MySQL 会在 Server 层做一次 filesort。内部实现分 单路&#xff08;全字段&#xff09; 与 双路&#xff08;rowid&#xff09; 两种&#xff1b;了解它们的触发条件、判别方法与调优思路&#xff0c;是 SQL 性能优化的必修课。一…

OpenLayers 综合案例-信息窗体-弹窗

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

GaussDB 开发基本规范

1 集中式1.1数据库价值特性推荐特性分类特性列表说明表类型PARTITION表数据分区存储引擎行存储按行顺序存储表&#xff0c;建议点查&#xff0c;增删改操作较多场景下使用事务事务块显式启动事务单语句事务不显式启动事务&#xff0c;单语句即为事务扩容在线扩容扩节点和数据重…

工作中使用git可能遇到的场景

1.main历史发布版本出问题需要查看&#xff0c;怎么切换历史发布版本&#xff1f;git reset --hard commitid 更新本地库和代码2.A分支的代码已经做过一些功能&#xff0c;想迁移到B分支当前在A分支git checkout B &#xff08;切换到B分支&#xff09;git cherry-pick A的com…

【Spring AI】本地大型语言模型工具-Ollama

Ollama 是一个专注于在本地运行大型语言模型&#xff08;LLM&#xff09;的工具&#xff0c;支持多种开源模型&#xff08;如 Llama 3、Mistral、Gemma 等&#xff09;&#xff0c;提供简单的命令行和 API 接口。<dependency><groupId>org.springframework.ai</…

电机S加减速

STM32步进电机S型加减速算法_stm32___build__-2048 AI社区 以上&#xff0c;电机加减速说的非常清楚&#xff0c;收藏点赞&#xff01;

一、初识 Linux 与基本命令

作者&#xff1a;IvanCodes 日期&#xff1a;2025年7月28日 专栏&#xff1a;Linux教程 思维导图 一、Linux 简介 1.1 什么是 Linux? Linux 是一种自由、开源的类Unix操作系统内核&#xff0c;由林纳斯托瓦兹 (Linus Torvalds) 在1991年首次发布。我们通常所说的 “Linux 系统…