LASSOLeast Absolute Shrinkage and Selection Operator)回归模型一般都是用英文缩写表示,
硬要翻译的话,可翻译为 最小绝对收缩和选择算子

它是一种线性回归模型的扩展,其主要目标是解决高维数据中的特征选择和正则化问题。

1. 概述

LASSO中,通过使用L1正则化项,它能够在回归系数中引入稀疏性,
也就是允许某些系数在优化过程中缩减为零,从而实现特征的选择。

与岭回归不同的是,LASSO的损失函数一般定义为:\(L(w) = (y-wX)^2+\lambda\parallel w\parallel_1\)
其中 \(\lambda\parallel w\parallel_1\),也就是 L1正则化项(岭回归中用的是 L2正则化项)。

模型训练的过程就是寻找让损失函数\(L(w)\)最小的参数\(w\)。
也就等价于:\(\begin{align}
& arg\ min(y-wX)^2 \\
& s.t. \sum |w_{ij}| < s
\end{align}\)
这两个公式表示,在满足约束条件 \(\sum |w_{ij}| < s\)的情况下,计算 \((y-wX)^2\)的最小值。

2. 创建样本数据

相比于岭回归模型,LASSO回归模型不仅对于共线性数据集友好,
对于高维数据的数据集,也有不错的性能表现。

它通过将不重要的特征的系数压缩为零,帮助我们选择最重要的特征,从而提高模型的预测准确性和可解释性。
下面我们模拟创建一些高维数据,创建一个特征数比样本数还多的样本数据集。

from sklearn.datasets import make_regression

X, y = make_regression(n_samples=80, n_features=100, noise=10)

这个数据集中,只有80个样本,每个样本却有100个特征,并且噪声也设置的很大(noise=10)。

3. 模型训练

第一步,分割训练集测试集

from sklearn.model_selection import train_test_split

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

scikit-learn中的LASSO模型来训练:

from sklearn.linear_model import Lasso

# 初始化LASSO线性模型
reg = Lasso()
# 训练模型
reg.fit(X_train, y_train)

这里使用的 Lasso()的默认参数来训练模型,它的主要参数包括:

  1. alpha:正则化项系数。它控制了L1正则化项的强度,即对模型复杂度的惩罚。alpha越大,模型越简单,但过大的alpha可能会导致模型欠拟合;alpha越小,模型越复杂,但过小的alpha可能会导致模型过拟合。默认值为1.0
  2. fit_intercept:布尔值,指定是否需要计算截距b值。如果设为False,则不计算b值默认值为True
  3. normalize:布尔值。如果设为True,则在模型训练之前将数据归一化。默认值为False
  4. precompute:布尔值,指定是否预先计算X的平方和。如果设为True,则在每次迭代之前计算X的平方和。默认值为False
  5. copy_X:布尔值,指定是否在训练过程中复制X。如果设为True,则在训练过程中复制X默认值为True
  6. max_iter:最大迭代次数。默认值为1000
  7. tol:阈值,用于判断是否达到收敛条件。默认值为1e-4
  8. warm_start:布尔值,如果设为True,则使用前一次的解作为本次迭代的起始点。默认值为False
  9. positive:布尔值,如果设为True,则强制系数为正。默认值为False
  10. selection:用于在每次迭代中选择系数的算法(有“cyclic”和“random”两种选择)。默认值为“cyclic”,即循环选择。

最后验证模型的训练效果:

from sklearn import metrics

y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred) print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error)) # 运行结果
均方误差:441.07830708712186
复相关系数:0.9838880665687711
中位数绝对误差:11.643348614829785

误差看上去不小,因为这次实际生成的样本,不仅数量小(80件)且噪声大(noise=10)。

3.1. 与岭回归模型比较

单独看LASSO模型的训练结果,看不出其处理高维数据的优势。
同样用上面分割好的训练集测试集,来看看岭回归模型的拟合效果。

from sklearn.linear_model import Ridge
# from sklearn.model_selection import train_test_split mse, r2, m_error = 0.0, 0.0, 0.0 # 初始化岭回归线性模型
reg = Ridge()
# 训练模型
reg.fit(X_train, y_train) y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred) print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error)) # 运行结果
均方误差:6315.046844910431
复相关系数:0.7693207470296398
中位数绝对误差:60.65140692273637

对于高维数据,可以看出,岭回归模型的误差 远远大于 LASSO模型。

3.2. 与最小二乘法模型比较

同样用上面分割好的训练集测试集,再来看看线性模型(最小二乘法)的拟合效果。

from sklearn.linear_model import LinearRegression

mse, r2, m_error = 0.0, 0.0, 0.0

# 初始化最小二乘法线性模型
reg = LinearRegression()
# 训练模型
reg.fit(X_train, y_train) y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred) print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error)) # 运行结果
均方误差:5912.442445894787
复相关系数:0.7840272859181612
中位数绝对误差:62.89225147465376

可以看出,线性模型的训练效果和岭回归模型差不多,但是都远远不如LASSO模型

4. 总结

总的来说,LASSO回归模型是一种流行的线性回归扩展,具有一些显著的优势和劣势。
比如,在特征选择上,LASSO通过将某些系数压缩为零,能够有效地进行特征选择,这在高维数据集中特别有用。
此外,LASSO可以作为正则化工具,有助于防止过拟合。

不过,LASSO会假设特征是线性相关的,对于非线性关系的数据,效果可能不佳。
而且,如果数据存在复杂模式或噪声,LASSO可能会过度拟合这些模式。

【scikit-learn基础】--『监督学习』之 LASSO回归的更多相关文章

  1. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  2. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  3. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  4. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  5. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  6. (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探

    一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...

  7. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  8. 『TensorFlow』批处理类

    『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...

  9. 『TensorFlow』梯度优化相关

    tf.trainable_variables可以得到整个模型中所有trainable=True的Variable,也是自由处理梯度的基础 基础梯度操作方法: tf.gradients 用来计算导数.该 ...

  10. 『TensorFlow』模型保存和载入方法汇总

    『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...

随机推荐

  1. 使用antd-mobile遇到的坑

    在使用antd-mobile中的组件的时候,遇到了一些比较棘手的问题,经过查找相关资料和网上的帮助,在此整理出了问题以及解决办法: 在引入antd-mobile的时候,根据官网提供的文档: 1,首先安 ...

  2. 拓展kmp

    Smiling & Weeping ---- 我从不觉得暗恋是苦涩的, 对一个人的喜欢藏在眼睛里, 透过它, 世界都变得更好看了. 题目:P5410 [模板]扩展 KMP(Z 函数) - 洛谷 ...

  3. Springboot多种字段copy工具比较

    结论:推荐使用spring自带的copy工具,不能copy的手动set 1.springboot自带的BeanUtils.copyProperties package com.admin; impor ...

  4. JavaScript中的浅拷贝与深拷贝

    前言 JavaScript中的浅拷贝和深拷贝是非常重要的概念,它们在处理对象和数组时具有不同的作用.在编程中,经常需要复制数据以便进行各种操作,但必须注意拷贝的方式,以确保得到预期的结果. 浅拷贝是创 ...

  5. lvm格式化挂载分区

    1.从物理磁盘创建lvm分区 物理磁盘 /dev/sdb 20G 2.使用fdisk工具创建lvm分区 3.修改默认的分区类型 4.查看新建的分区 5.创建物理卷pv 6.创建逻辑卷组vg,并查看详情 ...

  6. 一个 println 竟然比 volatile 还好使?

    前两天一个小伙伴突然找我求助,说准备换个坑,最近在系统复习多线程知识,但遇到了一个刷新认知的问题-- 小伙伴:Effective JAVA 里的并发章节里,有一段关于可见性的描述.下面这段代码会出现死 ...

  7. 【matplotlib 实战】--南丁格尔玫瑰图

    南丁格尔玫瑰图是一种用极坐标下的柱状图或堆叠柱状图来展示数据的图表. 虽然南丁格尔玫瑰图外观类似饼图,但是表示数据的方式不同,它是以半径来表示数值的,而饼图是以扇形的弧度来表达数据的. 所以,南丁格尔 ...

  8. ansible平台

    1.ansible概念: 1)ansible和saltstck是目前互联网IT运维人员使用最多的自动化运维管理工具,主要用于对批量(并行)Linux服务器:安装.部署.配置.指令操作.任务计划.参数调 ...

  9. C++常见算法&数据结构模版

    各种常见算法 & 数据结构模板 1. 最长不下降子序列(LIS) 1.1 \(O(n^2)\) 做法 点击查看代码 for (int i = 1;i <= n;i++) { cin &g ...

  10. Hyper-V中的虚拟机(Centos)安装FTP服务

    linux上是否装上了ftp服务命令: rpm -qa | grep vsftpd ,若没有安装(无显示版本号)则进行下一步 安装ftp服务,命令: yum -y install ftp vsftpd ...