文章目录

  • Lasso概念
    • • 定义
    • • Lasso处理多重共线性原理
  • 二、linear_model.Lasso 类
    • 案例:Lasso特征选取
      • ① 读取数据集
      • ② 划分训练集、测试集
      • ③ 对线性回归、岭回归、Lasso进行对比
      • ④ 学习曲线

Lasso概念

• 定义

LASSO是由1996年Robert Tibshirani首次提出,全称Least absolute shrinkage and selection operator。该方法是一种压缩估计。它通过构造一个惩罚函数得到一个较为精炼的模型,使得它压缩一些回归系数,即强制系数绝对值之和小于某个固定值;同时设定一些回归系数为零。因此保留了子集收缩的优点,是一种处理具有复共线性数据的有偏估计。

除了岭回归之外,最常被人们提到就是模型 Lasso。和岭回归一样,Lasso来作用于多重共线性问题的算法,不过 Lasso使用的是系数w的L1范式(L1范式则是系数w的绝对值)乘以系数α,所以 Lasso的损失函数表达式为:

返回顶部


• Lasso处理多重共线性原理

一般来说, Lasso与岭回归非常相似,都是利用正则项来对原本的损失函数形成一个惩罚,以此来防止多重共线性。但是其实这种说法不是非常严谨,我们来看看 Lasso的数学过程。当我们使用最小二乘法来求解 Lasso中的参数w,我们依然对损失函数进行求导:


所有这些让 Lasso成为了一个神奇的算法,尽管它是为了限制多重共线性被创造出来的,然而大部分地方并不使用它来抑制多重共线性,反而接受了它在其他方面的优势。在逻辑回归中涉及到,L1和L2正则化一个核心差异就是他们对系数w的影响:两个正则化都会压缩系数w的大小,对标签贡献更少的特征的系数会更小,也会更容易被压缩。不过,L2正则化只会将系数压缩到尽量接近0,但L1正则化主导稀疏性,因此会将系数压缩到0。这个性质,让 Lasso成为了线性模型中的特征选择工具首选,接下来,我们就来看看如何使用 Lasso来选择特征。

返回顶部


二、linear_model.Lasso 类

class sklearn.linear_model.Lasso(alpha=1.0, *, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection='cyclic')[source]

sklearn中我们使用Lasso类来调用lasso回归,众多参数中我们需要比较在意的就是参数α,正则化系数。要注意的就是参数 positive.当这个参数为True的时候,我们要求 Lasso回归处的系数必须为正数,以此证我们的α一定以增大来控制正则化的程度。

在skLearn中的Lasso使用的损失函数是:

案例:Lasso特征选取

① 读取数据集

# -*- coding: utf-8
#  @Time    : 2021/1/15 15:14
#  @Author  : ZYX
#  @File    : Example6_Lasso.py
# @software: PyCharm
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.linear_model import Lasso,Ridge,LinearRegression
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.datasets import fetch_california_housing as fch# 获取数据集
house_value = fch()
x = pd.DataFrame(house_value.data)
y = house_value.target
x.columns = ["住户收入中位数","房屋使用年代中位数","平均房间数目","平均卧室数目","街区人口","平均入住率","街区的纬度","街区的经度"]

返回顶部


② 划分训练集、测试集

# 划分测试集和训练集
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=420)
# 重置索引
for i in [xtrain,xtest]:i.index = range(i.shape[0])

返回顶部


③ 对线性回归、岭回归、Lasso进行对比

# 线性回归进行拟合
reg = LinearRegression().fit(xtrain,ytrain)
reg_list = (reg.coef_*100).tolist()
#[43.73589305968403, 1.0211268294494038, -10.780721617317715, 62.64338275363783, 5.216125353178735e-05, -0.33485096463336095, -41.30959378947711, -42.621095362084674]
# 岭回归进行拟合
Ridge_ = Ridge(alpha=0).fit(xtrain,ytrain)
Ridge_list = (Ridge_.coef_*100).tolist()
#[43.735893059684045, 1.0211268294494151, -10.780721617317626, 62.64338275363741, 5.2161253532713044e-05, -0.3348509646333588, -41.3095937894767, -42.62109536208427]
# Lasso进行拟合
Lasso_ = Lasso(alpha=0).fit(xtrain,ytrain)
Lasso_list = (Lasso_.coef_*100).tolist()
#[43.735893059684045, 1.0211268294494151, -10.780721617317626, 62.64338275363741, 5.2161253532713044e-05, -0.3348509646333588, -41.3095937894767, -42.62109536208427]

我们可以看出,当岭回归和Lasso中的alpha都设定为0的时候,拟合的w都几乎差不了多少。但是Lasso尽管运行除了结果,却报了三个UserWarning:

UserWarning: With alpha=0, this algorithm does not converge well. You are advised to use the LinearRegression estimatorLasso_ = Lasso(alpha=0).fit(xtrain,ytrain)
UserWarning: Coordinate descent with no regularization may lead to unexpected results and is discouraged.positive)
ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Duality gap: 3769.8607714139102, tolerance: 1.917255476913148positive)

这三条分别是这样的内容:

  • 1.正则化系数为0,这样算法不可收敛!如果你想让正则化系数为0,请使用线性回归吧
  • 2.没有正则项的坐标下降法可能会导致意外的结果,不鼓励这样做!
  • 3.目标函数没有收敛,你也许想要增加迭代次数,使用一个非常小的 alpha来拟合模型可能会造成精确度问题!

看到这三条内容,大家可能会难以理解 ---- 怎么出现了坐标下降?这是由于 sklearn中的Lasso类不是使用最小二乘法来进行求解,而是使用坐标下降。考虑一下 Lasso既然不能够从根本解决多重共线性引起的最小二乘法无法使用的问题,那我们为什么要坚持最小二乘法呢?明明有其他更快更好的求解方法,比如坐标下降。

有了坐标下降,就有迭代收敛的问题,因此 sklearn不推荐我们使用0这样的正则化系数。如果我们的确希望取到0,那我们可以使用一个比较很小的数,比如0.01,或者10*e-3这样的值:

# 更改alpha
# 岭回归进行拟合
Ridge_ = Ridge(alpha=0.01).fit(xtrain,ytrain)
Ridge_list1 = (Ridge_.coef_*100).tolist()
#[43.73575720621605, 1.0211292318121836, -10.780460336251702, 62.64202320775686, 5.217068073243689e-05,
# -0.3348506517067627, -41.3095714322911, -42.62105388932374]
# Lasso进行拟合
Lasso_ = Lasso(alpha=0.01).fit(xtrain,ytrain)
Lasso_list1 = (Lasso_.coef_*100).tolist()
# [40.10568371834486, 1.0936292607860143, -3.7423763610244487, 26.524037834897207,
# 0.0003525368511503945, -0.3207129394887799, -40.06483047344844, -40.81754399163315]
[43.73589305968403, 1.0211268294494038, -10.780721617317715, 62.64338275363783, 5.216125353178735e-05, -0.33485096463336095, -41.30959378947711, -42.621095362084674]

通过对比可以发现,Lasso相对于岭回归而言,对于alpha的变化十分敏感。

假设我们对alpha再进行更改:

# 岭回归进行拟合
Ridge_ = Ridge(alpha=10**4).fit(xtrain,ytrain)
Ridge_list2 = (Ridge_.coef_*100).tolist()
#[34.620815176076945, 1.5196170869238694, 0.3968610529210133, 0.9151812510354866, 0.002173923801224843,
# -0.34768660148101016, -14.736963474215257, -13.43557610252691]
# Lasso进行拟合
Lasso_ = Lasso(alpha=10**4).fit(xtrain,ytrain)
Lasso_list2 = (Lasso_.coef_*100).tolist()
# [0.0, 0.0, 0.0, -0.0, -0.0, -0.0, -0.0, -0.0]

将alpha扩大至10000的时候,可以发现岭回归和Lasso的结果完全不同,岭回归仅有部分特征被压缩至趋近于0,而Lasso的所有特征全部压缩至了等于0,由此再次可以说明Lasso对于alpha的敏感。

返回顶部


④ 学习曲线

reg = LinearRegression().fit(xtrain,ytrain)
Ridge_ = Ridge(alpha=10**4).fit(xtrain,ytrain)
Lasso_ = Lasso(alpha=1).fit(xtrain,ytrain)
# 绘制学习曲线
plt.plot(range(1,9),(reg.coef_*100).tolist(),color='red',label='LR')
plt.plot(range(1,9),(Ridge_.coef_*100).tolist(),color='green',label='Ridge')
plt.plot(range(1,9),(Lasso_.coef_*100).tolist(),color='black',label='Lasso')
plt.plot(range(1,9),[0]*8,color='grey',linestyle='--')
plt.xlabel('w')
plt.legend()
plt.show()

通过图像可以看出,通过Lasso可以将特征系数压缩为0,而岭回归可以将特征系数压缩的无限逼近于0。可见,比起岭回归, Lasso所带的L1正则项对于系数的惩罚要重得多,并且它会将系数压至0,可以被用来做特征选择。也因此,我们往往让 Lasso正则化系数a在很小的空间中变动,以此来寻找最佳的正则化系数。

返回顶部


【skLearn 回归模型】Lasso <linear_model.Lasso>相关推荐

  1. R语言glmnet拟合lasso回归模型实战:lasso回归模型的模型系数及可视化、lasso回归模型分类评估计算(混淆矩阵、accuracy、Deviance)

    R语言glmnet拟合lasso回归模型实战:lasso回归模型的模型系数(lasso regression coefficients)及可视化.lasso回归模型分类评估计算(混淆矩阵.accura ...

  2. 【skLearn 回归模型】岭回归 <linear_model.Ridge>

    文章目录 一.岭回归概念 • 定义 • 岭回归处理多重共线性原理 二.linear_model.Ridge 类 案例:加利福尼亚房价 ① 读取数据集 ② 划分训练集.测试集 ③ 岭回归训练模型 ④ 使 ...

  3. 【skLearn 回归模型】多项式回归 PolynomialFeatures

    文章目录 一.多项式对数据的处理 ① 一维数据集简单案例 ---- (维度针对特征数而言) ② 多维数据集案例 ---- (维度针对特征数而言) ♦ 二维测试 ♦ 三维测试 ③ 多项式回归处理非线性问 ...

  4. 【skLearn 回归模型】岭回归 ---- 选择最佳正则化参数 <带交叉验证的岭回归RidgeCV()>

    文章目录 一.岭迹图 介绍 简单使用 二.交叉验证岭回归 ---- klearn.linear_model.RidgeCV 加利福尼亚房屋价值测试 一.岭迹图 介绍 既然要选择α的范围,我们就不可避免 ...

  5. 基于Python的岭回归与LASSO回归模型介绍及实践

    基于Python的岭回归与LASSO回归模型介绍及实践 这是一篇学习的总结笔记 参考自<从零开始学数据分析与挖掘> [中]刘顺祥 著 完整代码及实践所用数据集等资料放置于:Github 岭 ...

  6. Lasso回归系列二:Lasso回归/岭回归的原理

    Lasso回归/岭回归的原理 在学习L1,L2正则化的作用和区别时,我们总是会看到这样的一副图片: 这幅图片形象化地解释了L1,L2对线性模型产生的不同的约束效果. 我最开始其实是不太理解为什么要这么 ...

  7. (sklearn)lasso回归linear_model.Lasso()方法

    class sklearn.linear_model.Lasso(alpha=1.0, fit_intercept=True, normalize=False, precompute=False, c ...

  8. Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型

    Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型 目录

  9. 学习机器学习四 回归模型——线性回归、L1正则化(Lasso回归)、L2正则化(ridge回归)

    还记得什么是回归吗?回忆下回归就是连续的输出,分类是离散的. 回归模型一般分为:①线性回归--就是线性方程,类似为一元一次方程(y=wx+b),比如你的年龄: ②逻辑回归(类似为曲线方程) 线性回归 ...

最新文章

  1. 数据库连接报错之IO异常(The Network Adapter could not establish the connection)
  2. Simulink仿真 第九节 时间延迟模块
  3. 专家的修炼之路 —— 德雷福斯模型 Dreyfus
  4. 【算法设计与分析】15 分治策略:芯片测试
  5. html页面li节点排序,排序DOM节点的最简单方法?
  6. 沈志康奖教金 计算机学院,天大60名青年才俊获首届沈志康奖教金
  7. 单片机C语言任何位置跳转到任何指定地址 -转
  8. jQuery插件编写,
  9. 根据列值删除Pandas中的DataFrame行
  10. 二叉堆(binary heap)—— 优先队列的实现
  11. uva11549Calculator Conundrum
  12. 如何通过Filter过滤敏感词汇
  13. 分布式elasticsearch7.3.1集群部署
  14. 关于sublime Text3 显示gkb乱码的问题
  15. html画圆圈原理,HTML5如何划线和画圆
  16. ros软路由加h3c交换机搭建企业网络环境
  17. SQL yyyyMMdd转yyyy-MM-dd
  18. Oracle--同义词
  19. 【安利】前端基础学习资源
  20. 微软ERP Ax(Axapta) 3.0 sp4 安装过程演示

热门文章

  1. 22.卷积神经网络实战-Lenet5
  2. [bzoj3727]PA2014 Final Zadanie
  3. 【Python】python安装步骤
  4. 使用vue.js路由后失效
  5. 京东新注册两家云计算公司 注册地址为翠宫饭店
  6. QT QSettings介绍
  7. electron tray托盘
  8. 文本挖掘の玩转IphoneX评论数据
  9. Mac如何允许安装任何来源软件?
  10. 洛谷P3645 [APIO2015]雅加达的摩天楼