用Python实现9大回归算法详解——01. 线形回归算法

news2024/11/24 4:16:44

1. 线性回归的基本概念

线性回归是一种最基本的监督学习算法,用于预测因变量(目标变量)和一个或多个自变量(特征变量)之间的关系。线性回归假设因变量与自变量之间的关系是线性的,即可以用以下形式的线性方程来表示:

y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n + \epsilon

其中:

  • y 是因变量(目标变量)。
  • x_1 , x_2 ,..., x_n 是自变量(特征变量)。
  • \beta_0是截距项,表示当所有自变量为零时,因变量的值。
  • \beta_1,\beta_2 , \ldots , \beta_n 是回归系数,表示每个自变量对因变量的贡献。
  • \epsilon是误差项,表示模型无法解释的部分。

线性回归的目标是通过最小化误差项(通常使用最小二乘法)来找到最优的回归系数。

2. 线性回归的数学表达

在线性回归中,我们的目标是找到一组参数\beta来最小化实际值y与预测值 y\hat{}之间的差异。这可以通过最小化以下损失函数来实现:

\text{Loss} = \sum_{i=1}^{m} (y_i - \hat{y}_i)^2 = \sum_{i=1}^{m} \left(y_i - \left(\beta_0 + \sum_{j=1}^{n} \beta_j x_{ij}\right)\right)^2

其中:

  • m 是样本数。
  • n是特征数。
  • y_i是第 i 个样本的实际值。
  • \hat{y}_i是第i个样本的预测值。

通过求解这个损失函数,我们可以找到一组最优的\beta 值。

3. 线性回归的假设及适用场景

在线性回归中,有一些基本假设:

如果这些假设不满足,线性回归的估计可能会产生偏差或无效。   

  1. 线性关系:因变量与自变量之间呈线性关系。
  2. 独立性:误差项彼此独立,且自变量之间没有完全的线性关系(即无完全多重共线性)。
  3. 同方差性:误差项的方差在所有自变量的取值范围内是相同的(即无异方差性)。
  4. 正态性:误差项服从正态分布。
  5. 适用场景:
  • 回归问题:线性回归适用于回归任务,即预测连续值。
  • 特征与目标变量之间的关系是线性的:当特征与目标变量之间呈现出线性关系时,线性回归表现良好。
  • 高解释性需求:线性回归模型易于解释,适合需要高解释性的场景,如经济学、医学等领域。
  • 经济学:分析价格、需求、收入等经济变量之间的关系。
  • 医学研究:分析病人的特定指标(如血压、胆固醇水平)对健康结果(如心脏病发生率)的影响。
  • 社会科学:研究教育、就业、收入等社会变量之间的相互关系。

4. 线性回归的模型实现与解释

接下来,我们将通过详细的代码示例来展示线性回归的完整实现过程,并解释每一步的含义。

4.1 数据准备

我们创建一个模拟的房价数据集,其中包含房屋面积和房价的信息:

import pandas as pd
import numpy as np

# 创建模拟数据集
np.random.seed(42)
house_size = np.random.randint(500, 3500, 100)
house_price = house_size * 150 + np.random.randint(20000, 70000, 100)

df = pd.DataFrame({'Size': house_size, 'Price': house_price})

print(df.head())

输出:

   Size   Price
0  2744 446860
1  1023 181345
2  1739 291485
3  3245 515690
4   824 152060

解释:我们生成了100个样本,其中房屋面积和房价的关系大致为线性关系,加上了一些随机噪声。

4.2 数据可视化

在训练模型之前,我们可以先绘制数据的散点图,观察房屋面积与房价之间的关系:

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.scatter(df['Size'], df['Price'], color='blue', label='Data Points')
plt.xlabel('Size (square feet)')
plt.ylabel('Price (dollars)')
plt.title('House Size vs. Price')
plt.legend()
plt.show()

输出:

可视化解释:散点图展示了房屋面积与房价之间的关系。我们可以观察到,这些数据点大致呈现出线性趋势,这表明线性回归模型可能适合该数据集。

4.3 线性回归模型训练

我们使用 scikit-learn 库来训练一个线性回归模型:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 特征和目标变量
X = df[['Size']]
y = df['Price']

# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建并训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 模型系数
print("截距 (Intercept):", model.intercept_)
print("系数 (Coefficients):", model.coef_)

输出:

截距 (Intercept): 33915.96978319671
系数 (Coefficients): [150.70018091]

解释

  • 截距 (Intercept):表示房屋面积为零时,预测的房价。由于房屋面积为零没有实际意义,这个截距值主要反映了基础房价的偏移量。
  • 系数 (Coefficients):表示房屋面积对房价的影响。系数为150.70,表示每增加1平方英尺的面积,房价增加约150.70美元。
4.4 模型预测与评估

我们使用训练好的模型对测试集进行预测,并评估模型的性能:

from sklearn.metrics import mean_squared_error, r2_score

# 对测试集进行预测
y_pred = model.predict(X_test)

# 计算均方误差 (MSE) 和决定系数 (R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("均方误差 (MSE):", mse)
print("决定系数 (R²):", r2)

输出:

均方误差 (MSE): 272697924.26785064
决定系数 (R²): 0.9894277174311596

解释

  • 均方误差 (MSE):MSE表示预测值与实际值之间的平均平方差。MSE越小,模型的预测效果越好。在本例中,MSE为272697924,表示平均预测误差的平方为272697924美元的平方。
  • 决定系数 (R²):R²表示模型解释了多少目标变量的方差,取值范围为0到1。R²越接近1,模型的解释力越强。这里的R²为0.9894,表示模型解释了98.94%的房价变化,这表明模型有很强的解释力。
4.5 模型可视化与解释

我们可以通过绘图来直观地查看模型的拟合效果:

# 绘制训练数据点和线性回归拟合直线
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, color='blue', label='Training Data')
plt.plot(X_test, y_pred, color='red', linewidth=2, label='Regression Line')
plt.scatter(X_test, y_test, color='green', label='Test Data')
plt.xlabel('Size (square feet)')
plt.ylabel('Price (dollars)')
plt.title('Linear Regression: House Size vs. Price')
plt.legend()
plt.show()

输出:

可视化解释

  • 训练数据点(蓝色)测试数据点(绿色) 显示了房屋面积与房价之间的关系。
  • 线性回归拟合直线(红色) 表示模型对数据的拟合。红色的回归线显示了模型预测的趋势。

从图中可以看到,回归线很好地拟合了数据点,模型能够有效地捕捉到房屋面积与房价之间的线性关系。

5. 线性回归在多变量情况下的扩展

5.1 多元线性回归的概念

多元线性回归是线性回归的一种扩展形式,它用于建模多个自变量(特征)与一个因变量(目标变量)之间的关系。多元线性回归的模型形式为: 

y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n + \epsilon

其中:

  • y 是因变量(目标变量)。
  • x_1 , x_2 ,..., x_n 是自变量(特征变量)。
  • \beta_0是截距项,表示当所有自变量为零时,因变量的值。
  • \beta_1,\beta_2 , \ldots , \beta_n 是回归系数,表示每个自变量对因变量的贡献。
  • \epsilon是误差项,表示模型无法解释的部分。

多元线性回归能够处理多个特征之间的交互作用,对于更复杂的数据集更加有效。

5.2 多元线性回归的案例

假设我们在前面的房价预测模型中加入一个新的特征 Bedrooms(卧室数量),模型的形式如下:

# 添加一个新特征:卧室数量
np.random.seed(42)
bedrooms = np.random.randint(1, 5, 100)
df['Bedrooms'] = bedrooms

# 特征和目标变量
X = df[['Size', 'Bedrooms']]
y = df['Price']

# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建并训练多元线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 模型系数
print("截距 (Intercept):", model.intercept_)
print("系数 (Coefficients):", model.coef_)

输出:

截距 (Intercept): 39672.34623830688
系数 (Coefficients): [149.83279207 3681.84804698]

解释

  • 系数Size 的系数为 149.83,Bedrooms 的系数为 3681.85。这意味着每增加一个平方英尺的房屋面积,房价增加约149.83美元;每增加一个卧室,房价增加约3681.85美元。

6. 模型评估与诊断

6.1 残差分析

残差是实际值与预测值之间的差异。残差分析是评估模型是否符合线性回归假设的重要工具。

# 计算残差
residuals = y_test - y_pred

# 绘制残差图
plt.figure(figsize=(10, 6))
plt.scatter(y_pred, residuals, color='purple')
plt.axhline(y=0, color='red', linestyle='--')
plt.xlabel('Predicted Values')
plt.ylabel('Residuals')
plt.title('Residuals Plot')
plt.show()

输出:

解释:残差图用于检测模型假设的偏差。如果残差图中残差的分布无明显的模式,且围绕零线随机分布,则表明模型拟合较好。否则,可能表明模型中存在非线性关系或异方差性。

6.2 诊断图与多重共线性

多重共线性指的是自变量之间存在高度相关性,这会影响模型系数的稳定性和解释性。

import seaborn as sns
import statsmodels.api as sm

# 计算相关矩阵
corr_matrix = df[['Size', 'Bedrooms']].corr()

# 绘制热力图
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix')
plt.show()

 输出:

解释:相关矩阵热力图显示了特征之间的相关性。如果两个特征的相关性系数接近1或-1,说明它们存在多重共线性,可能需要进行处理,如删除一个特征或使用正则化模型。

7. 实际案例分析与讨论

7.1 案例背景

假设我们在经济学领域,研究家庭收入与消费支出之间的关系。数据集包含家庭收入、家庭规模、教育水平等特征,我们希望通过线性回归模型来预测家庭的消费支出。

7.2 数据准备与分割
# 创建模拟数据集
np.random.seed(42)
income = np.random.randint(20000, 100000, 100)
family_size = np.random.randint(1, 6, 100)
education = np.random.randint(0, 20, 100)
expenditure = 0.4 * income + 500 * family_size + 1000 * education + np.random.randint(2000, 10000, 100)

df = pd.DataFrame({'Income': income, 'Family_Size': family_size, 'Education': education, 'Expenditure': expenditure})

# 特征和目标变量
X = df[['Income', 'Family_Size', 'Education']]
y = df['Expenditure']

# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
7.3 线性回归模型训练与评估
# 创建并训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 模型系数
print("截距 (Intercept):", model.intercept_)
print("系数 (Coefficients):", model.coef_)

# 对测试集进行预测
y_pred = model.predict(X_test)

# 计算均方误差 (MSE) 和决定系数 (R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("均方误差 (MSE):", mse)
print("决定系数 (R²):", r2)

输出:

截距 (Intercept): 4741.315257611054
系数 (Coefficients): [ 0.40050739 486.51941711 996.39367697]
均方误差 (MSE): 5508260.485368153
决定系数 (R²): 0.9929702155916654

解释

  • 系数Income 的系数为 0.40,Family_Size 的系数为 486.52,Education 的系数为 996.39。这意味着家庭收入、家庭规模、教育水平都对消费支出有显著影响。
  • 决定系数 (R²):R²为0.993,表明模型解释了99.3%的消费支出变化,模型拟合效果非常好。
7.4 结果讨论与改进
  • 模型表现:该线性回归模型在预测家庭消费支出方面表现优异,R²接近1,MSE较低,表明模型误差较小。
  • 改进方向:可以进一步检查残差图,确保模型假设的正确性;如果发现非线性关系,可以考虑加入多项式特征或使用非线性模型进行建模。此外,可以尝试加入其他可能影响消费支出的变量,以进一步提升模型性能。

8. 总结

通过本次详细的解析,我们深入探讨了线性回归的数学原理、模型实现、假设条件、模型评估以及实际案例应用。线性回归作为一种经典的回归分析方法,具有广泛的应用场景和较强的解释性。然而,在线性回归的应用过程中,需注意模型假设的验证、多重共线性的处理以及模型的扩展性问题。通过合理地应用线性回归模型,可以帮助我们在数据分析与预测中取得良好的效果。

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

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

相关文章

写一个githubDemo

1.List组件 <template><div class"container"><!-- 展示用户列表 --><div class"row"><divv-show"info.users.length"v-for"(item, index) in info.users":key"item.id"><div class"…

使用Python对知识文本进行分块

使用大型语言模型时&#xff0c;切勿忽略文本分块的重要性&#xff0c;其对处理结果的好坏有重大影响。接下来介绍常用的一些文本分块方法。1.1 一般的文本分块方法 如果不借助任何包&#xff0c;直接按限制长度切分方案。 text " 我是一个名为 chatGLm3-68 的人工智能助…

wps云字库字体下载到电脑

下拉字体菜单栏--->查看更多云字体 进入后 云字库里的字体&#xff0c;都只能在wps在线使用。 但是&#xff0c;要想下载到自己的电脑上&#xff0c;安装到电脑系统字体库中&#xff0c;WIN7的字体安装系统路径&#xff1a;C:\Windows\Fonts&#xff0c;以供电脑软件adobe …

Spring IoCDI(上)--初识

1. IoC & DI ⼊⻔ 1.1 Spring 是什么 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场 景, 有着活跃⽽庞⼤的社区, 我们⽤⼀句更具体的话来概括Spring, 那就是: Spring 是包含了众多⼯具⽅法的 IoC 容器 1.1.1 什么是容器…

C#委托(入门)

1、语法 步骤 ①定义一个委托类型, 如Help ②委托类型实例化为委托实例 ③定义函数(与委托类型相匹配的) ④将函数交给委托实例使用 示例一 //方法一 void MyFunc1() {Console.WriteLine("Hello"); }//方法二 void MyFunc2() {Console.WriteLine("World&…

STM32总线和时钟树(速记版)

一、存储器结构 1.1 STM32内存结构 型号说明 以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff0c;其命名规则如下&#xff1a; ST 是公司名&#xff0c;意法半导体。M 代表Cortex-M内核。32 代表32位微控制器。 F103 是芯片系列。 R 代表引脚数…

算法基础知识——11种距离度量

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 前言&#xff1a;距离的作用 数据聚类&#xff1a;距离度量在聚类算法&#xff08;如K-means、层次聚类&#xff09;中用于衡量数据点之间的相似性或差异性&#xff0c;帮助确定聚类的中心和边界…

10款开源管理工具大比拼:哪个最适合您的团队?

国内外主流的 10 款开源项目管理系统对比&#xff1a;PingCode、Worktile、Gitee、开源中国 (OSChina)、禅道 (ZenTao)、OpenProject、Redmine、Leantime、MeisterTask、Freedcamp。 在选择合适的开源项目管理工具时&#xff0c;你是否感到困惑和不安&#xff1f;市场上众多的选…

Python | Leetcode Python题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; class Solution:def countBits(self, n: int) -> List[int]:bits [0]for i in range(1, n 1):bits.append(bits[i & (i - 1)] 1)return bits

SSTI模版注入(初步)

SSTI模版注入&#xff08;初步&#xff09; ssti可能造成任意文件读取和RCE远程控制后台系统 漏洞成因&#xff1a;渲染模版时&#xff0c;没有严格控制对用户的输入&#xff1b; 使用了危险的模版&#xff0c;导致用户可以混合flask程序进行交互。 flask是基于python开发的…

【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分

✨ 人生如梦&#xff0c;朝露夕花&#xff0c;宛若泡影 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…

Ubuntu系统安装CH340驱动

今天在使用USB转UART模块连接设备时发现我的Ubuntu虚拟机无法识别USB设备&#xff0c;这个模块使用的CH340芯片&#xff0c;在Windows主机中可以识别到串口并连接&#xff0c;所以初步判断为虚拟机中缺少ch340驱动。实际上自Linux内核版本2.6.24起&#xff0c;Linux主线内核已内…

云原生-Docker安全-容器逃逸系统内核漏洞(解决docker.com无法访问)

云原生-Docker安全-容器逃逸&系统内核漏洞 细节部分在权限提升章节会详解&#xff0c;常用&#xff1a; CVE-2016-5195 CVE-2019-16884 CVE-2021-3493 CVE-2021-22555 CVE-2022-0492 CVE-2022-0847 CVE-2022-23222 云原生-Docker安全-容器逃逸&docker版本漏洞 CVE…

基于Java的医院急诊系统

TOC springboot327基于Java的医院急诊系统 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛…

【中等】 猿人学web第一届 第7题 动态字体,随风漂移

文章目录 获取字体文件映射关系获取页面英雄排序python 代码 这道题是 动态字体文件加密&#xff0c;找出动态字体文件中对应数字相同规律即可 数据接口 https://match.yuanrenxue.cn/api/match/7 数据接口没有加密值 cookie字段也没有 获取字体文件映射关系 多次观察 字体文件…

2.2 Oracle与SQL Server简介

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

仿Muduo库实现高并发服务器——事件监控Poller模块

Poller模块在整个项目的使用 下面代码是对I/O复用接口函数的基本使用。 回顾上篇文章&#xff1a;事件监控管理模块 这个模块是将触发事件的描述符&#xff0c;给到外面&#xff0c;让外面去做对应的处理。 #define MAX_EPOLLEVENTS 1024 class Poller {private:int _epfd;s…

三级_网络技术_18_路由器的配置及使用

1.在Cisco路由器上用于永久保存路由器的开机诊断程序、引导程序和操作系统软件的存储器是()。 Flash NVRAM RAM ROM 2.在Cisco路由器中主要用来永久保存路由器的开机诊断程序、引导程序和操作系统&#xff0c;以完成路由器初始化进程的存储器是()。 RAM Disk Flash RO…

Linux平台使用OPUS对Audio PCM数据进行编解码

1&#xff09;Audio编解码入门级小知识&#xff0c;分享给将要学习或者正在学习Audio编解码开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 Opus编码是一个开源的音频编码格式&#xff0c;具…

ArduPilot二次开发零基础教程

文章目录 前言一、概述二、开发环境搭建三、多旋翼MAVROS自主控制接口四、无人船&#xff08;车&#xff09;MAVROS自主控制接口五、二次开发基础六、控制LED灯七、自定义串口驱动八、Guided控制接口九、输出自定义PWM信号十、添加自定义MAVLINK消息和QGC通信十一、自定义日志十…