回归算法详解

回归算法详解

回归分析是一类重要的机器学习方法,主要用于预测连续变量。本文将详细讲解几种常见的回归算法,包括线性回归、岭回归、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_error

plt.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 中的实现。不同的回归算法适用于不同的应用场景,通过合理选择算法,可以在实际应用中取得良好的预测效果。希望本文能帮助你更好地理解和应用回归算法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu-基础工具配置

基础工具配置 点击左下角 在弹出界面中点击 以下命令都是在上面这个界面执行(请大家注意空格) 命令输入完后,回车键就是执行,系统会提示输入密码(就是你登录的密码) 1.安装net工具 :(ifconfi…

uniapp 微信小程序自定义分享图片

场景&#xff1a;微信小程序用户&#xff0c;点击小程序里商品的分享按钮时&#xff0c;想要不同的商品展示不用的分享内容&#xff0c;比如分享图片上展示商品的图片、价格等信息。分享的UI图如下&#xff1a; 实现方法&#xff1a; 1. 分享按钮&#xff1a;<button open-…

Mysten Labs宣布推出Walrus:一种去中心化存储和数据可用性协议

Walrus是为区块链应用和自主代理提供的创新去中心化存储网络。Walrus存储系统今天以开发者预览版的形式发布&#xff0c;面向Sui开发者征求反馈意见&#xff0c;并预计很快会向其他Web3社区广泛推广。 通过采用纠删编码创新技术&#xff0c;Walrus能够快速且稳健地将非结构化数…

Day10—Spark SQL基础

Spark SQL介绍 ​ Spark SQL是一个用于结构化数据处理的Spark组件。所谓结构化数据&#xff0c;是指具有Schema信息的数据&#xff0c;例如JSON、Parquet、Avro、CSV格式的数据。与基础的Spark RDD API不同&#xff0c;Spark SQL提供了对结构化数据的查询和计算接口。 Spark …

人工智能指数报告

2024人工智能指数报告&#xff08;一&#xff09;&#xff1a;研发 前言 全面分析人工智能的发展现状。 从2017年开始&#xff0c;斯坦福大学人工智能研究所&#xff08;HAI&#xff09;每年都会发布一份人工智能的研究报告&#xff0c;人工智能指数报告&#xff08;AII&…

网络安全:入侵检测系统的原理与应用

文章目录 网络安全&#xff1a;入侵检测系统的原理与应用引言入侵检测系统简介IDS的工作原理IDS的重要性结语 网络安全&#xff1a;入侵检测系统的原理与应用 引言 在我们的网络安全系列文章中&#xff0c;我们已经涵盖了从SQL注入到端点保护的多个主题。本篇文章将探讨入侵检…

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…

探究布局模型:从LayoutLM到LayoutLMv2与LayoutXLM

LAYOUT LM 联合建模文档的layout信息和text信息&#xff0c; 预训练 文档理解模型。 模型架构 使用BERT作为backbone&#xff0c; 加入2-D绝对位置信息&#xff0c;图像信息 &#xff0c;分别捕获token在文档中的相对位置以及字体、文字方向、颜色等视觉信息。 2D位置嵌入 …

天地图 uniapp使用笔记

官网地址&#xff1a;天地图API 效果&#xff1a; <template><view><!-- 显示地图的DOM节点 --><view id"container" class"content"></view><!-- END --><!-- 数据显示 --><h3>城市名称(IP属地)&#x…

rollup学习笔记

一直使用的webpack,最近突然想了解下rollup,就花点时间学习下. 一,什么是rollup? rollup 是一个 JavaScript 模块打包器&#xff0c;可以将小块代码编译成大块复杂的代码,比如我们的es6模块化代码,它就可以进行tree shaking,将无用代码进行清除,打包出精简可运行的代码包. 业…

[Linux] 系统管理

全局配置文件 用户个性化配置 配置文件的种类 alias命令和unalias命令 进程管理 进程表

AI视频智能监管赋能城市管理:打造安全有序的城市环境

一、方案背景 随着城市化进程的加速和科技的飞速发展&#xff0c;街道治安问题日益凸显&#xff0c;治安监控成为维护社会稳定和保障人民安全的重要手段。当前&#xff0c;许多城市已经建立了较为完善的治安监控体系&#xff0c;但仍存在一些问题。例如&#xff0c;监控设备分…

基于PHP的奶茶商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的奶茶商城系统 一 介绍 此奶茶商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;ajax实现数据交换。系统角色分为用户和管理员。系统在原有基础上添加了糖度的选择。 技术栈 phpmysqlajaxphpstudyvscode 二 功能 用户…

深入了解RTMP推流技术:视频汇聚EasyCVR低延迟与高稳定性分析

RTMP&#xff08;Real Time Messaging Protocol&#xff09;视频推流技术&#xff0c;作为音视频传输领域的关键技术之一&#xff0c;已经在直播、视频会议、在线教育等多个场景中得到了广泛应用。RTMP以其独特的优势&#xff0c;为实时音视频传输提供了高效、稳定的解决方案。…

前端框架中的路由(Routing)和前端导航(Front-End Navigation)

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介前端框架中的路由&#xff08;Routing&#xff09;和前端导航&#xff08;Front-End Navigation&#xff09;1. 路由&#xff08;Routing&#xff09;1.1 定义1.2 路由的核心概念1.2.1 路由表&#xff08;Route Table&#xff09;1…

Renesas MCU之IO应用介绍

目录 概述 1 软硬件环境 1.1 软件版本信息 1.2 硬件接口介绍 2 FSP配置项目 2.1 项目参数配置 2.2 生成项目框架 3 IO OutPut功能 3.1 IO输出功能实现 3.2 IO输出功能测试代码 4 IO InPut功能 4.1 IO Input功能实现 4.2 测试代码实现 5 测试结果 概述 本文主要…

springboot应用cpu飙升的原因排除

1、通过top或者jps命令查到是那个java进程&#xff0c; top可以看全局那个进程耗cpu&#xff0c;而jps则默认是java最耗cpu的&#xff0c;比如找到进程是196 1.1 top (推荐)或者jps命令均可 2、根据第一步获取的进程号&#xff0c;查询进程里那个线程最占用cpu&#xff0c;发…

Redis的缓存击穿与解决

缓存击穿问题也叫热点Key问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的Key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 Redis实战篇 | Kyles Blog (cyborg2077.github.io) 目录 解决方案 互斥锁 实现 逻辑过期 实现 解决方案…

FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg

《FFmpeg开发实战&#xff1a;从零基础到短视频上线》一书的“第11章 FFmpeg的桌面开发”介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序&#xff0c;那么Windows系统通过Visual Studio开发桌面程序也是很常见的&#xff0c;下面就介绍如何在Visual Studio的C工程中集成F…

Day13—大语言模型

定义 大语言模型&#xff08;Large Language Models&#xff09;是一种基于深度学习的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;用于处理和生成人类语言文本。 一、认识NLP 什么是NLP ​ NLP&#xff08;Natural Language Processing&#xff09;&#xff0…