Scikit-learn Python机器学习 - 回归分析算法 - Lasso 回归 (Lasso Regression)

锋哥原创的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正则化项。其目标函数如下:

核心特点

  1. 特征选择:能够将不重要的特征系数压缩到零

  2. 稀疏解:产生稀疏的系数向量

  3. 处理多重共线性:当特征高度相关时,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
相关推荐
thginWalker2 小时前
分布式协议与算法实战-实战篇
分布式·算法
倔强青铜三3 小时前
苦练Python第52天:一口气吃透Python的“七脉神剑”:生命周期+字符串魔术方法全解析
人工智能·python·面试
润 下4 小时前
C语言——函数(超详细分析)
c语言·开发语言·笔记·算法
tumu_C4 小时前
无用知识研究:用sfinae实现函数模板的overload [一]
开发语言·c++·算法
-森屿安年-4 小时前
数据结构——排序
数据结构·算法·排序算法
西望云天4 小时前
Trie树实战:三道典型例题
数据结构·算法·icpc
dragoooon344 小时前
[优选算法专题三.二分查找——NO.20搜索插入位置 ]
算法·leetcode·动态规划
yanxing.D4 小时前
OpenCV轻松入门_面向python(第五章几何变换)
图像处理·人工智能·python·opencv
hn小菜鸡5 小时前
LeetCode 1089.复写零
算法·leetcode·职场和发展