线性回归算法的衍生

文章介绍了线性回归的三种衍生算法:Lasso回归,其通过L1正则化实现特征选择;岭回归,利用L2正则化减少权重波动;以及Elastic-Net,结合L1和L2正则化,适用于相关特征的情况。示例代码展示了如何使用scikit-learn库实现这些算法。
摘要由CSDN通过智能技术生成

线性回归的衍生算法

一、套索回归(Lasso)

Lasso其实就是线性回归的loss function 加了L1正则项

scikit-learn官网给出的套索回归的,损失函数公式:
min ⁡ w 1 2 n samples ∣ ∣ X w − y ∣ ∣ 2 2 + α ∣ ∣ w ∣ ∣ 1 \underset{w}\min { \frac{1}{2n_{\text{samples}}} ||X w - y||_2 ^ 2 + \alpha ||w||_1} wmin2nsamples1∣∣Xwy22+α∣∣w1
API的使用:

import numpy as np
from sklearn.linear_model import Lasso
from sklearn.linear_model import SGDRegressor

# 1、创建数据集X,y
X = 2*np.random.rand(100, 20)
w = np.random.randn(20,1)
b = np.random.randint(1,10,size = 1)
y = X.dot(w) + b + np.random.randn(100, 1) #np.random.randn(100, 1)加一点噪声模拟真实世界

print('原始方程的斜率:',w.ravel())
print('原始方程的截距:',b)

lasso = Lasso(alpha= 0.5)
lasso.fit(X, y)
print('套索回归求解的斜率:',lasso.coef_)
print('套索回归求解的截距:',lasso.intercept_)

# 线性回归梯度下降方法
sgd = SGDRegressor(penalty='l2',alpha=0, l1_ratio=0)
sgd.fit(X, y.reshape(-1,))
print('随机梯度下降求解的斜率是:',sgd.coef_)
print('随机梯度下降求解的截距是:',sgd.intercept_)
原始方程的斜率: [ 0.5784282   1.39235838 -1.62547662 -1.4637465  -0.90897719  1.23127233
  1.89616543 -1.35490324  0.89942946 -0.79403763 -0.26044672 -1.5756806
 -0.51351586 -1.88155485  0.09450751 -1.31438804  2.25492836 -1.29862916
  0.56423503  0.74137844]
原始方程的截距: [3]
套索回归求解的斜率: [ 0.          0.42555403 -0.06327097 -0.         -0.          0.
  0.19135323 -0.          0.         -0.         -0.         -0.
 -0.         -0.05475984 -0.         -0.34135912  0.67108026 -0.
  0.          0.        ]
套索回归求解的截距: [-1.30892748]
随机梯度下降求解的斜率是: [ 0.50306698  1.63344171 -1.27789832 -1.08710949 -0.72629129  1.15469105
  2.13668193 -0.85123256  0.89726581 -0.66352391 -0.13508655 -1.3718438
 -0.47970552 -1.86361451  0.17298822 -1.36648847  2.14032804 -1.32144553
  0.81664204  0.74458903]
随机梯度下降求解的截距是: [0.60640812]

由结果可以看出,W的系数确实变小了,而且部分系数变成了0.这就是L1正则化的特征选择的特性

二、岭回归(Ridge)

Lasso其实就是线性回归的loss function 加了L2正则项

scikit-learn官网给出的岭回归的,损失函数公式:
min ⁡ w ∣ ∣ X w − y ∣ ∣ 2 2 + α ∣ ∣ w ∣ ∣ 2 2 \underset{w}\min || X w - y||_2^2 + \alpha ||w||_2^2 wmin∣∣Xwy22+α∣∣w22
API的使用:

import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressor

# 1、创建数据集X,y

X = 2*np.random.rand(100, 5)
w = np.random.randint(1,10,size = (5,1))
b = np.random.randint(1,10,size = 1)
y = X.dot(w) + b + np.random.randn(100, 1)

print('原始方程的斜率:',w.ravel())
print('原始方程的截距:',b)

ridge = Ridge(alpha= 1, solver='sag')
ridge.fit(X, y)
print('岭回归求解的斜率:',ridge.coef_)
print('岭回归求解的截距:',ridge.intercept_)

# 线性回归梯度下降方法

sgd = SGDRegressor(penalty='l2',alpha=0,l1_ratio=0)
sgd.fit(X, y.reshape(-1,))
print('随机梯度下降求解的斜率是:',sgd.coef_)
print('随机梯度下降求解的截距是:',sgd.intercept_)
原始方程的斜率: [5 8 4 4 7]
原始方程的截距: [6]
岭回归求解的斜率: [[4.63444347 7.66585294 3.74820613 3.5900658  7.04362006]]
岭回归求解的截距: [7.08396459]
随机梯度下降求解的斜率是: [4.80518718 8.01653307 4.12798201 3.91055719 7.1895815 ]
随机梯度下降求解的截距是: [5.67845207]

权重确实有变小,但这块不太明显

三、Elastic-Net(弹性网络)

Elastic-Net是加了L1和L2的正则项

scikit-learn官网给出的弹性网络回归的,损失函数公式:
min ⁡ w 1 2 n samples ∣ ∣ X w − y ∣ ∣ 2 2 + α ρ ∣ ∣ w ∣ ∣ 1 + α ( 1 − ρ ) 2 ∣ ∣ w ∣ ∣ 2 2 \underset{w}\min { \frac{1}{2n_{\text{samples}}} ||X w - y||_2 ^ 2 + \alpha \rho ||w||_1 + \frac{\alpha(1-\rho)}{2} ||w||_2 ^ 2} wmin2nsamples1∣∣Xwy22+αρ∣∣w1+2α(1ρ)∣∣w22
 Elastic-Net 回归,即岭回归和Lasso技术的混合。弹性网络是一种使用 L1, L2 范数作为先验正则项训练的线性回归模型。 这种组合允许学习到一个只有少量参数是非零稀疏的模型,就像 Lasso 一样,但是它仍然保持一些像 Ridge 的正则性质。我们可利用 l1_ratio 参数控制 L1 和 L2 的凸组合。

  弹性网络在很多特征互相联系(相关性,比如身高体重就很有关系)的情况下是非常有用的。Lasso 很可能只随机考虑这些特征中的一个,而弹性网络更倾向于选择两个。

  在实践中,Lasso 和 Ridge 之间权衡的一个优势是它允许在迭代过程中继承 Ridge 的稳定性。

API的使用:

import numpy as np
from sklearn.linear_model import ElasticNet
from sklearn.linear_model import SGDRegressor

# 1、创建数据集X,y
X = 2*np.random.rand(100, 20)
w = np.random.randn(20,1)
b = np.random.randint(1,10,size = 1)
y = X.dot(w) + b + np.random.randn(100, 1)

print('原始方程的斜率:',w.ravel())
print('原始方程的截距:',b)

model = ElasticNet(alpha= 0.5, l1_ratio = 0.4)
model.fit(X, y)
print('弹性网络回归求解的斜率:',model.coef_)
print('弹性网络回归求解的截距:',model.intercept_)

# 线性回归梯度下降方法
sgd = SGDRegressor(penalty='l2',alpha=0, l1_ratio=0)
sgd.fit(X, y.reshape(-1,))
print('随机梯度下降求解的斜率是:',sgd.coef_)
print('随机梯度下降求解的截距是:',sgd.intercept_)
原始方程的斜率: [-1.08665196  0.29784044 -0.05402962 -1.42530743  0.75366998 -1.58267445
  0.537406   -0.02971008 -0.41169192  0.72763825  0.43380976 -1.20375879
 -0.42129621 -0.90989839  0.26294276  0.28510024  0.83403387  0.21455717
 -1.26572452 -1.16244643]
原始方程的截距: [2]
弹性网络回归求解的斜率: [-0.          0.          0.         -0.4463167   0.36413116 -0.62790309
  0.08214102  0.         -0.2075767   0.29954633  0.05512401 -0.12585731
 -0.06642562 -0.07434065 -0.          0.          0.          0.
 -0.52070358 -0.12119272]
弹性网络回归求解的截距: [-2.01965209]
随机梯度下降求解的斜率是: [-0.60884315  0.2875798   0.11650099 -1.30505531  0.8508967  -1.46866609
  0.77110576 -0.05571956 -0.49490676  1.10106957  0.53828137 -0.79834252
 -0.51291124 -0.72395129  0.1247336   0.23479154  0.54316487  0.4162329
 -1.25862285 -0.86019254]
随机梯度下降求解的截距是: [-0.06971563]

Elastic-Net网络模型,融合了L1正则化L2正则化的特性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学AI不秃头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值