岭回归(Ridge)和Lasso 回归(笔记)

article/2025/9/16 23:20:47

最近在自学图灵教材《Python机器学习基础教程》,在csdn以博客的形式做些笔记。

对于回归问题,线性模型预测的一般公式如下:

ŷ = w[0] * x[0] + w[1] * x[1] + … + w[p] * x[p] + b

这里 x[0] 到 x[p] 表示单个数据点的特征(本例中特征个数为 p+1),w 和 b 是学习模型的 参数,ŷ 是模型的预测结果。
 

岭回归

岭回归也是一种用于回归的线性模型,因此它的预测公式与普通最小二乘法相同。但在岭 回归中,对系数(w)的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加约束。我们还希望系数尽量小。换句话说,w 的所有元素都应接近于0。直观上来看,这意味着每个特征对输出的影响应尽可能小(即斜率很小),同时仍给出很好的预测结果。 这种约束是所谓正则化(regularization)的一个例子。正则化是指对模型做显式约束,以避免过拟合。岭回归用到的这种被称为 L2 正则化。(摘自书中)

接下来让我们看看岭回归在波士顿房价(书中给的数据集,506 个样本和 105 个导出特征)上的预测效果(如果要用该数据集,请先导入mglearn库)

from sklearn.linear_model import Ridge
X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
ridge = Ridge().fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge.score(X_test, y_test)))

对比我们的线性回归模型(见上篇文章)

 岭回归在训练集上的分数要低于线性回归,但在测试集上的分数更高。由于林回归的约束性更强,因此不容易出现过拟合;复杂度更小的模型意味着在训练集上的性能更差,但泛化性能更好。由于我们只对泛化性能感兴趣,所以应该选择岭回归模型而不是线性回归模型。

alpha 参数:岭回归具有参数alpha;作用是为了调节简单性(系数w都接近于 0)和训练 集性能二者对于模型的重要程度,如果不设置则默认alpha=1.0(如上述代码);alpha具体为多少取决于数据,在此不做讨论。增大 alpha 会使得系数更加趋向于 0,从而降低训练集性能, 但可能会提高泛化性能;减小 alpha 可以让系数受到的限制更小。

接下来我们来通过固定 alpha 值,但改变训练数据量来理解岭回归的正则化:

对波士顿房价数据集做二次抽样,并在数据量逐渐增加的子数据集上分 别对 LinearRegression 和 Ridge(alpha=1) 两个模型进行评估(将模型性能作为数据集大小 的函数进行绘图,这样的图像叫作学习曲线):

 由于岭回归是正则化的,因此它的训练集分数要整体低于线性回归的训练集分数。但岭回归的测试分数要更高,特别是对较小的子数据集。如果少于 400 个数据点,线性回归学不到任何内容。随着模型可用的数据越来越多,两个模型的性能都在提升,最终线性回归的性能追上了岭回归。这里要记住的是,如果有足够多的训练数据,正则化变得不那么重要,并且岭回归和线性回归将具有相同的性能。

lasso回归

与岭回归相同,使用 lasso 也是约束系数使其接近于 0,但用到的方法不同,叫作 L1 正则化。L1 正则化的结果是,使用 lasso 时 某些系数刚好为 0。这说明某些特征被模型完全忽略。这可以看作是一种自动化的特征选择。某些系数刚好为 0,这样模型更容易解释,也可以呈现模型最重要的特征。

我们继续将lasso回归呈现于波士顿房价的数据集上

from sklearn.linear_model import Lasso
lasso = Lasso().fit(X_train, y_train)
print("Training set score: {:.2f}".format(lasso.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lasso.score(X_test, y_test)))
print("Number of features used: {}".format(np.sum(lasso.coef_ != 0)))

 可以发现,lasso回归的分数无论是在测试集还是训练集上都非常的差;这说明存在欠拟合,通过最后一行代码我们可以知道模型只用到了105个特征中的 4 个。与 岭回归类似,Lasso 也有一个正则化参数 alpha,可以控 制系数趋向于 0 的强度。在上一个例子中,我们用的是默认值 alpha=1.0。为了降低欠拟合,我们尝试减小 alpha。这么做的同时,我们还需要增加 max_iter 的值(运行迭代的最大次数)

lasso001 = Lasso(alpha=0.01, max_iter=100000).fit(X_train, y_train)
print("Training set score: {:.2f}".format(lasso001.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lasso001.score(X_test, y_test)))
print("Number of features used: {}".format(np.sum(lasso001.coef_ != 0)))

 alpha 值变小,我们可以拟合一个更复杂的模型,在训练集和测试集上的表现也更好。模 型性能比使用 Ridge 时略好一点,而且我们只用到了 105 个特征中的 33 个。这样模型可能 更容易理解。 但如果把 alpha 设得太小,那么就会消除正则化的效果,并出现过拟合:

lasso002 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)
print("Training set score: {:.2f}".format(lasso002.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lasso002.score(X_test, y_test)))
print("Number of features used: {}".format(np.sum(lasso002.coef_ != 0)))

 总结

在实践中,在两个模型中一般首选岭回归。但如果特征很多,你认为只有其中几个是重要 的,那么选择 Lasso 可能更好。同样,如果你想要一个容易解释的模型,Lasso 可以给出 更容易理解的模型,因为它只选择了一部分输入特征。


http://chatgpt.dhexx.cn/article/RMeEPcpt.shtml

相关文章

【机器学习】一文读懂正则化与LASSO回归,Ridge回归

该文已经收录到专题机器学习进阶之路当中,欢迎大家关注。 1.过拟合 当样本特征很多,样本数相对较少时,模型容易陷入过拟合。为了缓解过拟合问题,有两种方法: 方法一:减少特征数量(人工选择重要…

地址总线之寻址原理

译码器将地址总线的数据经过译码后锁定相应的位置,译码器有两种方结构,一种是单译码器,另外一种是双译码器。单译码器适用于存储容量小的应用环境中。双译码器结构将译码器分为两部分一部分是行译码器,另一部分是列译码器。行和列…

[组原]初识-地址总线,地址寄存器,存储单元,存储字长

文章目录 知识点机器字长指令寻址方式按字寻址按字节寻址 存储单元存储字存储字长 💟前记:由一道做错的题总结结果 ⏲ 05.09 知识点 机器字长 计算机进行一次整数运算所能处理的二进制数据的位数;通常也是CPU内部数据通路的宽度;…

地址总线/数据总线/控制总线的作用

数据总线 (1) 是CPU与内存或其他器件之间的数据传送的通道。 (2)数据总线的宽度决定了CPU和外界的数据传送速度。 (3)每条传输线一次只能传输1位二进制数据。eg: 8根数据线一次可传送一个8位二进制数据(…

内存结构、地址总线、数据总线详解

下图为内存的结构图 DB为一个bit,一行DB对应着一个存储单元。 数据总线个数对应着存储单元的位数 数据总线个数 存储单元位数 寄存器位数 如上图所示,内存的结构就是从上到下依次给存储单元编号。 按字节编址 就是每8个bit 对应着一个地址。 读取…

1.8地址总线

现在我们知道,CPU是通过地址总线来指定存储器单元的。可见地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。 现假设,一个CPU有10根地址总线,让我们来看一下它的寻址情况。我们知道,在电子计算机…

ARM数据/地址总线架构简析

ARM架构简析 1,ARM概述 现在大家讲的ARM的概念实际上是很模糊的,他可能指的是一类芯片,或者指的是ARM公司,亦或者是精简指令集,还是千万人手中的饭碗。下面引用一段关于百度百科关于ARM的准确描述 ARM架构&#xff0…

什么是前端总线,后端总线,内部总线、系统总线,外部总线,地址总线,数据总线,控制总线

文章 部分内容来自于 电子发烧友 内部总线、系统总线和外部总线汇总 部分内容来自于 知乎 前端总线,系统总线,内部总线,外部总线 本文是在两篇文章的基础上进行了二次加工,对两篇文章的精华内容进行了提炼,删掉了对理解…

地址总线是单向还是双向_「计算机组成原理」:总线、地址总线、数据总线和控制总线...

总线(Bus):是计算机各种功能部件之间传送信息的公共通信干线. 总线(Bus):是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制…

计算机控制总线传输的是,总线,地址总线,数据总线和控制总线

总线(Bus): 这是一条通用的通信干线,可以在计算机的各种功能组件之间传输信息. 它是由电线组成的变速箱线束. 根据计算机传输的信息类型,计算机的总线可以分为数据总线和地址. 总线和控制总线分别用于传输数据,数据地址和控制信号. 总线是一种…

计算机64位地址总线,地址总线与数据总线的关系,功能和宽度

1. 地址总线与数据总线之间的关系 数据总线用于传输数据. 每条数据线传输一个二进制位64位处理器 数据总线,而8条线恰好传输一个字节. 但是,地址总线传输地址,每个地址也传输一个二进制位,而8条地址线传输8个二进制位. 这8个二进制位具有2 ^ 8个不同的变化,因此它们可用于…

地址总线

现在我们知道,CPU是通过地址总线来指定存储器单元的。可见地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。 现假设,一个CPU有10根地址总线,让我们来看一下它的寻址情况。我们知道,在电子计算机…

地址总线、物理地址、虚拟地址讲解

什么是地址总线? 地址总线(Address Bus ;又称位址总线)属于一种电脑总线(一部份),是由CPU或有DMA能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/地方的实体位址。 换而言之,就…

计算机总线详解(数据总线、地址总线、控制总线)

文章目录 1 概述2 总线分类2.1 数据总线 Data Bus2.2 地址总线 Address Bus2.3 控制总线 Control Bus 3 扩展3.1 常考题3.2 百度百科 - 总线 Bus 1 概述 总线(Bus) 是计算机各种功能部件之间传送信息的 公共通信干线如果说 主板(Mother Boar…

总线之地址总线、数据总线、控制总线

https://www.cnblogs.com/codexlx/p/13252705.html 1.地址总线: CPU是通过地址总线来指定存储单元的,因此总线地址上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址 一个CPU有N根地址线,那么可以说这个CPU的地址总线…

CentOS8 arm64架构 鲲鹏服务器上安装zabbix-agent

1、使用系统yum源中自带的资源安装 查看yum中自带的zabbix资源包 sudo yum list |grep zabbix安装 sudo install zabbix40-agent.aarch64 # 填写自己服务器上的资源2、下载资源包安装 获取官网下载地址 zabbix官网下载.aarch64.rpm的资源包,地址 搜索需要的包 …

ARM64(aarch64)下安装tensorflow

首先从Github下载安装包: tensorflow-on-arm 选择合适的版本,例如tensorflow-1.14.0-cp35-none-linux_aarch64.whl 命名规则:cp35代表python3.5,aarch64表示架构信息 wget https://github.com/lhelontra/tensorflow-on-arm/rele…

QEMU启动ARM64 Linux内核

目录 前言前置知识virt开发板ARM处理器家族简介 安装qemu-system-aarch64安装交叉编译工具交叉编译ARM64 Linux内核交叉编译ARM64 Busybox使用busybox制作initramfs使用QEMU启动ARM64 Linux内核 前言 本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一…

centos for arm64

Arm64的centos版本自7.5.1804以后不再和7.4、7.3、7.2等之前的一样直接提供一个rootfs.tar.xz的压缩包,全部变成了ISO的安装文件,因此需要EFI来引导安装,如果Aarch64的cpu用的是uboot就只有干瞪眼了,笔者花了一翻功夫,…

ARM64逆向基础

为什么要学ARM64? android 5.0系统就开始引入Arm64-v8a,它用于支持全新的AArch64架构,这个架构也就是我们要学习的arm64汇编。目前android系统已经发展到anroid 11版本。因此现在主流的apk都是支持AArch64架构。那么我们利用IDA(…