目录
老饼讲解:一步一步上手学习

【模型】一篇之门之-Lasso-套索回归

作者 : 老饼 发表日期 : 2025-12-16 22:41:39 更新日期 : 2026-05-10 15:21:16
老饼讲解-简单易懂,干货满满,爽过嗦螺!


套索回归(Lasso Regression)也是一种线性模型,只是它在线性回归的基础上,加入了一范正则项,从而可以更容易获得稀疏解,因此常用于筛选变量,但也由于它加入了一范正则项,因此需要用坐标下降法来进行训练。下面我们就来详细看看Lasso回归的模型原理,包括模型表达式、损失函数、求解方法,以及代码实现例子。

一、Lasso回归模型

Lasso回归模型其实就是一个线性模型,如下:

它的模型其实和线性回归没什么区别,真正的区别在于损失函数,Lasso回归的损失函数如下:

 其中,:样本个数             

 :系数个数       

 :y的预测值      

 :y的真实值      

                   :惩罚系数,用于调节系数W的惩罚力度

好家伙,它其实就是在损失函数中,加入了正则项,由于绝对值是"一范数",所以也称为一范正则项。

Lasso回归的损失函数

那这个正则项有什么用呢,它其实就是用来防止系数过大,因为系数越大,就会令整体损失值越大,因此,在损失函数中加入它,就可以使得最终求解出来的结果更偏向于更小的系数。

二、Lasso回归的模型求解

我们知道,线性回归模型是使用最小二乘法来求解就可以了,但是,Lasso回归在损失函数中加入一范正则项后,就不能再用最小二乘法啦,一般改用坐标下降法来进行求解。

坐标下降法是个什么东西呢?其实就是每次都把单个参数(也就是模型中的单个w或b)迭代到最佳位置,各个参数轮流迭代到最佳位置,就称为一轮迭代,然后经过多轮迭代,直到参数的变化很小或达到最大迭代次数则终止训练。

Lasso回归的具体训练流程如下:

Lasso回归的训练流程

如图所示,

1. 先把解全初始化为 0。 

2. 然后循环迭代,每次将一个参数调整为最优(也就是驻点)

3. 直到满足终止训练条件,退出迭代

终止条件为:(1)达到最大迭代次数,(2)w的变化率极微小

好了,我们知道,它每次都把参数调整到最优,那么这个最优点就是驻点,也就是偏导为0的地方,这只需要求一下偏导,然后再计算出驻点就可以了,这里我们就不展开推导了,公式看多了头又晕。

三、Lasso回归-稀疏化

Lasso回归嘛,就是在损失函数中加入一范,用来惩罚过大的系数,所以最开始的时候,我以为就是线性回归系数过大时,就改用Lasso回归来训练,但后来发现,Lasso回归不只这一个用途,更多时候是利用它的稀疏化特性,来选择变量。

Lasso回归的稀疏化,是指它很容易让某些变量的系数为0,如下:

为什么Lasso回归容易产生稀疏解

由于Lasso回归加入了一范正则项,它的就相当于在"系数绝对值之和"与"均方差"之间进行权衡,如图所示,如果一范正则项在几何上就是菱形,均方差相当于椭圆,两者的交点,一般就在菱角上,所以某些系数就会为0。这里不是很严谨,大概就是这么一个意思。

总的来说,Lasso回归就是很容易让系数为0,所以用Lasso回归训练完后,如果有些变量的系数为0,说明它对预测并没有起来作用,那么就可以剔除掉这些变量。

特别地,岭回归虽然也加入了正则项,但它加入的是二范正则项,所以并没有Lasso回归这种稀疏化的特点。

四、Lasso回归-应用例子

好了,说了这么多,我们就正式来使用一下Lasso回归吧!

"""
本代码展示如何用sklearn实现Lasso回归
本代码来自《老饼讲解-机器学习》 www.bbblearn.com
"""
from sklearn.linear_model import Lasso
import numpy as np
x1 =  np.arange(0,100)                                               # 生成x1
x2 = x1*4+3                                                          # 生成x2,这里的x2与x1是线性相关的
x  = np.concatenate((x1.reshape(-1, 1),x2.reshape(-1, 1)),axis=1)    # 将x1,x2合并作为x
y  = x.dot([2,3])                                                    # 生成y
alpha = 0.3                                                          # 设置正则项系数alpha
md = Lasso(alpha=0.3,fit_intercept=True,max_iter=1000)               # 初始化Lasso回归模型
md.fit(x,y)                                                          # 用数据训练模型
sim_y= md.predict(x)                                                 # 预测
print('\n======Lasso训练结果=========')                              # 打印结果
print('权重 :'+ str(md.coef_))                                       # 打印权重
print('阈值 :'+ str(md.intercept_))                                  # 打印阈值
print( '均方误差 :'+ str(((y-sim_y)**2).sum()))                      # 打印均方误差
print('迭代次数:'+ str(md.n_iter_))                                  # 打印迭代次数

可以看到,在代码中我们设置了fit_intercept=True,这样模型训练出来的Lasso回归模型就是带阈值的,如果设为false,就没有阈值。代码运行结果如下:

代入模型表达式,可得到模型为:

  

可以看到,第二个变量的系数已接近于0,说明第二个变量在模型中是可去除的。这就是Lasso回归的好处,在线性相关时,其中一个变量的系数会趋于0。

总结

总的来说,Lasso回归模型就是在线性回归的基础上,加入一范正则项,来避免系数过大,而且在变量多重共线性时,它容易产生稀疏化的解,所以可以利用它来筛选变量,总结如下:

1. Lasso就是在线性回归的基础上,加入一范正则项

2. Lasso使用坐标下降法来训练模型

3. Lasso可以通过alpha系数来避免系数过大

4. Lasso容易产生稀疏解,可以用来筛选变量

好了,关于Lasso回归的核心内容就是这么多了,学习时注意把它和线性回归、岭回归来进行对比,就会深刻多了,三个模型虽然很像,但是却各有各的用处。




图标 评论
添加评论