回归算法详解

回归算法详解

回归分析是一类重要的机器学习方法,主要用于预测连续变量。本文将详细讲解几种常见的回归算法,包括线性回归、岭回归、Lasso 回归、弹性网络回归、决策树回归和支持向量回归(SVR),并展示它们的特点、应用场景及其在 Python 中的实现。

一 什么是回归分析?

回归分析是一种统计方法,用于确定因变量(目标变量)和自变量(预测变量)之间的关系。回归分析的目标是建立一个模型,通过自变量预测因变量。

二 常见回归算法

1. 线性回归

线性回归是最基本的回归方法,假设因变量和自变量之间存在线性关系。线性回归的目标是找到一条直线,使得所有数据点到该直线的距离之和最小。
线性回归模型的方程为:
y = β 0 + β 1 x 1 + β 2 x 2 + … + β n x n + ϵ \ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n + \epsilon \  y=β0+β1x1+β2x2++βnxn+ϵ 
其中, β 0 \ \beta_0  β0 是截距, β i \ \beta_i  βi 是自变量 x i \ x_i  xi 的回归系数, ϵ \ \epsilon  ϵ 是误差项。

损失函数

最小化均方误差(Mean Squared Error, MSE):
MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \ \text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 \  MSE=n1i=1n(yiy^i)2 

特点
  • 简单易懂:线性回归是最简单的回归模型,易于解释和实现。
  • 计算速度快:适用于大规模数据集。
  • 易于扩展:可以通过添加多项式项、交互项等扩展为更复杂的模型。
应用场景

线性回归适用于因变量和自变量之间存在线性关系的场景,例如经济学中的供求关系、工程中的温度与压力关系等。

2. 岭回归

岭回归(Ridge Regression)是一种线性回归的变种,通过在损失函数中加入 L 2 \ L2  L2 正则化项来防止过拟合。

岭回归的损失函数为:
Loss = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 + λ ∑ j = 1 n β j 2 \ \text{Loss} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^n \beta_j^2 \  Loss=n1i=1n(yiy^i)2+λj=1nβj2 
其中, λ \lambda λ是正则化参数。

特点
  • 防止过拟合:通过正则化项控制模型的复杂度,防止过拟合。
  • 处理共线性:适用于自变量之间存在较强相关性的情况。
  • 参数选择:需要调优正则化参数 λ \lambda λ
应用场景

岭回归适用于高维数据集和自变量之间存在共线性的场景,如基因表达数据分析、文本数据分类等。

3. Lasso 回归

Lasso 回归(Least Absolute Shrinkage and Selection Operator Regression)通过加入 L 1 L1 L1 正则化项来防止过拟合,并能够进行特征选择。

Lasso 回归的损失函数为:
Loss = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 + λ ∑ j = 1 n ∣ β j ∣ \ \text{Loss} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^n |\beta_j| \  Loss=n1i=1n(yiy^i)2+λj=1nβj 

特点
  • 特征选择:通过 L 1 L1 L1 正则化,将不重要的特征系数收缩为零,从而实现特征选择。
  • 防止过拟合:与岭回归类似,Lasso 回归也能够控制模型的复杂度。
  • 参数选择:需要调优正则化参数 λ \lambda λ
应用场景

Lasso 回归适用于高维数据和特征选择的场景,如基因数据分析、文本分类、图像处理等。

4. 弹性网络回归

弹性网络回归(Elastic Net Regression)结合了岭回归和 Lasso 回归的正则化项,能够同时进行特征选择和防止过拟合。

弹性网络回归的损失函数为:
Loss = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 + λ 1 ∑ j = 1 n ∣ β j ∣ + λ 2 ∑ j = 1 n β j 2 \ \text{Loss} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 + \lambda_1 \sum_{j=1}^n |\beta_j| + \lambda_2 \sum_{j=1}^n \beta_j^2 \  Loss=n1i=1n(yiy^i)2+λ1j=1nβj+λ2j=1nβj2 

特点
  • 特征选择与防止过拟合:结合了 Lasso 和岭回归的优点,能够进行特征选择并防止过拟合。
  • 适用于高维数据:在高维数据集上表现良好。
  • 参数选择:需要调优两个正则化参数 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2
应用场景

弹性网络回归适用于高维数据和特征选择的场景,尤其是当自变量之间存在高度相关性时。

5. 决策树回归

决策树回归通过构建决策树来进行回归,能够捕捉非线性关系。

算法步骤
  1. 将数据集划分为若干子集。
  2. 对每个子集,选择一个特征及其取值进行划分,使得划分后的均方误差最小。
  3. 递归地对每个子集进行上述划分,直到满足停止条件。
特点
  • 捕捉非线性关系:决策树能够处理非线性和交互效应。
  • 易于解释:决策树的结构直观易懂,便于解释。
  • 易受过拟合影响:需要剪枝等技术来防止过拟合。
应用场景

决策树回归适用于数据集特征和目标变量之间存在非线性关系的场景,如市场预测、医学诊断等。

6. 支持向量回归(SVR)

支持向量回归(Support Vector Regression, SVR)是支持向量机的扩展,用于回归分析。SVR 寻找一个函数,使得大多数数据点都在一个容忍范围内。

SVR 的优化目标为:
min ⁡ w , b , ξ , ξ ∗ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ( ξ i + ξ i ∗ ) \ \min_{w,b,\xi,\xi^*} \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n (\xi_i + \xi_i^*) \  w,b,ξ,ξmin21w2+Ci=1n(ξi+ξi) 
约束条件为:
y i − ( w ⋅ x i + b ) ≤ ϵ + ξ i , ( w ⋅ x i + b ) − y i ≤ ϵ + ξ i ∗ ; ξ i , ξ i ∗ ≥ 0 \ y_i - (w \cdot x_i + b) \leq \epsilon + \xi_i \ , \ (w \cdot x_i + b) - y_i \leq \epsilon + \xi_i^* \ ; \ \xi_i, \xi_i^* \geq 0  yi(wxi+b)ϵ+ξi , (wxi+b)yiϵ+ξi ; ξi,ξi0
其中, ϵ \ \epsilon  ϵ 是容忍范围, ξ i \ \xi_i  ξi ξ i ∗ \ \xi_i^*  ξi是松弛变量, C C C 是惩罚参数。

特点
  • 处理非线性关系:通过核方法,SVR 能够处理复杂的非线性关系。
  • 鲁棒性强:对噪声和异常值具有较强的鲁棒性。
  • 参数选择复杂:需要调优核函数和惩罚参数 C C C
应用场景

SVR 适用于处理复杂非线性数据的场景,如股票价格预测、能源消耗预测等。

三 回归算法的 Python 实现

下面通过 Python 代码实现上述回归算法,并以一个示例数据集展示其应用。

导入库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_errorplt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

生成示例数据集

# 生成示例数据集
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)plt.scatter(X, y, color='blue')
plt.title('Sample Data')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

在这里插入图片描述

线性回归

# 线性回归
linear_reg = LinearRegression()
linear_reg.fit(X_train, y_train)
y_pred = linear_reg.predict(X_test)print('Linear Regression MSE:', mean_squared_error(y_test, y_pred))plt.scatter(X_test, y_test, color='blue')
plt.plot(X_test, y_pred, color='red')
plt.title('Linear Regression')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

在这里插入图片描述

岭回归

# 岭回归
ridge_reg = Ridge(alpha=1.0)
ridge_reg.fit(X_train, y_train)
y_pred = ridge_reg.predict(X_test)print('Ridge Regression MSE:', mean_squared_error(y_test, y_pred))plt.scatter(X_test, y_test, color='blue')
plt.plot(X_test, y_pred, color='red')
plt.title('Ridge Regression')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

在这里插入图片描述

Lasso 回归

# Lasso 回归
lasso_reg = Lasso(alpha=0.1)
lasso_reg.fit(X_train, y_train)
y_pred = lasso_reg.predict(X_test)print('Lasso Regression MSE:', mean_squared_error(y_test, y_pred))plt.scatter(X_test, y_test, color='blue')
plt.plot(X_test, y_pred, color='red')
plt.title('Lasso Regression')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

在这里插入图片描述

弹性网络回归

# 弹性网络回归
elastic_net_reg = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net_reg.fit(X_train, y_train)
y_pred = elastic_net_reg.predict(X_test)print('Elastic Net Regression MSE:', mean_squared_error(y_test, y_pred))plt.scatter(X_test, y_test, color='blue')
plt.plot(X_test, y_pred, color='red')
plt.title('Elastic Net Regression')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

在这里插入图片描述

决策树回归

# 决策树回归
tree_reg = DecisionTreeRegressor()
tree_reg.fit(X_train, y_train)
y_pred = tree_reg.predict(X_test)print('Decision Tree Regression MSE:', mean_squared_error(y_test, y_pred))plt.scatter(X_test, y_test, color='blue')
plt.scatter(X_test, y_pred, color='red')
plt.title('Decision Tree Regression')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

在这里插入图片描述

支持向量回归(SVR)

# 支持向量回归
svr_reg = SVR(kernel='rbf', C=100, epsilon=0.1)
svr_reg.fit(X_train, y_train)
y_pred = svr_reg.predict(X_test)print('SVR MSE:', mean_squared_error(y_test, y_pred))plt.scatter(X_test, y_test, color='blue')
plt.scatter(X_test, y_pred, color='red')
plt.title('Support Vector Regression')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

在这里插入图片描述

总结

回归分析是机器学习中的一类重要方法,用于预测连续变量。本文介绍了几种常见的回归算法,包括线性回归、岭回归、Lasso 回归、弹性网络回归、决策树回归和支持向量回归,并展示了它们的数学公式、特点、应用场景及其在 Python 中的实现。不同的回归算法适用于不同的应用场景,通过合理选择算法,可以在实际应用中取得良好的预测效果。希望本文能帮助你更好地理解和应用回归算法。

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

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

相关文章

Day9—Spark运行模式及RDD的创建

Spark概述 大数据开发的总体架构 可以看到,在数据计算层,作为Hadoop核心组成的MapReduce可以结合Hive通过类SQL的方式进行数据的离线计算(当然也可以编写独立的MapReduce应用程序进行计算);而Spark既可以做离线计算&a…

Spark SQL函数详解:案例解析(第8天)

系列文章目录 1- Spark SQL函数定义(掌握) 2- Spark 原生自定义UDF函数案例解析(掌握) 3- Pandas自定义函数案例解析(熟悉) 4- Apache Arrow框架案例解析(熟悉) 5- spark常见面试题…

vue+webrtc(腾讯云) 实现直播功能 pc端+移动端

Websocket实现私聊和群聊 1. websocket的概念 1.1. 全双工概念2. websocket实现聊天室 2.1. WebSocket API 2.1.1. 构造方法 2.1.1.1. 语法2.1.1.2. 参数2.1.1.3. 抛出异常2.1.2. 常量2.1.3. 属性2.1.4. 方法2.1.5. 事件3. websocket实现群聊或私聊或图片发送 3.1. 项目的最终…

CI /CD学习

CI/CD概述 CI/CD 是持续集成和持续交付/部署的缩写,旨在简化并加快软件开发生命周期。 持续集成(CI)是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付和/或持续部署(CD)是一个由两部分组成的过程…

02. Java操作系统的并发

1. 前言 本节内容是从操作系统的层面谈并发,本节课程我们需要掌握如下内容: 掌握并发编程的定义,并发编程的定义是了解并发的前提基础;从 CPU 谈并发诞生的意义,一切语言的基础都是操作系统,CPU 的并发与…

排序算法及源代码

堆排序: 在学习堆之后我们知道了大堆和小堆,对于大堆而言第一个节点就是对大值,对于小堆而言,第一个值就是最小的值。如果我们把第一个值与最后一个值交换再对最后一个值前面的数据重新建堆,如此下去就可以实现建堆排…

#01算法的复杂性

时间复杂度 public void print(int n){int a 1; //执行1次for(int i0;i<n;i){//执行n次System.out.println(ai);//执行n次} } 该算法的时间复杂度是O(2n1) 大O会忽略常数、低阶和系数&#xff0c;最终记作O(n); 如果算法的执行时间和数据规模n无关&#xff0c;则是常量阶…

Apple - Authorization Services Programming Guide

本文翻译整理自&#xff1a;Authorization Services Programming Guide&#xff08;更新日期&#xff1a;2011-10-19 https://developer.apple.com/library/archive/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/d…

JavaScript基础部分知识点总结(Part3)

函数的概念 1. 函数的概念 在JS 里面&#xff0c;可能会定义非常多的相同代码或者功能相似的代码&#xff0c;这些代码可能需要大量重复使用。虽然for循环语句也能实现一些简单的重复操作&#xff0c;但是比较具有局限性&#xff0c;此时我们就可以使用JS 中的函数。函数&…

Tensorflow入门实战 T05-运动鞋识别

目录 一、完整代码 二、训练过程 &#xff08;1&#xff09;打印2行10列的数据。 &#xff08;2&#xff09;查看数据集中的一张图片 &#xff08;3&#xff09;训练过程&#xff08;训练50个epoch&#xff09; &#xff08;4&#xff09;训练结果的精确度 三、遇到的问…

安装VSCode创建注册表出错,RegCreateKey错误码5

今天对VSCode进行做更新安装&#xff0c;谁知道安装到最后弹出下面这么个错误 找到windows下管用的一种解决办法&#xff1a; winR打开运行&#xff0c;输入 regedit找到错误提示中的路径&#xff0c;HKEY_CURRENT_USER\Software\Classes\VSCode.class\open (图中的错误注册表…

第 三 方 组 件 e l e m e n t - u i[Vue]

一、组件之间的传值 组件可以由内部的Data提供数据&#xff0c;也可以由父组件通过prop的方式传值。 兄弟组件之间可以通过Vuex等统一数据源提供数据共享 第一种 Movie.vue <template><div><h1>我才不要和你做朋友</h1></div></template&…

嵌入式开发十九:SysTick—系统定时器

在前面实验中我们使用到的延时都是通过SysTick进行延时的。 我们知道&#xff0c;延时有两种方式&#xff1a;软件延时&#xff0c;即CPU 循环等待产生的&#xff0c;这个延时是不精确的。第二种就是滴答定时器延时&#xff0c;本篇博客就来介绍 STM32F4 内部 SysTick 系统定时…

高德地图轨迹回放/轨迹播放

前言 本篇文章主要介绍高德地图的轨迹回放或播放的实现过程&#xff0c;是基于vue2实现的功能&#xff0c;同时做一些改动也是能够适配vue3的。其中播放条是用的是element UI中的el-slider组件&#xff0c;包括使用到的图标也是element UI自带的。可以实现轨迹的播放、暂停、停…

【windows|004】BIOS 介绍及不同品牌电脑和服务器进入BIOS设置的方法

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 ​ &#x1f3c5;阿里云ACE认证高级工程师 ​ &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社…

【ARM】如何通过Keil MDK查看芯片的硬件信息

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标&#xff1a; 解决在开发过程中对于开发项目所使用的的芯片的参数查看的问题 2、问题场景&#xff1a; 在项目开发过程中&#xff0c;经常需要对于芯片的时钟、寄存器或者一些硬件参数需要进行确认。大多数情况下是需…

wps-文档-js宏-批量修改表格格式

目录 前言开启JS宏我的脚本参考API文档 前言 由于需要修改word的表格的格式&#xff0c;一个一个的修改太慢了&#xff0c;所以需要通过宏的方式来修改&#xff0c;需要注意的是低版本可能没有JS宏… 开启JS宏 切换到工具–>点击开发工具 点击之后功能栏会变化成这样 选…

Dell戴尔灵越Inspiron 16 Plus 7640/7630笔记本电脑原装Windows11下载,恢复出厂开箱状态预装OEM系统

灵越16P-7630系统包: 链接&#xff1a;https://pan.baidu.com/s/1Rve5_PF1VO8kAKnAQwP22g?pwdjyqq 提取码&#xff1a;jyqq 灵越16P-7640系统包: 链接&#xff1a;https://pan.baidu.com/s/1B8LeIEKM8IF1xbpMVjy3qg?pwdy9qj 提取码&#xff1a;y9qj 戴尔原装WIN11系…

CFD笔记

CFD 定常流动与非定常流动 定常流动&#xff1a;流体流动过程中各物理量均与时间无关; 非定常流动&#xff1a;流体流动过程中某个或某些物理量与时间有关. 运动黏度 运动粘度定义&#xff1a; v μ ρ v \frac{\mu}{\rho} vρμ​&#xff0c;其中 μ \mu μ​表示粘度…

Node.js进阶——数据库

文章目录 一、步骤1、安装操作 MySQL数据库的第三方模块(mysql)2、通过 mysql 模块连接到 MySQL 数据库3、测试 二、操作 mysql 数据库1、查询语句2、插入语句3、插入语句快捷方式4、更新数据5、更新语句快捷方式6、删除数据7、标记删除 二、前后端的身份认证1、web开发模式1&a…