回归与聚类算法系列④:岭回归

news2024/11/19 17:28:29

目录

1. 背景

2. 数学模型

3. 特点

4. 应用领域

5. 岭回归与其他正则化方法的比较

6、API

7、代码

8、总结


🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发。

🦅主页:@逐梦苍穹

📕回归与聚类算法系列

①:概念简述

②:线性回归

③:欠拟合与过拟合

🍔您的一键三连,是我创作的最大动力🌹

岭回归(Ridge Regression)是线性回归的一种变体,它在专业统计和机器学习领域中应用广泛。岭回归的核心目标是解决线性回归中的过拟合问题,并提高模型的泛化性能。

1. 背景

岭回归最早由统计学家Arthur E. Hoerl和Robert W. Kennard于1970年提出,是为了解决多重共线性(Multicollinearity)问题而诞生的。多重共线性是指在线性回归中,自变量之间存在高度相关性的情况,这会导致模型参数的估计不稳定,降低了模型的解释性能。

2. 数学模型

岭回归与线性回归类似,但在损失函数中引入了L2正则化项,用于惩罚模型参数的大小。

岭回归的数学模型如下所示:

Loss\hspace{0.1cm}Function = \sum_{i=1}^{n}(y_i - \beta_0 - \sum_{j=1}^{p}\beta_j x_{ij})^2 + \alpha\sum_{j=1}^{p}\beta_j^2

其中:

  • yi 是观测数据点(目标变量)。
  • xij 是输入特征矩阵的元素,表示第 i 个观测数据点的第 j 个特征。
  • β0 和 βj 是模型的参数,需要估计。
  • α 是岭回归的正则化参数,也称为正则化强度或惩罚参数。

损失函数的第一部分是最小二乘法的残差平方和,第二部分是L2正则化项。α是超参数,用于控制正则化的强度。较大的α值会导致模型参数趋于收缩,减小过拟合的风险。

3. 特点

  • 解决多重共线性:岭回归可以处理自变量之间的高度相关性,使得模型参数估计更稳定。
  • 增加模型复杂度:岭回归允许模型更复杂,因为正则化项允许参数取较大的值,但在不引入过拟合的情况下。
  • 参数缩减:岭回归的正则化项会使一些参数趋于零,实现了参数缩减(Parameter Shrinkage)。
  • 泛化能力提高:通过减小模型的方差,岭回归通常提高了模型在新数据上的泛化能力。

4. 应用领域

  • 经济学:用于经济数据建模,以预测经济变量之间的关系。
  • 生物统计学:用于基因表达分析和生物信息学领域,以处理高维数据。
  • 工程学:用于工程建模和控制系统设计,以改善模型的鲁棒性。
  • 金融学:用于资产定价和风险管理,以降低投资组合的风险。

5. 岭回归与其他正则化方法的比较

正则化力度越大,权重系数会越小

正则化力度越小,权重系数会越大

岭回归是一种L2则化方法,与L1正则化方法(如LASSO回归)不同,L1正则化可以导致参数稀疏性。选择哪种方法通常取决于具体问题和数据集的性质。

岭回归、LASSO回归和Elastic Net回归是三种常见的正则化线性回归方法,它们在处理多重共线性和过拟合问题时有不同的特点。下面是这三种方法之间的比较:

1. 岭回归(Ridge Regression):

  • 正则化项: 岭回归使用L2正则化项,即对模型参数的平方和进行惩罚。
  • 特点: 岭回归通过约束参数的平方和来控制参数的大小,使得模型参数趋于较小的值,但不会将参数压缩到零。
  • 解决的问题: 主要用于解决多重共线性问题和过拟合问题,可以保留所有特征,但对它们的权重进行缩减。
  • 稳定性: 对于高度相关的特征,岭回归能够给出相对稳定的参数估计。
  • 适用场景: 适用于特征之间存在相关性,但不希望丢弃特征的情况。

2. LASSO回归(Least Absolute Shrinkage and Selection Operator):

  • 正则化项: LASSO回归使用L1正则化项,即对模型参数的绝对值之和进行惩罚。
  • 特点: LASSO回归倾向于将不重要的特征的参数压缩到零,从而实现特征选择(Feature Selection)。
  • 解决的问题: 同样用于解决多重共线性和过拟合问题,但通常会导致一些特征的系数变为零,从而实现特征选择。
  • 稳定性: 在存在高度相关的特征时,LASSO回归可能会随机选择其中一个特征。
  • 适用场景: 适用于希望进行特征选择的情况,可以减少模型的复杂度。

3. Elastic Net回归:

  • 正则化项: Elastic Net回归结合了L1正则化项和L2正则化项,同时对模型参数的绝对值和平方和进行惩罚。
  • 特点: Elastic Net回归综合了岭回归和LASSO回归的优点,可以在解决多重共线性和过拟合问题的同时进行特征选择。
  • 解决的问题: 适用于综合考虑多重共线性和特征选择的问题。
  • 稳定性: 在存在高度相关的特征时,Elastic Net回归相对稳定,并可以选择一组相关性较高的特征。
  • 适用场景: 适用于需要综合考虑多个因素的情况,既希望减少特征数又需要保留相关性高的特征。

选择合适的正则化方法通常取决于具体问题和数据集的性质。如果特征之间存在高度相关性,但不希望进行特征选择,岭回归可能是一个良好的选择。如果需要进行特征选择,LASSO回归或Elastic Net回归可能更合适。不同方法之间的超参数需要进行调优,以获得最佳模型性能。

6、API

sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)

    具有l2正则化的线性回归

    alpha:正则化力度,也叫 λ

        λ取值:0~1 1~10

    solver:会根据数据自动选择优化方法

        sag:如果数据集、特征都比较大,选择该随机梯度下降优化

    normalize:数据是否进行标准化

        normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据

    Ridge.coef_:回归权重

    Ridge.intercept_:回归偏置

All last four solvers support both dense and sparse data. However,

only 'sag' supports sparse input when `fit_intercept` is True.

这段话解释了关于使用不同优化方法时对稠密(dense)和稀疏(sparse)数据以及fit_intercept参数的支持情况。

首先,这里提到的四种优化方法是用于岭回归模型的优化方法。它们分别是:

  1. auto: 这个选项会根据数据的大小和特征数自动选择最适合的优化方法。
  2. sag: 随机平均梯度下降(Stochastic Average Gradient Descent)方法,通常用于处理大型数据集和特征数较多的情况。
  3. 其他两种方法未在这段话中详细说明。

然后,这段话指出,这四种优化方法都支持处理稠密和稀疏数据。稠密数据是指数据集中的大多数元素都是非零的,而稀疏数据是指数据集中的大多数元素都是零的。这些优化方法可以适用于两种类型的数据。

有一个例外情况:当设置fit_intercept=True时,只有sag方法支持处理稀疏数据。这是因为当fit_intercept为True时,模型需要估计偏置(intercept),而sag方法是唯一支持在这种情况下使用稀疏输入数据的方法。其他方法在这种情况下可能会导致错误或不稳定的行为。

因此,如果你的数据是稀疏的,并且你需要拟合一个带有偏置的岭回归模型,那么最好选择sag优化方法。如果你使用其他优化方法,并且希望处理稀疏数据,建议在调用岭回归之前使用preprocessing.StandardScaler等方法手动将数据标准化。

Ridge方法相当于SGDRegressor(penalty='l2', loss="squared_loss")。

只不过SGDRegressor实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现了SAG)

sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)

具有l2正则化的线性回归,可以进行交叉验证

coef_:回归系数

class _BaseRidgeCV(LinearModel):

    def __init__(self, alphas=(0.1, 1.0, 10.0),

                 fit_intercept=True, normalize=False, scoring=None,

                 cv=None, gcv_mode=None,

                 store_cv_values=False):

7、代码

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/9/6 10:37
import warnings

import joblib
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

'''
sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)
    具有l2正则化的线性回归
    alpha:正则化力度,也叫 λ
        λ取值:0~1 1~10
    solver:会根据数据自动选择优化方法
        sag:如果数据集、特征都比较大,选择该随机梯度下降优化
    normalize:数据是否进行标准化
        normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据
    Ridge.coef_:回归权重
    Ridge.intercept_:回归偏置
'''
def ridge():
    """
    岭回归对波士顿房价进行预测
    :return:
    """
    # 1)获取数据
    boston = load_boston()
    print("特征数量:\n", boston.data.shape)

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)

    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4)预估器
    estimator = Ridge(alpha=0.5, max_iter=10000)
    estimator.fit(x_train, y_train)

    # 保存模型
    joblib.dump(estimator, "my_ridge.pkl")
    # 加载模型
    # estimator = joblib.load("my_ridge.pkl")

    # 5)得出模型
    print("岭回归-权重系数为:\n", estimator.coef_)
    print("岭回归-偏置为:\n", estimator.intercept_)

    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("岭回归-均方误差为:\n", error)


if __name__ == '__main__':
    warnings.filterwarnings("ignore")
    ridge()

8、总结

总之,岭回归是一种强大的工具,用于改善线性回归模型的性能,并处理多重共线性问题。它在各种领域中都有着广泛的应用,特别是在需要处理高维数据或自变量相关性较强的情况下,岭回归可以提供可靠的模型估计。

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

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

相关文章

OLED透明屏控制:引领未来交互技术的创新突破

OLED透明屏控制技术作为一项颠覆性的显示技术,正逐渐改变我们与屏幕互动的方式。 其高透明度、触摸和手势交互、高画质和图像显示效果等特点,为用户提供了更智能、便捷的交互体验,同时也在各行各业中展现出无限的应用可能性。 在此&#xf…

【算法】反悔贪心

文章目录 反悔贪心力扣题目列表630. 课程表 III871. 最低加油次数LCP 30. 魔塔游戏2813. 子序列最大优雅度 洛谷题目列表P2949 [USACO09OPEN] Work Scheduling GP1209 [USACO1.3] 修理牛棚 Barn RepairP2123 皇后游戏(🚹省选/NOI− TODO) 相关…

Mybatis---resultMap详解

目录 一、resultMap介绍 二、自定义映射关系 一、resultMap介绍 该标签的作用是自定义映射关系。 Mybatis可以将数据库结果封装到对象中,是因为结果集和对象属性名相同(也就是你写的pojo类型的参数名和数据库的字段名相同) 但是如果当他们不…

【计算机网络】 TCP——四次挥手

文章目录 流程考点 流程 主动方打算关闭连接,此时会发送一个TCP首部FIN标志位被置为1的报文,也即FIN报文,之后主动方进入FIN_WAIT_1状态。被动方收到该报文后,就向主动方发送ACK应答报文,接着被动方进入CLOSE_WAIT状态…

HTML + CSS 实践1

Hello,小伙伴们 这是一个十分精美的网站&#xff0c;可以拿着它去制作一些个人网站 index.html <!DOCTYPE html> <meta charset"utf-8"> <html> <head> <title>首页</title> </head> <style type"text/css"…

【业务功能篇105】 微服务-springcloud-springboot-电商订单模块--秒杀服务-定时任务【上篇】

秒杀服务 一、商品上架 秒杀活动的结构图 通过定时任务触发&#xff1a; 定时任务由spring提供&#xff0c;需要通过注解开启&#xff0c;这里通过定义一个配置类&#xff0c;注入spring,对其配置类进行相应的注解&#xff0c;当然也可以注解放在我们的服务启动类上cron表达…

linux系统移植到开发板简要过程(移植bootloader引导加载程序---移植linux内核---制作根文件系统)

一.标准linux启动过程图 对于linux启动流程分析&#xff0c;我们需要移植bootloader引导加载程序---移植linux内核---制作根文件系统镜像文件&#xff1b; 二.为什么进行系统移植&#xff1f; 对于不同的硬件平台&#xff0c;linux系统启动流程大体相同&#xff0c;但是资源需求…

多线程的创建

一、基本概念 1 cpu CPU的中文名称是中央处理器&#xff0c;是进行逻辑运算用的&#xff0c;主要由运算器、控制器、寄存器三部分组成&#xff0c;从字面意思看就是运算就是起着运算的作用&#xff0c;控制器就是负责发出cpu每条指令所需要的信息&#xff0c;寄存器就是保存运…

spaCy库的实体链接踩坑,以及spaCy-entity-linker的knowledge_base下载问题

问题1. spacy Can’t find factory for ‘entityLinker’ 1&#xff09;问题 写了一个实体链接类&#xff0c;代码如下&#xff1a; nlp spacy.load("en_core_web_md")class entieyLink:def __init__(self, doc, nlp):self.nlp nlpself.doc self.nlp(doc)# Che…

MATLAB入门-矩阵的运算

MATLAB入门-矩阵的运算 本篇文章为学习笔记&#xff0c;课程链接为&#xff1a;头歌 相关知识 常见的矩阵运算有算术运算、关系运算和逻辑运算。MATLAB中的所有变量都是以矩阵的形式存储的&#xff0c;单个变量就相当于一个1*1的矩阵。 算术运算 下面展示的是常见的矩阵之…

云负载均衡

华为云&#xff1a;弹性负载均衡&#xff08;ELB&#xff09; 服务列表----弹性负载均衡 腾讯云&#xff1a;负载均衡 阿里云&#xff1a;弹性负载均衡&#xff08;SLB&#xff09;【ALB NLB CLB】 云服务&#xff1a; 云弹性负载均衡&#xff08;ELB/SLB&#xff09; 云服务…

Unity3D之简单溶解特效制作

文章目录 新建Shader Graph设置参数新建Step节点新建Simple Noise节点查看效果 新建Shader Graph 这里选择 Shader Graph -> URP -> Unlit Shader Graph 创建 设置参数 把 Surface Type 改成 Transparent 新建Step节点 创建一个Step的节点 把 Step 的 Out 连接到 Frag…

Java8-17 --- idea2022

目录 一、idea官网 二、使用idea编写hello world 三、查看工程中的JDK配置信息 四、详细设置 4.1、显示工具栏 4.2、默认启动项目配置 4.3、取消自动更新 4.4、选择整体主体与背景图 4.5、设置编辑器主题样式 4.5.1、编辑器主题 4.5.2、字体大小 4.5.3、修改注…

JS看板:bryntum taskboard 5.5.2 Crack

Bryntum 任务板是一个灵活的看板 Web 组件&#xff0c;可帮助您可视化和管理您的工作。 任务板非常灵活&#xff0c;允许您完全自定义卡片、列和泳道的渲染和样式。借助丰富的 API&#xff0c;您甚至可以在运行时打开或关闭功能。 在繁忙的团队中跟踪任务可能会令人畏惧。任务…

AMD GPU 内核驱动架构分析(一)

在Linux系统中&#xff0c;GPU驱动是集成在DRM框架中的&#xff0c;AMD GPU的内核驱动结构是一个复杂的软件堆栈&#xff0c;负责管理和控制AMD图形硬件&#xff0c;以便应用程序可以与GPU进行通信并利用其图形处理能力。以下是AMD GPU内核驱动的主要组成部分&#xff1a; 硬件…

【操作系统】聊聊进程、线程、协程

进程内部有那些数据 为什么创建进程的成本高 进程和线程 进程是资源分配的基本单位&#xff0c;而线程是程序执行的基本单位&#xff0c;一个是从资源分配的角度看&#xff0c;另一个是执行角度。 那么进程和程序的区别是什么&#xff1f; 程序&#xff0c;一段代码&#xff…

Linux 6.6 初步支持AMD 新一代 Zen 5 处理器

AMD 下一代 Zen 5 CPU 现已开始为 Linux 6.6 支持提交相关代码&#xff0c;最新补丁包括提供温度监控和 EDAC 报告等。 最新的 Linux 6.6 代码中已经加入了包括支持硬件监视器温度监控和 EDAC 报告的补丁。此外&#xff0c;新版本还加入了 x86 / misc 补丁&#xff0c;Phoronix…

9.11C高级day4

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 sum0 function add() {for i in $*  #$*接收传来的所有参数do((sumi))doneecho $sum }#定义一个数组 arr(1 2 3 4 5 7 9)#向函数传参 add ${arr[*]}写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并…

shell中分支语句,循环语句,函数

实现对一个数组求和的函数&#xff0c;将数组作为实参传给函数 #!/bin/bash sum() {for i in $do((sumi))doneecho $sum} read -p "请输入一组数字: " -a arr sum ${arr[*]}2 调用函数&#xff0c;输出当前用户的uid gid 并使用变量接收结果 #!/bin/bashget() {uid…

R语言发送邮件丨blastula包使用教程

R语言自动发送邮件 今天分享一个小技巧&#xff0c;用R语言脚本实现STMP邮件自动发送功能。 生信分析实际操作过程中&#xff0c;可能会偶尔会遇到耗时比较久的计算&#xff0c;比如基因组上游分析GATK标准流程往往耗时几天时间。 使用R语言自动发送邮件&#xff0c;在关键节点…