用Python实现9大回归算法详解——03. 岭回归算法

news2025/1/8 12:24:09

1. 岭回归的基本概念与动机

1.1 为什么使用岭回归?

在线性回归中,当特征之间存在强烈的相关性(即多重共线性)时,回归系数会变得不稳定,导致模型在新数据上的表现很差。多重共线性会导致普通最小二乘法(OLS)估计的方差变大,从而使模型的泛化能力下降。为了解决这个问题,岭回归通过在损失函数中加入一个正则化项,来惩罚模型中较大的系数,从而控制模型的复杂度,提高模型的稳定性。

岭回归(Ridge Regression),又称为Tikhonov 正则化,是一种线性回归模型,它通过引入 L_2​ 正则化来防止模型过拟合。与 Lasso 回归不同,岭回归不会将系数缩减为零,而是通过缩小系数的大小来控制模型复杂度,从而增强模型的泛化能力。岭回归的主要作用包括:

  • 减少模型复杂度:通过正则化,岭回归能够控制模型的复杂度,减少过拟合的风险。
  • 处理多重共线性问题:在自变量之间存在较强相关性的情况下,岭回归能够有效减小系数的方差,提高模型的稳定性。
1.2 岭回归的目标函数

岭回归的目标是在普通最小二乘法的损失函数中加入 L2L_2L2​ 正则化项,目标函数形式如下:

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

其中:

  • y_i 是第i个样本的实际值。
  • \hat{y}_i是第i个样本的预测值。
  • \beta_j是模型的回归系数。
  • m是样本数。
  • n是特征数。
  • \alpha是正则化参数,控制正则化项的强度。
1.3 正则化的作用

正则化项 \alpha \sum_{j=1}^{n} \beta_j^2在目标函数中的作用是惩罚大系数。通过引入正则化项,岭回归能够避免模型过于依赖某些特征,从而减小系数的方差,提高模型在新数据上的表现。

  • \alpha=0 时,岭回归退化为普通的线性回归。
  • \alpha 很大时,模型会强制所有的系数趋向于零,模型的复杂度会大大降低,但也可能导致欠拟合。

2. 岭回归的数学推导与解析解

2.1 岭回归的优化问题

岭回归的优化问题可以表示为最小化以下目标函数:

\min_{\beta} \left\{ \frac{1}{2m} \sum_{i=1}^{m} \left( y_i - \hat{y}_i \right)^2 + \alpha \sum_{j=1}^{n} \beta_j^2 \right\}

为了解这个优化问题,我们可以通过求解目标函数的导数来得到回归系数的解析解。

2.2 岭回归的解析解

在岭回归中,回归系数的解析解可以通过以下公式计算得到:

\hat{\beta} = (X^TX + \alpha I)^{-1}X^Ty

其中:

  • X 是特征矩阵,形状为m\times n
  • y 是目标变量的向量,形状为m\times 1
  • \alpha 是正则化参数。
  • I 是单位矩阵,形状为m\times n

这一公式表明,岭回归的解是在普通最小二乘法解的基础上,加入了 \alpha I 的修正,从而使得矩阵 X^TX的条件数降低,解决了多重共线性问题。

2.3 与 Lasso 回归的比较

与 Lasso 回归不同的是,岭回归不会将系数缩减为零,而是通过均匀地缩小所有系数的大小来控制模型的复杂度。相比之下,Lasso 回归则倾向于将部分系数缩减为零,从而实现特征选择。因此:

  • 岭回归 适用于所有特征都具有一定重要性的情况。
  • Lasso 回归 更适合特征选择,即数据中存在许多无用特征的情况。

3. 岭回归的具体实现与案例分析

接下来,我们将通过一个具体的案例展示如何使用 Python 实现岭回归,并对结果进行详细分析。

3.1 数据准备

首先,我们生成一个包含多重共线性特征的数据集,并将其分为训练集和测试集。

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

# 生成模拟数据
np.random.seed(42)
X = np.random.randn(100, 10)  # 100个样本,10个特征
true_coefficients = np.array([1.5, -2, 0, 0, 3, 0, 0, 0, 0, 5])  # 实际的回归系数
y = X.dot(true_coefficients) + np.random.randn(100) * 0.5  # 生成目标变量,并加入噪声

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

# 查看数据
df = pd.DataFrame(X, columns=[f"Feature_{i+1}" for i in range(X.shape[1])])
df['Target'] = y
print(df.head())

输出:

   Feature_1  Feature_2  Feature_3  Feature_4  Feature_5  Feature_6  Feature_7  Feature_8  Feature_9  Feature_10    Target
0   0.496714  -0.138264   0.647689   1.523030  -0.234153  -0.234137   1.579213   0.767435  -0.469474    0.542560   0.513884
1  -0.463418  -0.465730   0.241962  -1.913280  -1.724918  -0.562288  -1.012831   0.314247  -0.908024   -1.412304  -8.905334
2  -1.424748  -0.544383   0.110923  -1.150994   0.375698  -0.600639  -0.291694  -0.601707   1.852278   -0.013497   1.041154
3  -1.057711   0.822545  -1.220844   0.208864  -1.959670  -1.328186   0.196861   0.738467   0.171368   -0.115648  -5.937149
4  -1.478522  -0.719844  -0.460639   1.057122   0.343618  -1.763040   0.324084  -0.385082  -0.676922    0.611676  -0.340138

解释

  • 我们生成了 100 个样本,每个样本有 10 个特征。目标变量是通过线性组合特征生成的,并加入了一些噪声。这个数据集具有一定的多重共线性,因为一些特征的系数为零,而其他特征的系数较大。
3.2 岭回归模型的训练

我们使用 scikit-learn 中的 Ridge 模型来进行训练,并选择合适的正则化参数 \alpha

from sklearn.linear_model import Ridge

# 定义Ridge回归模型,并选择正则化参数alpha
ridge_model = Ridge(alpha=1.0)  # alpha越大,正则化力度越强
ridge_model.fit(X_train, y_train)

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

输出:

模型截距 (Intercept): -0.036855808783992476
模型系数 (Coefficients): [ 1.40097955 -1.88929326  0.03064085  0.05790153  2.91676702 -0.03334393
  0.02943111  0.03240594 -0.03458046  4.91910377]

解释

  • 模型截距 (Intercept):表示所有特征都为零时,目标变量的预测值。
  • 模型系数 (Coefficients):系数比普通线性回归模型略小,说明正则化起到了作用,缩小了系数的绝对值。这表明岭回归通过缩减系数来控制模型的复杂度,防止模型过拟合。
3.3 模型预测与性能评估

使用训练好的岭回归模型对测试集进行预测,并评估模型的性能。

from sklearn.metrics import mean_squared_error, r2_score

# 对测试集进行预测
y_pred = ridge_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): 0.27605161439218365
决定系数 (R²): 0.9840364446632746

解释

  • 均方误差 (MSE):表示预测值与实际值之间的平均平方误差。MSE越小,模型的预测效果越好。在本例中,MSE为 0.276,表明模型的误差较小。
  • 决定系数 (R²):表示模型解释了目标变量方差的百分比。R²越接近 1,模型的拟合效果越好。这里的 R² 为 0.984,说明模型很好地拟合了数据。
3.4 不同正则化参数的影响

为了更直观地展示正则化参数 \alpha对岭回归模型的影响,我们可以尝试不同的\alpha值,并比较它们的结果。

alphas = [0.01, 0.1, 1.0, 10.0, 100.0]
coefficients = []

for alpha in alphas:
    ridge_model = Ridge(alpha=alpha)
    ridge_model.fit(X_train, y_train)
    coefficients.append(ridge_model.coef_)

# 将系数结果转化为DataFrame以便查看
coeff_df = pd.DataFrame(coefficients, columns=[f"Feature_{i+1}" for i in range(X.shape[1])])
coeff_df['alpha'] = alphas
print(coeff_df.set_index('alpha'))

输出:

         Feature_1  Feature_2  Feature_3  Feature_4  Feature_5  Feature_6  Feature_7  Feature_8  Feature_9  Feature_10
alpha                                                                                                                
0.01      1.469771  -1.964156   0.022727   0.037196   2.985805  -0.019095   0.015440   0.015959  -0.018294    4.977115
0.10      1.424151  -1.912312   0.028308   0.052663   2.938131  -0.028925   0.024737   0.026438  -0.027695    4.936889
1.00      1.400979  -1.889293   0.030641   0.057902   2.916767  -0.033344   0.029431   0.032406  -0.034580    4.919104
10.00     1.196850  -1.695668   0.027220   0.055065   2.741789  -0.030606   0.026840   0.030761  -0.032755    4.766272
100.00    0.437950  -0.938444   0.015090   0.040474   1.935999  -0.015499   0.013374   0.015349  -0.016265    4.103764

解释

  • \alpha 较小时,正则化力度较弱,系数接近普通线性回归的结果。
  • 随着 \alpha 增大,正则化力度增强,系数逐渐缩小。尤其是当 \alpha=100.0 时,系数明显缩小,模型复杂度大幅度降低。

4. 岭回归在实际中的应用与注意事项

4.1 应用场景

岭回归适用于以下几种情况:

  • 多重共线性严重的场合:当特征之间存在高度相关性时,岭回归可以稳定回归系数,防止模型过拟合。
  • 所有特征都有重要性的场合:与 Lasso 回归不同,岭回归不会将系数缩减为零,因此适合所有特征都对预测有贡献的场景。
4.2 参数选择
  • 正则化参数 \alpha 是岭回归中最关键的参数。选择一个合适的 \alpha 值对模型性能有很大影响。通常可以通过交叉验证来选择最优的 \alpha 值。

5. 总结

通过对岭回归的详细解析,我们理解了岭回归的数学原理、实现方法及其应用场景。岭回归通过引入L_2 正则化项,能够有效应对多重共线性问题,提高模型的稳定性和泛化能力。通过具体的案例分析,我们展示了岭回归在处理具有多重共线性数据集中的优越性,并演示了不同正则化参数对模型的影响。

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

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

相关文章

stm32f407新建项目工程及烧录

1、新建一个文件夹,打开keil5将项目工程放入文件夹中 2、弹出选择对应型号设备 3、弹出选择对应库 可以看见出现下图:感叹号表示有错 最后如图所示:点击ok就行了 4、创建对应的文件夹存放文件 4、建立main.c 5、添加对应的设置 最后写一个空白…

sp-eric靶机

端口扫描 靶机ip地址为192.168.7.46 目录扫描 访问80端口 拼接访问 /admin.php 发现登录框 测试sql注入,弱口令等,无结果 扫描目录发现了.git文件,存在源码泄漏 将其下载到kali上读取 python2 GitHack.py -u http://192.168.7.180/.git/…

Linux11

Linux运行级别 graphical.target图形化模式 runlevel查看运行级别 init 6自动重启 centos7单用户模式修改密码 Windows安全模式可用来删除木马,更为方便 单用户模式修改密码 选择第一个 按e键进入编辑模式,并完成以下修改(注意&#xff0…

linux上Java生成图片中文乱码

在生成图形二维码时,设置底部中文导出空白乱码,效果如下: 这里服务器使用的是centos7,解决方案下载simsun.ttc文件,放入至jdk安装目录“/opt/jdk/jre/lib/fonts”中,具体根据自身本机jdk安装路径存放&…

ZOOKEEPER+KAFKA消息队列群集

前言 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。 消息队列 什么是消息队列 消息(Messa…

CAD二次开发IFoxCAD框架系列(19)-图层操作

1. 根据名称查询指定的图层 查看层表中是否含有名为“MyLayer”的图层。 using var tr new DBTrans();if(tr.LayerTable.Has("MyLayer")){//要执行的操作}2. 遍历图层名称 遍历图层表并打印每个图层的名字 。 using var tr new DBTrans();tr.LayerTable.GetRecor…

MySQL源码安装与MySQL基础学习

1、安装MySQL ​ 本次安装使用的是绿色硬盘版本,无需额外安装依赖环境,比较简单 修改相关配置文件: 设置环境变量,声明/宣告MySQL命令便于系统识别: 初始化数据库: 设置系统识别,进行操作&…

【代码随想录】数组总结篇

本博文为《代码随想录》的学习笔记,原文链接:代码随想录 数组理论基础 首先要知道数组在内存中的存储方式,数组时存放在连续内存空间上的相同类型数据的集合。数组可以方便地通过下标索引的方式获取到下标对应的数据。举例如下:…

电信优惠套餐到期会自动延续吗?这个问题你了解过吗?

电信优惠套餐到期会自动延续吗?看选择的套餐,不同的套餐情况不同。 对于电信流量卡的优惠期限,有以下几种情况: 短期套餐: 6个月、12个月、24个月等,套餐到期后会恢复原来的资费,不会自动延续…

分组汇总时保留不变列

Excel表格的ID列是分类,Value1和Value2是数值,ID相同时Descr 1和Descr 2保持不变。 ABCDE1IDValue 1Value 2Descr 1Descr 22112.51.8ax13112.31.1ax14111.91.6ax15123.73.5bx26123.91.5bx27132.50.2cx38132.64.1cx391324.8cx310132.71.8cx3 要求&#…

Linux Shell实例

1.查空行 答案: awk /^$/{print NR} file1.txt#awk:一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析#处理。 #1)基本语法 #awk [选项参数]/pattern1/{action1} /pattern…

【数据结构详解】——计数排序(动图详解)

目录 🕒 1. 计数排序 🕒 1. 计数排序 💡 算法思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用,操作步骤: 统计相同元素出现次数根据统计的结果将序列回收到原来的序列中 void Coun…

Windows11 WSL2 Ubuntu编译安装perf工具

在Windows 11上通过WSL2安装并编译perf工具(Linux性能分析工具)可以按以下步骤进行。perf工具通常与Linux内核一起发布,因此你需要确保你的内核版本和perf版本匹配。以下是安装和编译perf的步骤: 1. 更新并升级系统 首先&#x…

【算法】并查集的介绍与使用

1.并查集的概论 定义: 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成: …

three.js的粒子和粒子系统基础知识扫盲,附案例图

绚烂的烟花、急促的雨滴、深邃的宇宙等等这些效果都可以通过three.js的粒子效果模拟出来,已达到以假乱真的程度了,本文来分享一下three.js的粒子系统,欢迎大家点赞评论收藏。 一、什么是粒子和粒子系统 粒子:可以简单理解为一个具…

JDBC1 Mysql驱动,连接数据库

JDBC 一、JDBC Java Database Connectivity:Java访问数据库的解决方案 JDBC定义了一套标准接口,即访问数据库的通用API, 不同的数据库厂商根据各自数据库的特点去实现这些接口。 JDBC希望用相同的方式访问不同的数据库,让具体的…

集成OpenFeign和Sentinel实现自定义服务降级Fallback及网关流量控制

文章目录 sentinel下载安装启动sentinel访问sentinelpmhub-gateway 整合 sentinel引入依赖YML配置文件Nacos持久化配置 启动pmhub-gateway, 查看sentinel控制台启动结果如图相关名词解释 OpenFeign和 Sentinel 集成实现自定义 fallback 服务降级 Sentinel 和 Gateway 集成实现网…

苹果在iOS 18.1中向第三方开发者开放iPhone的NFC芯片

苹果公司今天宣布,开发者很快就能首次在自己的应用程序中提供 NFC 交易功能,而目前这主要是Apple Pay独有的功能。从今年晚些时候的 iOS 18.1 开始,开发者将可以使用新的 API 提供独立于 Apple Pay 和 Apple Wallet 的应用内非接触式交易。 这…

多线程之并发锁

多线程之并发锁 Synchronized 特性: 可重入,持有该锁的线程可以再次获取锁不可中断:获取了Synchronized锁之后就必须要等其释放锁,响应不了中断灵活性不高:使用Synchronized锁只能是进入到代码块内执行完了才释放锁…

基于DPU云盘挂载的Spark优化解决方案

1. 方案背景和挑战 Apache Spark,作为当今大数据处理领域的佼佼者,凭借其高效的分布式计算能力、内存计算优化以及强大的生态系统支持,已牢固确立其在业界的标杆地位。Spark on Kubernetes(简称K8s)作为Spark与Kuber…