多元线性回归-Lasso

article/2025/9/28 22:26:18

目录

1.Lasso与多重共线性

2. Lasso的核心作用:特征选择

3. 选取最佳的正则化参数取值 


1.Lasso与多重共线性

        Lasso全称最小绝对收缩和选择算子(Least absolute shrinkage and selection operator),由于这个名称过于复杂所以简称为Lasso,和岭回归一样,Lasso是用来作用于多重共线性的算法,不过Lasso使用的是系数w的L1范式(L1范式是系数w的绝对值)乘系数\alpha,所以Lasso的损失函数表达式为:

min\left \| Xw-y \right \|_{2}^{2}+\alpha \left \| w \right \|_{1}

Lasso的推导过程:

w 在岭回归中,通过正则化系数\alpha能够向方阵X^{T}X加上一个单位矩阵,以此来防止方阵X^{T}X的行列式为0,而在L1范式所带的正则项\alpha在求导之后并不带有w这个项,因此无法对X^{T}X造成任何影响,也就是说Lasso无法解决特征之间“精确相关”的问题,当我们使用最小二乘法求解线性回归时,如果线性回归无解或报除零错误,换Lasso不能解决任何问题。

岭回归  VS  Lasso

岭回归可以解决特征间的精确相关关系导致最小二乘法无法使用的问题,而Lasso不行。

 而在现实中,其实会很少遇到“精确相关关系”的多重共线性问题,大部分多重共线性应该是“高度相关关系”,而如果假设方阵X^{T}X的逆是一定存在的,那么可以有:

w=X^{T}X^{-1}(X^{T}y-\frac{\alpha I}{2})

通过增大\alpha,我们可以为w的计算增加增加一个负项,从而限制参数估计中w的大小,而防止多重共线性引起的参数w被估计过大导致模型失准的问题,Lasso不是从根本上解决多重共线性的问题,而是限制多重共线性带来的影响。何况这还是在假设所有系数都为正的前提下,假设系数w无法为正,则很有可能需要将正则化参数\alpha设定为负,因此\alpha可以去负数,并且负数越大,对共线性的限制也越大。 

L1和L2正则化一个核心差异就是他们对系数w的影响:两个正则化都会压缩w的大小,对标签贡献更少的特征的系数会更小,也会更容易被压缩。不过L2正则化只会将系数压缩到尽量接近0,但L1正则化主导稀疏性,因此会将系数压缩到0.这个性质,让Lasso成为了线性模型中的特征选择工具首选。

2. Lasso的核心作用:特征选择

class sklearn.linear_model.Lasso(alpha=1.0,fit_intercept=True,normalize=False,precompute=False,copy_X=True,max_iter=1000,tol=0.001,warm_start=False,random_state=None)

 sklearn中使用类Lasso来调用Lasso回归,众多参数中比较重要的是参数alpha,正则化系数设置使用参数positive,当这个参数为True,表示Lasso回归出的系数必须为正数。

加利福尼亚房屋数据案例:

import numpy as np
import pandas as pd
from sklearn.linear_model import Ridge,LinearRegression,Lasso
from sklearn.model_selection import train_test_split as TTS
from sklearn.datasets import fetch_california_housing as fch
import matplotlib.pyplot as plt
housevalue=fch()
x=pd.DataFrame(housevalue.data)
y=housevalue.target
x.columns=["住户收入中位数","房屋使用年代中位数","平均房间数目","平均卧室数目","街区人口","平均入住率","街区的纬度","街区的经度"]
xtrain,xtest,ytrain,ytest=TTS(x,y,test_size=0.3,random_state=420)
for i in [xtrain,xtest]:i.index=range(i.shape[0])
# 线性回归拟合
reg=LinearRegression().fit(xtrain,ytrain)
(reg.coef_*100).tolist()
[43.735893059684,1.0211268294493827,-10.780721617317681,62.643382753637766,5.2161253534695196e-05,-0.3348509646333501,-41.3095937894772,-42.62109536208474]
# 岭回归进行拟合
Ridge_=Ridge(alpha=0).fit(xtrain,ytrain)
(Ridge_.coef_*100).tolist()
[43.73589305968356,1.0211268294493694,-10.780721617316962,62.6433827536353,5.2161253532548055e-05,-0.3348509646333529,-41.30959378947995,-42.62109536208777]
# Lasso进行拟合
lasso_=Lasso(alpha=0).fit(xtrain,ytrain)
(lasso_.coef_*100).tolist()
<ipython-input-11-69dcd6f67a03>:2: UserWarning: With alpha=0, this algorithm does not converge well. You are advised to use the LinearRegression estimatorlasso_=Lasso(alpha=0).fit(xtrain,ytrain)
D:\Anaconda\Anaconda\lib\site-packages\sklearn\linear_model\_coordinate_descent.py:648: UserWarning: Coordinate descent with no regularization may lead to unexpected results and is discouraged.model = cd_fast.enet_coordinate_descent(
D:\Anaconda\Anaconda\lib\site-packages\sklearn\linear_model\_coordinate_descent.py:648: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.770e+03, tolerance: 1.917e+00 Linear regression models with null weight for the l1 regularization term are more efficiently fitted using one of the solvers implemented in sklearn.linear_model.Ridge/RidgeCV instead.model = cd_fast.enet_coordinate_descent(
[43.73589305968403,1.0211268294494058,-10.780721617317653,62.643382753637724,5.2161253532678864e-05,-0.33485096463335745,-41.30959378947717,-42.62109536208475]

报错内容分别为:

1.正则化系数为0,这样算法不可收敛!如果想让正则化系数为0,则是用线性回归

2.没有正则项的坐标下降法可能会导致意外的结果,不鼓励这样做!

3.目标函数没有收敛,你也许想要增加迭代次数,使用一个非常小的alpha来拟合模型可能会造成精确度问题。

将alpha设置为0.01

# 岭回归进行拟合
Ridge_=Ridge(alpha=0.01).fit(xtrain,ytrain)
(Ridge_.coef_*100).tolist()
[43.73575720621553,1.0211292318121377,-10.78046033625102,62.64202320775469,5.217068073227091e-05,-0.3348506517067568,-41.309571432294405,-42.621053889327314]
# Lasso进行拟合
lasso_=Lasso(alpha=0.01).fit(xtrain,ytrain)
(lasso_.coef_*100).tolist()
[40.10568371834486,1.093629260786014,-3.7423763610244563,26.524037834897197,0.00035253685115039417,-0.32071293948878005,-40.064830473448424,-40.81754399163315]

加大正则项系数

# 岭回归进行拟合
Ridge_=Ridge(alpha=10**4).fit(xtrain,ytrain)
(Ridge_.coef_*100).tolist()
[34.62081517607707,1.5196170869238759,0.3968610529209999,0.915181251035547,0.0021739238012248533,-0.34768660148101127,-14.73696347421548,-13.435576102527182]
# Lasso进行拟合
lasso_=Lasso(alpha=10**4).fit(xtrain,ytrain)
(lasso_.coef_*100).tolist()
[0.0, 0.0, 0.0, -0.0, -0.0, -0.0, -0.0, -0.0]
# Lasso进行拟合
lasso_=Lasso(alpha=1).fit(xtrain,ytrain)
(lasso_.coef_*100).tolist()
[14.581141247629423,0.6209347344423876,0.0,-0.0,-0.00028065986329009983,-0.0,-0.0,-0.0]
plt.plot(range(1,9),(reg.coef_*100).tolist(),color="red",label="LR")
plt.plot(range(1,9),(Ridge_.coef_*100).tolist(),color="orange",label="Ridge")
plt.plot(range(1,9),(lasso_.coef_*100).tolist(),color="k",label="Lasso")
plt.plot(range(1,9),([0]*8),color="grey",linestyle="--")
plt.xlabel('w') #横坐标是每一个特征对应的系数
plt.legend()
plt.show()

可见,比起岭回归,Lasso所带的L1正则项对于系数的惩罚要重很多,并且它会将系数压缩至0,因此可以被用来作特征选择,也因此,我们往往让Lasso的正则化系数\alpha在很小的空间中变动,以此来寻找最佳正则化系数。

3. 选取最佳的正则化参数取值 

class sklearn.linear_model.LassoCV(eps=0.001,n_alphas=100,alphas=None,fit_intercept=True,        normalize=False,precompute='auto',max_iter=1000,tol=0.0001,copy_X=True,cv='warn',                verbose=False,n_jobs=None,positive=False,random_state=None,selection='cyclic')

使用交叉验证的Lasso类的参数看起来与岭回归不同,这是由于Lasso对于alpha的取值更加敏感,由于Lasso对正则化系数的变动过于敏感,因此我们往往让\alpha在很小的空间中变动。这个小空间很小(不是0.01到0.02之间这样的空间,这样的空间对Lasso而言还是太大了),因此设定了一个重要概念“正则化路径”,用来设定正则化系数的变动:

正则化路径regularization path
假设特征矩阵中有n个特征,则有特征向量x_{1},x_{2},x_{n}。对于每一个\alpha的取值,我们都可以得出一组对应这个特征向量的参数向量w,其中包含了n+1个参数,分别是w_{0},w_{1},w_{2},……w_{n}。这些参数可以被看做是一个n维空间中的一个点。对于不同的\alpha取值,我们将得到许多个在n维空间中的点,所有的这些点形成的序列,就被称之为正则化路径。

我们把形成这个正则化路径的\alpha的最小值除以\alpha的最大值得到的量\frac{\alpha .min}{\alpha .max}称为正则化路径的长度(length of the path)。在sklearn中,我们可以通过规定正则化路径的长度(即限制\alpha的最小值和最大值之间的比例),以及路径中\alpha的个数,来让sklearn为我们自动生成\alpha的取值,这就避免了我们需要自己生成非常非常小的\alpha的取值列表来让交叉验证类使用,类LassoCV就可以自己计算。

和岭回归的交叉验证相似,除了进行交叉验证之外,LassoCV也会单独建立模型,它会先找出最佳的正则化参数,然后在这个参数下按照模型评估指标进行建模,需要注意的是,LassoCV的模型评估指标选用的是均方误差,而岭回归的模型评估指标是可以自己设定的,并且默认是R^{2}

参数含义
eps正则化路径的长度,默认为0.001
n_alphas正则化路径中\alpha的个数,默认100
alphas需要测试的正则化参数取值的元组,默认为None,当不输入的时候,自动使用eps和n_alphas来自动生成代入交叉验证的正则化参数
cv

交叉验证的次数,默认3折交叉验证

属性含义
alpha_调用交叉验证选出来的最佳正则化参数
alphas_使用正则化路径的长度和路径中\alpha的个数来自动生成的,用来进行交叉验证的正则化参数
mse_path返回所有交叉验证的结果细节
coef_调用最佳正则化参数下建立的模型的系数

实践代码:

from sklearn.linear_model import LassoCV
import numpy as np
# 自己建立Lasso进行alpha选择的范围
alpharange=np.logspace(-10,-2,200,base=10)
# 形成以10为底的指数函数 10**(-10)到10**(-2)次方
# 建模
lasso_=LassoCV(alphas=alpharange,cv=5).fit(xtrain,ytrain)
# 查看被选择出来的最佳正则化系数
lasso_.alpha_
0.0020729217795953697
lasso_.mse_path_.mean(axis=1)  #返回均方误差  在岭回归中轴向axis=0

在岭回归当中使用的是留意验证,因此交叉验证的结果是每一个样本在每个alpha下的交叉验证结果,因此求每个alpha下交叉验证的均值,就是axis=0,跨行求均值 列为alpha

在Lasso中返回的是,每一个alpha取值下,每一折交叉验证的结果,因此求每个alpha下交叉验证均值,就是axis=1,跨列求均值  行为alpha

# 最佳正则化系数下获得的模型的系数结果
lasso_.coef_
array([ 4.29867301e-01,  1.03623683e-02, -9.32648616e-02,  5.51755252e-01,1.14732262e-06, -3.31941716e-03, -4.10451223e-01, -4.22410330e-01])
lasso_.score(xtest,ytest)
0.6038982670571434
# 与线性回归相比如何
reg=LinearRegression().fit(xtrain,ytrain)
reg.score(xtest,ytest)
0.6084558760596188
# 使用LassoCV自带的正则化路径长度和路径中的alpha个数来自动建立alpha选择的范围
ls_=LassoCV(eps=0.00001,n_alphas=300,cv=5).fit(xtrain,ytrain)
ls_.alpha_
0.0020954551690628557
ls_.score(xtest,ytest)
0.60389154238192
ls_.coef_
array([ 4.29785372e-01,  1.03639989e-02, -9.31060823e-02,  5.50940621e-01,1.15407943e-06, -3.31909776e-03, -4.10423420e-01, -4.22369926e-01])


http://chatgpt.dhexx.cn/article/RnkrYqJh.shtml

相关文章

Lasso线性回归学习笔记(公式与代码实现)

目录 Lasso线性回归学习笔记&#xff08;公式与代码实现&#xff09;1 为什么要在线性回归中引入正则化项&#xff08;简介&#xff09;2 常见正则化项3 损失函数图像与正则化之后的图像3.1损失函数图像3.2 加了 L~1~ 正则项之后的损失函数图像 4 L~1~ 范数正则化的解中有更多零…

机器学习算法系列(五)- Lasso回归算法(Lasso Regression Algorithm)

阅读本文需要的背景知识点&#xff1a;线性回归算法、一丢丢编程知识 最近笔者做了一个基于人工智能实现音乐转谱和人声分离功能的在线应用——反谱&#xff08;Serocs&#xff09;&#xff0c;感兴趣的读者欢迎试用与分享&#xff0c;感谢您的支持&#xff01;serocs.cn 一、…

学习机器学习和深度学习的方法和步骤

学习机器学习和深度学习的方法和步骤 相信很多人都在找学习机器学习和深度学习的步骤和教程。作为过来人和大家一起交流一下。 我自己制作的一个思维导图希望对大家有帮助。

机器学习算法介绍

前言 谷歌董事长施密特曾说过&#xff1a;虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注&#xff0c;但是这家公司真正的未来在于机器学习&#xff0c;一种让计算机更聪明、更个性化的技术。 也许我们生活在人类历史上最关键的时期&#xff1a;从使用大型计算机&#xf…

机器学习之【提升方法】

机器学习【提升方法】 一、Adaboost的起源1.强可学习与弱可学习 二、怎样实现弱学习转为强学习1.怎样获得不同的弱分类器?BaggingBagging的弊端 2.怎样组合弱分类器? 三、Adaboost的提出四、Adaboost的基本概念五、Adaboost算法六、示例七、Boosting illustration 一、Adaboo…

(四)机器学习方法的分类

文章目录 一、监督学习二、非监督学习三、半监督学习四、增强学习五、机器学习的其他分类1. 批量学习&#xff08;Batch Learning&#xff09;2. 在线学习&#xff08;Online Learning&#xff09;3. 参数学习&#xff08;Parametric Learning&#xff09;4. 非参数学习 在上一…

【机器学习】之机器学习方法的分类

1&#xff0c;监督学习 给机器的训练数据拥有标记和答案 例如&#xff1a; 图像已经积累了标定信息银行已经积累了客户的信息和信用卡的信息 2&#xff0c;非监督学习 给机器的训练数据没有标记或答案 对没有标记的数据进行分类 – 聚类分析 对数据进行降维处理 特征提取…

机器学习常用方法

在本篇文章中&#xff0c;我将对机器学习做个概要的介绍。本文的目的是能让即便完全不了解机器学习的人也能了解机器学习&#xff0c;并且上手相关的实践。这篇文档也算是EasyPR开发的番外篇&#xff0c;从这里开始&#xff0c;必须对机器学习了解才能进一步介绍EasyPR的内核。…

机器学习的几种学习方式

根据数据类型的不同&#xff0c;对一个问题的建模有不同的方式&#xff0c;人们首先会考虑算法的学习方式。将算法按照学习方式分类可以让人们在建模和算法选择时&#xff0c;根据输入数据来选择最合适的算法&#xff0c;从而获得最好的结果。 在机器学习领域&#xff0c;有以…

机器学习--机器学习的基本方法

文章目录 1.1统计分析1.1.1 统计基础1.1.2 常见的概率分布2.1.3参数估计1.1.4 假设与检验1.1.5线性回归1.1.6逻辑回归1.1.7判别分析1.1.8 非线性判决 1.1统计分析 统计学是研究如何收集资料&#xff0c;整理资料和进行量化分析&#xff0c;判断的一门学科。在科学计算&#xf…

机器学习的四种学习方法

文章目录 监督学习&#xff08;Supervised Learning&#xff09;无监督学习&#xff08;Unsupervised Learning&#xff09;半监督学习&#xff08;Semi-supervised Learning)强化学习&#xff08;Reinforcement Learning)应用 监督学习&#xff08;Supervised Learning&#x…

机器学习方法的基本分类

目录 1、监督学习&#xff08;supervised learning&#xff09; 2、无监督学习&#xff08;unsupervised learning&#xff09; 3、强化学习&#xff08;reinforcement learning&#xff09; 4、半监督学习&#xff08;semi-supervised learning&#xff09;与主动学习&…

机器学习的常用方法

转自 史上最强----机器学习经典总结---入门必读----心血总结-----回味无穷 在这个部分我会简要介绍一下机器学习中的经典代表方法。这部分介绍的重点是这些方法内涵的思想&#xff0c;数学与实践细节不会在这讨论。 1、回归算法 在大部分机器学习课程中&#xff0c;回归算法都…

机器学习的三种方法

目录 介绍 鸢尾花(Iris)数据集 梯度下降 逻辑回归 使用逻辑回归处理鸢尾花(Iris)数据集 反向传播 使用反向传播处理鸢尾花(Iris)数据集 支持向量机 用支持向量机处理鸢尾花(Iris)数据集 结论 下载Iris_Data-3.7 KB下载LogiticRegression_Iris-309.7 KB下载LogiticReg…

机器学习的方法

机器学习(machine learning)是一门多领域交叉学科,涉及了概率论、统计学、算法复杂度等多门学科。专门研究计算机怎样模拟或实现人的学习行为,它能够发现和挖掘数据所包含的潜在价值。机器学习已经成为了人工智能的一个分支,通过自学习算法,发现和挖掘数据潜在的规律,从…

机器学习中常见4种学习方法、13种算法

机器学习中常见4种学习方法、13种算法 一. 4大主要学习方法 1.1 监督式学习 在监督式学习下&#xff0c;输入数据被称为“训练数据”&#xff0c;每组训练数据有一个明确的标识或结果&#xff0c;如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”&#xff0c;对手写数字识别中…

机器学习的13种算法和4种学习方法,推荐给大家

机器学习的算法很多。很多时候困惑人们都是&#xff0c;很多算法是一类算法&#xff0c;而有些算法又是从其他算法中延伸出来的。这里&#xff0c;我们从两个方面来给大家介绍&#xff0c;第一个方面是学习的方式&#xff0c;第二个方面是算法的分类。 一、4大主要学习方式 1…

好用的浏览器主页有哪些?

浏览器主页由于有个网址就能用&#xff0c;越来越受到年轻人的喜爱&#xff0c;而且浏览器主页非常的方便&#xff0c;我为什么说方便呢&#xff1f;举个例子哈&#xff0c;当我们在外边用电脑时&#xff0c;发现电脑自带的浏览器完全不符合自己的使用习惯&#xff0c;没有自己…

看完这6款浏览器的对比,你还使用国产浏览器吗

市面上的国产浏览器实在是太多了&#xff0c;曾几时&#xff0c;我也曾因为选择使用哪款浏览器而纠结过。是用搜狗浏览器好&#xff0c;还是360极速浏览器好&#xff0c;或者是多御浏览器&#xff1f;直到我学习了计算机&#xff0c;慢慢地开始使用国外浏览器&#xff0c;偶尔也…

目前主流浏览器市场及浏览器内核介绍

主流浏览器 以下的数据来源于国际知名的统计网站statcounter&#xff0c;数据的统计时间为2021年08月 – 2022年08月 主流电脑浏览器 全球 国内 主流手机浏览器 全球 国内 由此数据可看到&#xff0c;谷歌浏览器的市场份额占比遥遥领先 浏览器内核 1. Trident IE的内…