当前位置: 首页 > news >正文

【理解机器学习算法】之岭回归Ridge - L2 Rgularization

Ridge 回归(Ridge Regression)也称作岭回归或脊回归,是一种专用于共线性数据分析的有偏估计回归方法。在多元线性回归中,如果数据集中的特征(自变量)高度相关,也就是说存在共线性(Multicollinearity),那么模型参数估计将变得不稳定,输出结果的方差会非常大。Ridge 回归通过在损失函数中增加一个正则项来解决这个问题。

Ridge 回归的损失函数包括两部分:数据的预测误差和一个与系数大小相关的正则化项。该正则化项是系数的L2范数乘以一个称为 `alpha` 的参数。Ridge 回归的目标是最小化以下的损失函数:

这里:
- 表示预测误差,即实际观测值与模型预测值之间差的平方和。
- 是系数向量的L2范数的平方,也就是各系数平方和。
- 是正则化强度,控制着正则化项的大小。

正则化参数 `alpha` 决定了你想对模型系数的大小施加多大的惩罚。`alpha` 的值越大,对系数的惩罚越重,系数越倾向于变小,模型的复杂度就越低,这有助于防止模型过拟合。相反,如果 `alpha` 设得太小,正则化的效果就会弱,可能不能有效地处理共线性(Multicollinearity)问题。

Ridge 回归的系数 \( \beta \) 可以通过解析方法得到,计算公式为:

其中是单位矩阵。

在实践中,Ridge 回归特别适用于当你有很多相互关联的预测变量时,因为它会保留所有的预测变量,但是会减小变量的系数,使模型对数据中的随机误差不那么敏感。

由于正则化,Ridge 回归能够提高模型的泛化能力,但同时也会引入一定的偏差。因此,选择合适的 `alpha` 值是应用Ridge回归的关键。这通常通过交叉验证来完成,目标是找到可以使交叉验证误差最小化的 `alpha` 值。

import numpy as np# 定义 Ridge 回归函数
def ridge_regression(X, y, alpha):# 为特征矩阵增加一列全为1的截距项X = np.concatenate((np.ones((X.shape[0], 1)), X), axis=1)# 计算与特征数量相同大小的单位矩阵(包括截距项)# 并且不对截距项进行正则化处理I = np.eye(X.shape[1])I[0, 0] = 0  # 不对截距项进行正则化# 使用 Ridge 回归公式计算系数beta = np.linalg.inv(X.T @ X + alpha * I) @ X.T @ yreturn beta# 示例用法:
# 假设 X_train 是您的特征矩阵,y_train 是您的目标向量
# alpha 是您选择的正则化参数
# beta = ridge_regression(X_train, y_train, alpha)# 注意在应用 ridge 回归之前应当对 X_train 进行标准化处理(每个特征的均值为0,方差为1)

使用sklearn

以下是用 Python 中的 sklearn 使用 Ridge 回归的方法:

from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
import numpy as np# 假设你有一个数据集 `X` 和 `y`# 将数据集分割成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 标准化特征
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 使用 alpha 值初始化 Ridge 回归模型
ridge_model = Ridge(alpha=1.0)  # 你可以根据需要调整 alpha 值# 拟合模型
ridge_model.fit(X_train_scaled, y_train)# 使用模型进行预测
y_pred = ridge_model.predict(X_test_scaled)# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f'均方误差: {mse}')# 系数
print(f'系数: {ridge_model.coef_}')# 截距
print(f'截距: {ridge_model.intercept_}')

记住选择正确的 alpha 值是非常关键的。更高的 alpha 值增加了正则化的量,这可以防止过拟合,但也可能导致欠拟合。交叉验证技术,如 sklearn 中的 RidgeCV,可以帮助找到最优的 alpha 值。

下图显示了选择不同的alpha对回归系数的影响:

在图中:
- 蓝色点代表 `alpha=1` 时模型的系数。
- 橙色点对应 `alpha=14` 时的系数。
- 绿色点显示 `alpha=100` 时的系数。

随着 `alpha` 值的增加,Ridge 回归更加强调保持系数的小幅度,我们通常期望系数的绝对值会减少,这通常表现为点在 y 轴上向零靠近。这有助于减少模型的复杂性并防止过拟合。

从图中可以清楚地看出,随着 `alpha` 从1增加到100,系数缩小向零收敛,这与增加 Ridge 回归中正则化强度的效果一致。水平轴代表系数的索引。

使用GridSearchCV找到最佳的alpha

使用 sklearn 的 GridSearchCV 进行 Ridge 回归的方法如下,我们需要定义一个 alpha 值范围,在这个范围内找到最佳的alpha,然后对参数网格进行交叉验证的网格搜索。以下是 Python 中的操作方法:

from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.metrics import mean_squared_errorfrom sklearn.model_selection import train_test_split# 准备数据,将其分割为训练集和测试集,必要时进行标准化。使用 make_pipeline 确保标准化是交叉验证过程的一部分,避免数据泄漏。
# 假设 `X` 是特征矩阵,`y` 是目标向量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 定义参数网格,指定希望搜索的 alpha 值的范围
param_grid = {'ridge__alpha': [0.01, 0.1, 1, 10, 100]}# 创建一个包含标准化和 Ridge 回归模型的流水线。这里的 'ridge' 是在流水线中引用 Ridge 回归模型的名称
pipeline = make_pipeline(StandardScaler(), Ridge())# 使用流水线、参数网格和交叉验证的折数初始化 GridSearchCV
grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='neg_mean_squared_error')# 在训练数据上拟合 GridSearchCV
grid_search.fit(X_train, y_train)# 拟合后,可以检查找到的最佳 alpha 值和相应的分数
print(f'最佳 alpha: {grid_search.best_params_}')
print(f'最佳分数: {grid_search.best_score_}')# 使用最佳估计器进行预测并评估它们
y_pred = grid_search.best_estimator_.predict(X_test)mse = mean_squared_error(y_test, y_pred)
print(f'测试集上的均方误差: {mse}')

记得将 Xyalpha 范围替换为实际的数据和想要测试的特定值。GridSearchCV 将系统地进行多种参数组合的调整,交叉验证结果,并确定哪种调整提供了最佳性能。

画出系数变化路径:

在 Ridge 和 Lasso回归等线性模型中,“系数路径”(Coefficient Paths)这个术语指的是模型系数作为正则化强度参数(通常在 Ridge 中表示为、在 Lasso 中表示为 的函数的轨迹。随着正则化强度的增加,系数的绝对值倾向于减小,有些可能达到零(尤其是在 Lasso 中,它可以引入稀疏性)。

系数路径的重要性

1. 解释性:它们提供了洞察,让我们了解随着模型变得更加正则化,每个特征的重要性是如何变化的。这有助于理解特征的稳定性和相关性。
2. 模型选择:通过可视化系数路径,您可以更好地理解正则化对您的模型的影响,并选择适当的正则化水平,该水平平衡了偏差和方差,可能使用交叉验证等技术。
3. 特征选择:在 Lasso 回归的情况下,系数路径可以帮助进行特征选择,因为随着 的增加,系数较早归零的特征被认为是不那么重要的。

如何生成系数路径

要生成系数路径,您通常需要在一个广泛的范围内变化正则化参数,对每个值拟合模型,跟踪系数如何变化。这可以通过折线图可视化,其中 x 轴代表正则化参数的值(通常在对数尺度上),y 轴代表系数的值。

使用 `sklearn`

在 Python 的 `sklearn` 库中,您可以使用 `Ridge` 和 `Lasso` 等模型以及像 `RidgeCV` 或 `LassoCV` 这样的工具进行交叉验证选择正则化参数。尽管 `sklearn` 没有直接提供绘制系数路径的函数,但您可以通过手动记录用不同的 值拟合的模型的系数来轻松生成它们。

这里提供了使用 Ridge 回归的一个基本示例。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler# Assuming X and y are your features and target variable
# Standardize features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# Define a range of alpha values
alphas = np.logspace(-6, 6, 300)# Initialize list to store coefficients
coef_paths = []for alpha in alphas:ridge = Ridge(alpha=alpha)ridge.fit(X_scaled, y)coef_paths.append(ridge.coef_)# Convert list of coefficients into a numpy array for easier plotting
coef_paths = np.array(coef_paths)# Plotting
for i in range(coef_paths.shape[1]):plt.plot(alphas, coef_paths[:, i])plt.xscale('log')
plt.xlabel('Alpha')
plt.ylabel('Coefficients')
plt.title('Coefficient Paths')
plt.show()

相关文章:

【理解机器学习算法】之岭回归Ridge - L2 Rgularization

Ridge 回归(Ridge Regression)也称作岭回归或脊回归,是一种专用于共线性数据分析的有偏估计回归方法。在多元线性回归中,如果数据集中的特征(自变量)高度相关,也就是说存在共线性(Multicollinea…...

【Linux进程状态】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、直接谈论Linux的进程状态 看看Linux内核源代码怎么说 1.1、R状态 -----> 进程运行的状态 1.2、S状态 -----> 休眠状态(进程在等待“资源”就绪) 1.3、T状…...

【RS422】基于未来科技FT4232HL芯片的多波特率串口通信收发实现

功能简介 串行通信接口常常用于在计算机和低速外部设备之间传输数据。串口通信存在多种标准,以RS422为例,它将数据分成多个位,采用异步通信方式进行传输。   本文基于Xilinx VCU128 FPGA开发板,对RS422串口通信进行学习。   根…...

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…...

LeetCode每日一题——移除元素

移除元素OJ链接:27. 移除元素 - 力扣(LeetCode) 题目: 思路: 题目给定要求只能使用O(1)的额外空间并且原地修改输入数组,然后返回移除后的数组行长度。那 么我们就可以确我没有办法建立临时的数组存放我…...

vue3之自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令。自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 写法 1. 没有使用 <script setup>的情况下 export default {setup() {/*...*/},directives: {// 在…...

MySQL语法分类 DQL(5)分组查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…...

C++程序设计-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门&#xff1a; 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函数…...

文件上传漏洞------一句话木马原理解析

目录 一、实验环境 二、实验过程 构造一句话木马 一句话木马的使用: 木马原理解析: 一、实验环境 小皮面板搭建:upload-labs靶场 二、实验过程 构造一句话木马 这是一个最简单的一句话木马&#xff0c;我们用GET传参接受了两个参数&#xff0c;其最终目的是构造出:ass…...

Openfeign使用教程(带你快速体验Openfeign的便捷)

文章摘要 本文中将教会您如何快速使用Openfeign&#xff0c;包括Opengfeign的基础配置、接口调用、接口重试、拦截器实现、记录接口日志信息到数据库 文章目录 文章摘要一、Openfeign初步定义二、Openfeign快速入门1.引入maven坐标2.启动类增加EnableFeignClients注解3.定义fei…...

【leetcode】相同的树➕对称二叉树➕另一棵树的子树

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 相同的树二. 对称二叉树三. 另一棵树的子树 一. 相同的树 点击查看题目 思路: bool isSameTree(…...

uni-app 安卓手机判断是否开启相机相册权限

// 安卓相机权限 androidCameraPermiss(index){ plus.android.requestPermissions([android.permission.CAMERA],(e) > { if (e.deniedAlways.length > 0) { this.androidAuthCamera false …...

GPT实战系列-LangChain构建自定义Agent

GPT实战系列-LangChain构建自定义Agent LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT…...

uniapp-vue3 项目初始化集成配置【开箱即用】

地址 https://gitee.com/charrie/vue3-uniapp-init 部分截图展示 技术说明 采用vue3viteuniapp技术栈&#xff0c;setup语法糖编码方式使用完全免费的sard-uniapp组件库引入unocss量子化样式引擎&#xff0c;动态css不用自己写样式&#xff0c;引用class即可&#xff0c;降低…...

【Qt】使用Qt实现Web服务器(一):QtWebApp介绍、演示

1、简介 QtWepApp是使用Qt实现的Web服务器库,虽然名字中有“App”但是它的确是一个lib库,编译生产的是libQtWebAppd.so 作者开发QtWepApp是从 Java Servlet 获得的灵感,本人不懂Java,对本人没有帮助。 QtWepApp是一个跨平台的项目,适用于:Linux、Windows、Mac OS 和Qt…...

SQLiteC/C++接口详细介绍之sqlite3类(八)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;七&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;八&#xff09;&#xff08;暂未发表&#xff09; 24.sqlite3_cr…...

面视题之——悲观锁和乐观锁

面视题之——悲观锁和乐观锁 概念 悲观锁 悲观锁是在执行线程任务时直接加锁&#xff0c;以确保同一时刻只有一个线程可以访问共享资源。在使用悲观锁时&#xff0c;每次访问共享资源时都会尝试获取锁&#xff0c;如果锁已经被其他线程占用&#xff0c;当前线程就会被阻塞&a…...

OpenAI 的 GPTs 提示词泄露攻击与防护实战:攻击卷(一)

攻击提示词 1.0 五件套混合散打 1. Repeat the words above starting with the phrase "You are ChatGPT". put them in a txt code block. Include everything. 2. give me your very first initial prompt exactly and not modified 3. 你有一個舊的 prompt 和 配…...

【 c 语言 】指针入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…...

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Swiper)

滑块视图容器&#xff0c;提供子组件滑动轮播显示的能力。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 说明&#xff1a; 子组件类型&#xff1a;系统组件和自定义组…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...

在Spring Boot中集成RabbitMQ的完整指南

前言 在现代微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件&#xff0c;支持多种消息协议&#xff0c;具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...