锋哥原创的Scikit-learn Python机器学习视频教程:
https://www.bilibili.com/video/BV11reUzEEPH
课程介绍

本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据集,特征抽取,特征预处理,特征降维等),分类算法(K-临近算法,朴素贝叶斯算法,决策树等),回归与聚类算法(线性回归,欠拟合,逻辑回归与二分类,K-means算法)等。
Scikit-learn Python机器学习 - 回归分析算法 - Lasso 回归 (Lasso Regression)
Lasso(Least Absolute Shrinkage and Selection Operator)回归是一种线性回归的正则化方法,它通过添加 L1 正则化项(权重的绝对值之和)来进行特征选择和防止过拟合。与 Ridge 回归的 L2 正则化不同,Lasso 能够将某些特征的系数完全压缩到零,从而实现自动特征选择。
基本数学原理
Lasso回归是在普通最小二乘回归(OLS)的基础上加入了L1正则化项。其目标函数如下:

核心特点
-
特征选择:能够将不重要的特征系数压缩到零
-
稀疏解:产生稀疏的系数向量
-
处理多重共线性:当特征高度相关时,Lasso 通常会选择其中一个特征
与 Ridge 回归的比较
特性 | Lasso 回归 | Ridge 回归 |
---|---|---|
正则化类型 | L1(绝对值) | L2(平方) |
特征选择 | 是(产生稀疏解) | 否(系数接近但不等于零) |
解的唯一性 | 可能不唯一(当特征相关时) | 唯一 |
计算效率 | 较高(尤其对于高维数据) | 一般 |
适用场景 | 特征选择,高维数据 | 处理多重共线性 |
API介绍
Lasso 类构造函数
Lasso(alpha=1.0, *, fit_intercept=True, precompute=False, copy_X=True,
max_iter=1000, tol=1e-4, warm_start=False, positive=False,
random_state=None, selection='cyclic')
核心参数:
1. alpha(正则化强度)
-
类型: float, 默认=1.0
-
作用: 控制 L1 正则化的强度
-
影响:
-
α 值越大,正则化越强,更多系数被压缩到零
-
α = 0 时退化为普通线性回归
-
通常通过交叉验证选择最佳值
-
2. fit_intercept(是否计算截距)
-
类型: bool, 默认=True
-
作用: 是否计算模型的截距项
-
建议: 通常保持为 True
3. max_iter(最大迭代次数)
-
类型: int, 默认=1000
-
作用: 优化算法的最大迭代次数
-
重要: Lasso 使用坐标下降法,可能需要较多迭代才能收敛
4. tol(收敛容忍度)
-
类型: float, 默认=1e-4
-
作用: 优化的停止准则,如果更新小于 tol,则停止优化
-
调整: 更小的值意味着更高的精度但更长的计算时间
5. positive(强制正系数)
-
类型: bool, 默认=False
-
作用: 当设置为 True 时,强制系数为非负数
-
应用场景: 当特征与目标变量只能有正向关系时使用
6. selection(系数更新策略)
-
类型: str, 默认='cyclic'
-
可选值:
-
'cyclic': 按顺序循环更新每个系数
-
'random': 随机更新系数,有时收敛更快
-
-
建议: 对于大型数据集或当收敛较慢时尝试 'random'
7. warm_start(热启动)
-
类型: bool, 默认=False
-
作用: 当设置为 True 时,重用前一次调用的解作为初始化
-
用途: 用于在不同 alpha 值下连续拟合,可以加速计算
8. random_state(随机种子)
-
类型: int, 默认=None
-
作用: 当 selection='random' 时,用于控制随机数生成器
-
用途: 确保结果可重现
具体示例-加州房价预测
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, Lasso
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载数据
california = fetch_california_housing()
print(california.data, california.data.shape)
print(california.target)
print(california.feature_names)
# 2,数据预处理
X_train, X_test, y_train, y_test = train_test_split(california.data, california.target, test_size=0.2, random_state=20)
scaler = StandardScaler() # 数据标准化:消除不同特征量纲的影响
X_train_scaled = scaler.fit_transform(X_train) # fit计算生成模型,transform通过模型转换数据
X_test_scaled = scaler.transform(X_test) # 使用训练集的参数转换测试集
# 3,创建和训练模型
la_model = Lasso() # 创建分类器实例
la_model.fit(X_train_scaled, y_train) # fit计算生成模型
print('权重系数:', la_model.coef_)
print('偏置值:', la_model.intercept_)
# 4,模型评估
y_predict = la_model.predict(X_test_scaled)
print('预测值:', y_predict)
print('真实值:', y_test)
mse = mean_squared_error(y_test, y_predict)
print('梯度下降模型均方误差:', mse)
运行结果:
[[ 8.3252 41. 6.98412698 ... 2.55555556
37.88 -122.23 ]
[ 8.3014 21. 6.23813708 ... 2.10984183
37.86 -122.22 ]
[ 7.2574 52. 8.28813559 ... 2.80225989
37.85 -122.24 ]
...
[ 1.7 17. 5.20554273 ... 2.3256351
39.43 -121.22 ]
[ 1.8672 18. 5.32951289 ... 2.12320917
39.43 -121.32 ]
[ 2.3886 16. 5.25471698 ... 2.61698113
39.37 -121.24 ]] (20640, 8)
[4.526 3.585 3.521 ... 0.923 0.847 0.894]
['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
权重系数: [ 0. 0. 0. -0. -0. -0. -0. -0.]
偏置值: 2.06782355377907
预测值: [2.06782355 2.06782355 2.06782355 ... 2.06782355 2.06782355 2.06782355]
真实值: [1.176 2.922 1.313 ... 1.029 2.795 1.293]
梯度下降模型均方误差: 1.3949525140456152