python-sklearn岭回归与LASSO回归模型(套索)代码实操

article/2025/9/28 20:29:17

python-sklearn岭回归与lasso回归模型代码实操

  • 前言
  • 一、岭回归
    • 1.岭回归介绍
    • 2.代码实现
    • 3.岭回归参数调整
    • 4.岭迹分析,可视化分析
  • 二、LASSO回归
    • 1.LASSO回归介绍
    • 2.代码实现
    • ps. Lasso回归的特征选择
    • 3.岭回归参数调整
    • 4.模型系数的数据可视化比较

前言

hello大家好这里是小L😊在这里想和大家一起学习一起进步。💪
这次笔记内容:学习岭回归与LASSO回归模型的sklearn实现。岭回归:平方和(L2正则化);LASSO回归:绝对值(L1正则化)。
为了防止线性回归的过拟合,加了正则化系数,系数可能有正有负,因此将他的绝对值或者平方和加起来,使得误差平方和最小。

一、岭回归

1.岭回归介绍

L2正则化
在这里插入图片描述

sklearn.linear_model.Ridge(

  • alpha=1:正则化因子(系数theta),入越大,越限制theta(即斜率k)越平缓,系数越小系数越小误差越小。入越大,绝对值越接近于0。(限制x的发展,如果取0,x放飞)
  • fit_ intercept=True:截距,是否计算该模型截距。(除非数据标准化之后可false. )
  • normalize=False:标准化false,标准化一般在建模之前做(sklearn.preprocessing.StandardScale)。
  • copy_X=True:原始的x还在,中间的用另一个存在。如false不要原来的x,新数据覆盖旧数据。
  • max_iter=None: 最大迭代次数
  • tol =0.001:忍耐力,每努力一次提升的效果不大,提升没有超过0.001就停止
  • solver =‘auto’:提供很多方法
    在这里插入图片描述
  • random_state:随机种子

属性

  • intercept_ :截距
  • coef_ :系数theta1到thetan,第几个自变量前面的系数,没有截距,只限制theta1–thetan来防止过拟合(决定斜率k),theta0(截距)没有关系
  • n_iter_:迭代多少次

方法

  • fit 训练
  • predict预测
  • score模型评估,不大于1,越大越好
  • get_params返回超参数的值
  • set_params修改超参数的值重新训练

2.代码实现

from sklearn.datasets import load_diabetes
diabetes=load_diabetes()#以糖尿病模型为例
X=diabetes.data#自变量
y=diabetes.target#因变量
from sklearn.model_selection import train_test_split#数据划分
X_train,X_test,y_train,y_test=train_test_split(X,y,random=8)
from sklearn.linear_model import Ridge#导入岭回归模型
ridge=Ridge()#模型实例化
ridge.fit(X_train,y_train)#模型训练
print("训练集的得分为:{:,2f}".format(ridge.score(X_train,y_train)))
print("测试集的得分为:{:,2f}".format(ridge.score(X_test,y_test)))

运行结果如下:

训练数据集得分:0.43
测试数据集得分:0.43

可以看出效果并不是很好,但是也不能因为一次结果否定这个模型,可以通过调参的方法,重新进行模型训练。

3.岭回归参数调整

#岭回归调参
#正则化系数alpha=10
ridge10=Ridge(alpha=10).fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(ridge10.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(ridge10.score(X_test,y_test)))

运行结果如下:

训练数据集得分:0.15
测试数据集得分:0.16

可以看出结果更加糟糕

#正则化系数alpha=0.1
ridge01=Ridge(alpha=0.1).fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(ridge01.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(ridge01.score(X_test,y_test)))

运行结果如下:

训练数据集得分:0.52
测试数据集得分:0.47

4.岭迹分析,可视化分析

#岭迹分析
#10个特征0-9,在4种回归的系数画出来
#模型系数的可视化比较
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='linear regression')
plt.xlabel("系数序号")
plt.ylabel("系数量级")
plt.hlines(0,0,len(lr.coef_))#hlines水平线从0到10(查)
plt.legend(loc='best')
plt.grid(linestyle=':')

在这里插入图片描述

alpha越大,绝对值越接近于0。(限制x的发展,如果取0,x放飞)

#绘制学习曲线:取固定alpha的值,改变训练集的数量
import numpy as np
from sklearn.model_selection import learning_curve,KFold
def plot_learning_curve(est,X,y):training_set_size,train_scores,test_scores=learning_curve(est,X,y,train_sizes=np.linspace(.1,1,20),cv=KFold(20,shuffle=True,random_state=1))estimator_name=est.__class__.__name__line=plt.plot(training_set_size,train_scores.mean(axis=1),'--',label='training'+estimator_name)plt.plot(training_set_size,test_scores.mean(axis=1),'-',label='test'+estimator_name,c=line[0].get_color())plt.xlabel('Training set size')plt.ylabel('Score')plt.ylim(0,1.1)
plot_learning_curve(Ridge(alpha=1),X,y)
plot_learning_curve(LinearRegression(),X,y)
plt.legend(loc=(0,1.05),ncol=2,fontsize=11)
plt.grid(linestyle=':')

在这里插入图片描述

二、LASSO回归

1.LASSO回归介绍

L1正则化
在这里插入图片描述

sklearn.linear_model.Lasso(

  • alpha=1:正则化因子(系数theta),入越大,越限制theta(即斜率k)越平缓,系数越小系数越小误差越小。入越大,绝对值越接近于0。(限制x的发展,如果取0,x放飞)
  • fit_ intercept=True:截距,是否计算该模型截距。(除非数据标准化之后可false. )
  • normalize=False:标准化false,标准化一般在建模之前做(sklearn.preprocessing.StandardScale)。
  • precompute=False
  • **copy_X=**True:原始的x还在,中间的用另一个存在。如false不要原来的x,新数据覆盖旧数据。
  • max_iter=1000: 最大迭代次数
  • tol =0.0001:忍耐力,每努力一次提升的效果不大,提升没有超过0.001就停止
  • warm_start =True:下一次运行会从当前的点继续往下走,若False每次都重新运行一次[重新开始](深度学习中经常有这个参数)
  • positive=False
  • random_state=None:随机种子
    selection=‘cyclic’

2.代码实现

from sklearn.datasets import load_diabetes
diabetes=load_diabetes()#以糖尿病模型为例
X=diabetes.data#自变量
y=diabetes.target#因变量
from sklearn.model_selection import train_test_split#数据划分
X_train,X_test,y_train,y_test=train_test_split(X,y,random=8)
from sklearn.linear_model import Lasso#导入Lasso回归模块
lasso=Lasso()#模型实例化
lasso.fit(X_train,y_train)#模型训练
print("套索回归在训练集的得分为:{:,2f}".format(lasso.score(X_train,y_train)))
print("套索回归在测试集的得分为:{:,2f}".format(lasso.score(X_test,y_test)))

运行结果如下:

训练数据集得分:0.36
测试数据集得分:0.37

可以看出效果并不是很好,但是也不能因为一次结果否定这个模型,可以通过调参的方法,重新进行模型训练。

ps. Lasso回归的特征选择

#岭回归圈圈(L2范数,里面可以有多个0,削尖,把很多特征都削成0),Lasso回归四条直线(L1范数方形)
lasso和岭回归,根据最小二乘法,最后需要使误差最小。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由于岭回归对w的限制空间是圆形的,lasso对w的限制空间是由棱角的。椭圆更容易切在w为某一维的图形为有棱角的图形,即Lasso回归模型。(圆形有凸起会阻挡切在0的位置)

LASSO回归相对于岭回归,更适合做特征选择。(面试问题)
怎样调节优化多个特征,选出更重要的特征,使得我们的精度更高

print("套索回归使用的特征数:{}".format(np.sum(lasso.coef_!=0)))

运行结果如下:

套索回归使用的特征数:3

比较一下岭回归和Lasso回归中能使用的特征数
Lasso回归

lasso.coef_

运行结果如下:

array([  0.        ,  -0.        , 384.73421807,  72.69325545,0.        ,   0.        ,  -0.        ,   0.        ,247.88881314,   0.        ])

岭回归

ridge.coef_

运行结果如下:

array([  36.8262072 ,  -75.80823733,  282.42652716,  207.39314972,-1.46580263,  -27.81750835, -134.3740951 ,   98.97724793,222.67543268,  117.97255343])

3.岭回归参数调整

#增大最大迭代次数的默认设置,(默认max_iter=1000)
lasso=Lasso(max_iter=100000)
lasso.fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(lasso.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(lasso.score(X_test,y_test)))
print("套索回归中使用的特征数:{}".format(lasso.score(X_test,y_test)))

运行结果如下:

训练数据集得分:0.36
测试数据集得分:0.37
套索回归中使用的特征数:0.36561858962128

可以看出结果并没有什么变化,所以换一个参数继续调参

#增加最大迭代次数的默认值设置,(默认max_iter=1000)
#同时调整alpha的值
lasso01=Lasso(alpha=0.1,max_iter=100000)
lasso01.fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(lasso01.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(lasso01.score(X_test,y_test)))
print("套索回归中使用的特征数:{}".format(lasso01.score(X_test,y_test)))

运行结果如下:

训练数据集得分:0.52
测试数据集得分:0.48
套索回归中使用的特征数:0.47994757514558173

继续尝试探索规律

#增加最大迭代次数的默认值设置,(默认max_iter=1000)
#同时调整alpha的值
lasso00001=Lasso(alpha=0.0001,max_iter=100000)
lasso00001.fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(lasso00001.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(lasso00001.score(X_test,y_test)))
print("套索回归中使用的特征数:{}".format(lasso00001.score(X_test,y_test)))

结果如下:

训练数据集得分:0.53
测试数据集得分:0.46
套索回归中使用的特征数:0.4594509683706015

alpha越大,选的特征越少。alpha=0时,普通的线性回归(限制x的发展,如果取0,x放飞)

4.模型系数的数据可视化比较

plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='linear regression')plt.plot(lasso.coef_,'D',label='Lasso alpha=1')
plt.plot(lasso01.coef_,'H',label='Lasso alpha=0.1')
plt.plot(lasso00001.coef_,'p',label='Lasso alpha=0.0001')plt.xlabel("系数序号")
plt.ylabel("系数量级")
plt.hlines(0,0,len(lr.coef_))#hlines水平线从0到10(查)
plt.legend(loc='best')
plt.grid(linestyle=':')

在这里插入图片描述


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

相关文章

python机器学习库sklearn——Lasso回归(L1正则化)

分享一个朋友的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 Lasso The L…

【数据挖掘】Lasso回归原理讲解及实战应用(超详细 附源码)

需要源码请点赞关注收藏后评论区留言私信~~~ Lasso回归 岭回归无法剔除变量,而Lasso(Least Absolute Shrinkage and Selection Operator)回归模型,将惩罚项由L2范数变为L1范数,可以将一些不重要的回归系数缩减为0&…

Lasso回归系列四:Group Lasso,Sparse Group Lasso

Lasso变体:Group Lasso,Sparse Group Lasso 关于Lasso回归的讲解可以看我的另一篇博客:Lasso回归系列二:Lasso回归/岭回归的原理 Group Lasso 在Lasso回归中,是单独地看待每个特征(即假定特征不存在先验的分组)&…

Group Lasso

简介 Lasso(least absolute shrinkage and selection operator,又译最小绝对值收敛和选择算子、套索算法)是一种同时进行特征选择和正则化(数学)的回归分析方法,旨在增强统计模型的预测准确性和可解释性&a…

Lasso回归(Stata)

本文借鉴了数学建模清风老师的课件与思路,可以点击查看链接查看清风老师视频讲解:清风数学建模:https://www.bilibili.com/video/BV1DW411s7wi 前言 一、lasso回归的应用 这里因为Stata里对岭回归有bug,所以就没有岭回归&#xff…

Lasso-Logistic回归-R语言应用详解

Lasso简介 LASSO(Least Absolute Shrinkage and Selection Operator)是线性回归的一种缩减方式,通过引入 L 1 L_1 L1​惩罚项,实现变量选择和参数估计。 ∑ i 1 N ( y i − β 0 ∑ j 1 p x i j β j ) 2 λ ∑ j 1 p ∣ β j ∣ \sum_{i1}^{N}\le…

Lasso问题

转自:http://blog.csdn.net/slade_sha/article/details/53164905 先看一波过拟合: 图中,红色的线存在明显的过拟合,绿色的线才是合理的拟合曲线,为了避免过拟合,我们可以引入正则化。 下面可以利用正则化来…

Lasso Regression

Lasso Regression 标签(空格分隔): 监督学习 在数据挖掘和机器学习算法的模型建立之初,为了尽量的减少因缺少重要变量而出现的模型偏差问题,我们通常会尽可能的多的选择自变量。但是在实际建模的过程中,通…

logistic回归、lasso回归、ridge回归、Elastic Net回归之间的总结

1. 概念 一直看一遍忘一遍,实在懒得再查了,理解后再次整理,希望能加深理解。 先总结几个概念: 回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器&#xff…

机器学习--岭回归和Lasso回归

任何数据都存在噪声和多重共线性 如何解决多重共线性 ? 1.算法角度(正则化) 2.数据角度(最有效果) 岭回归与Lasso回归的出现是为了解决线性回归出现的过拟合(数据间高度线性相关)以及在通过正规…

LASSO和LARS

1、LASSO简介 LASSO是一种经典的松弛算法,其全称是The Least Absolute Shrinkage and Selectionator operator,于1996年由Tibshirani提出来。lasso的一个根本思想就是利用L1范式来诱导稀疏解,下面给出lasso的两种形式以及其等价性证明&#x…

R语言实现LASSO回归

Lasso回归又称为套索回归,是Robert Tibshirani于1996年提出的一种新的变量选择技术。Lasso是一种收缩估计方法,其基本思想是在回归系数的绝对值之和小于一个常数的约束条件下,使残差平方和最小化,从而能够产生某些严格等于0的回归…

python-LASSO回归模型

https://zhuanlan.zhihu.com/p/76055830 LASSO回归模型的应用 ①可视化方法确定值 import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib from sklearn import model_selection from sklearn.linear_model import Lasso, LassoCV font…

Lasso模型

Lasso是一种数据降维方法,该方法不仅适用于线性情况,也适用于非线性情况。Lasso是基于惩罚方法对样本数据进行变量选择,通过对原本的系数进行压缩,将原本很小的系数直接压缩至0,从而将这部分系数所对应的变量视为非显著…

Lasso算法理论介绍

先看一波过拟合: 图中,红色的线存在明显的过拟合,绿色的线才是合理的拟合曲线,为了避免过拟合,我们可以引入正则化。 下面可以利用正则化来解决曲线拟合过程中的过拟合发生,存在均方根误差也叫标准误差&…

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

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

回归问题-Lasso回归

Lasso(Least absolute shrinkage and selection operator)方法是以缩小变量集(降阶)为思想的压缩估计方法。它通过构造一个惩罚函数,可以将变量的系数进行压缩并使某些回归系数变为0,进而达到变量选择的目的。 正则化 正则化&am…

Lasso回归

维数灾难 高维数据 何谓高维数据?高维数据指数据的维度很高,甚至远大于样本量的个数。高维数据的明显的表现是:在空间中数据是非常稀疏的,与空间的维数相比样本量总是显得非常少。 在分析高维数据过程中碰到最大的问题就是维数…

1.1.3. Lasso(套索回归)

1.1.3. Lasso 一、简介 首先,Lasso同样是线性回归的一种变体。而文档中指出,它是一种能让参数 ω \omega ω稀疏的模型(作用)。它是压缩感知领域的基础(地位),在特定情况下,它可以“…

【机器学习】Lasso模型

一、引言 1.1 高维数据 何谓高维数据?高维数据指数据的维度很高,甚至远大于样本量的个数。高维数据的明显的表现是:在空间中数据是非常稀疏的,与空间的维数相比样本量总是显得非常少。 在分析高维数据过程中碰到最大的问题就是维…