当前位置: 首页 > 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;系统组件和自定义组…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...