【机器学习】--鲁棒性调优之L1正则,L2正则

本文详细介绍了如何通过L1正则、L2正则及ElasticNet等方法提升模型的鲁棒性和泛化能力,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前述

鲁棒性调优就是让模型有更好的泛化能力和推广力。

二、具体原理

1、背景

第一个更好,因为当把测试集带入到这个模型里去。如果测试集本来是100,带入的时候变成101,则第二个模型结果偏差很大,而第一个模型偏差不是很大。

2、目的

鲁棒性就是为了让w参数也就是模型变小,但不是很小。所以引出了 L1和L2正则。

 L1和L2的使用就是让w参数减小的使用就是让w参数减小。

L1正则,L2正则的出现原因是为了推广模型的泛化能力。相当于一个惩罚系数。

3、具体使用

L1正则:Lasso Regression

 

L2正则:Ridge Regression

总结:

经验值 MSE前系数为1 ,L1 , L2正则前面系数一般为0.4~0.5 更看重的是准确性。

L2正则会整体的把w变小。

L1正则会倾向于使得w要么取1,要么取0 ,稀疏矩阵 ,可以达到降维的角度。

ElasticNet函数(把L1正则和L2正则联合一起):

总结:

1.默认情况下选用L2正则。

2.如若认为少数特征有用,可以用L1正则。

3.如若认为少数特征有用,但特征数大于样本数,则选择ElasticNet函数。

4、在保证正确率的情况下加上正则。

5、如果把lamda设置成0,就只看准确率。

6、如果把lamda设置大些,就看中推广能力。

7、L1倾向于使得w要么取1,要么取0 稀疏编码 可以降维

8、L2倾向于使得w整体偏小 岭回归 首选

 4、图示

左边是L1正则+基本损失函数

右边是L2正则+基本损失函数

中间部分是圆心,损失函数最小,与正则函数相交,则既要满足基本函数,也要满足L1,L2正则,则损失函数增大了。

w1,w2等等与基本函数相交,则w1,w2都在[0,1]之间。

三、代码演示

代码一:L1正则

# L1正则
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.linear_model import SGDRegressor


X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

lasso_reg = Lasso(alpha=0.15)
lasso_reg.fit(X, y)
print(lasso_reg.predict(1.5))

sgd_reg = SGDRegressor(penalty='l1')
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))

代码二:L2正则

# L2正则
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressor



X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

#两种方式第一种岭回归
ridge_reg = Ridge(alpha=1, solver='auto')
ridge_reg.fit(X, y)
print(ridge_reg.predict(1.5))#预测1.5的值
#第二种 使用随机梯度下降中L2正则
sgd_reg = SGDRegressor(penalty='l2')
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))

代码三:Elastic_Net函数

 

 

# elastic_net函数
import numpy as np
from sklearn.linear_model import ElasticNet
from sklearn.linear_model import SGDRegressor


X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
#两种方式实现Elastic_net
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net.fit(X, y)
print(elastic_net.predict(1.5))

sgd_reg = SGDRegressor(penalty='elasticnet')
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))

 

### L1正则化与L2正则化的区别及应用场景 #### 一、定义与基本原理 L1正则化和L2正则化都是机器学习中常用的正则化技术,旨在通过在损失函数中加入额外的惩罚项来降低模型复杂度并防止过拟合。 - **L1正则化**:也称为Lasso回归,是在损失函数中加上权值向量各元素绝对值之和作为惩罚项。这种形式促使部分特征的权重变为零,从而实现稀疏性[^3]。 - **L2正则化**:又被称为Ridge回归,它通过对权值向量各元素平方和开根号的形式施加惩罚。这种方式不会使任何单一特征的权重降为零,而是均匀地压缩所有权重[^1]。 #### 二、数学表达式 设 \( w \) 表示模型的参数向量,\( J(w) \) 是未经过正则化的损失函数,则: - 加入L1正则化的总损失函数表示为: \[ J_{\text{L1}}(w) = J(w) + \lambda \|w\|_1 \] 其中,\( \|w\|_1 = \sum_i |w_i| \),代表L1范数;\( \lambda \) 控制正则强度。 - 而L2正则化的总损失函数写成: \[ J_{\text{L2}}(w) = J(w) + \frac{\lambda}{2} \|w\|_2^2 \] 这里,\( \|w\|_2^2 = \sum_i w_i^2 \),即L2范数的平方[^4]。 #### 三、特性对比 以下是两者的主要差异及其背后的原因分析: - **稀疏性** - L1正则化能够生成稀疏解,因为它的几何形状(如二维空间中的菱形轮廓)更容易让最解落在坐标轴上,从而使某些权重精确等于零[^3]。 - 相较之下,L2正则化倾向于将权重均等地分配给各个特征,因此无法直接达到稀疏的效果[^1]。 - **鲁棒性** - 对于含有较多噪声的数据集或者存在异常值的情况下,由于L1正则化对大数值敏感程度较低,故表现出更强的抗干扰能力[^2]。 - 反观L2正则化,在处理极端值方面稍显不足,因为它更关注整体误差分布而非个别离群点的影响[^4]。 - **贝叶斯视角下的解释** - 如果从统计学角度出发,采用不同的先验信念可以推导出相应的正则化策略。具体而言,当假定权重服从拉普拉斯分布时得到的就是L1正则化方案[^4]; - 若设定权重遵循高斯分布规律,则对应着L2正则化路径[^4]。 #### 四、实际应用场合 基于以上理论基础,可以根据特定场景需求选取合适的正则化手段: - 当希望获得简洁明了且具备较强泛化性能的模型,并且输入变量间可能存在冗余关系时,先选用L1正则化来进行有效的特征筛选操作[^2]。 - 在追求平稳过渡变化趋势的同时兼顾全局一致性考量的前提下,推荐运用L2正则化以维持较为均衡的状态配置[^1]。 ```python from sklearn.linear_model import Lasso, Ridge import numpy as np # 构造模拟数据 X = np.array([[0, 0], [1, 1], [2, 2]]) y = np.dot(X, np.array([1, 2])) + np.random.randn(3) # 使用L1正则化(Lasso) lasso_reg = Lasso(alpha=0.1) lasso_reg.fit(X, y) print("Lasso coefficients:", lasso_reg.coef_) # 使用L2正则化(Ridge) ridge_reg = Ridge(alpha=0.1) ridge_reg.fit(X, y) print("Ridge coefficients:", ridge_reg.coef_) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L先生AI课堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值