线性回归(四)---Lasso回归

Lasso回归

Lasso是可以估计稀疏系数的线性模型,尤其适用于减少给定解决方案依赖的特征数量的场合。如果数据的特征过多,而其中只有一小部分是真正重要的,此时选择Lasso比较合适。在数学表达上,Lasso类似于岭回归,也是在代价函数基础上增加了一个惩罚项的线性模型。

主参数设置

alpha : float, 可选,默认 1.0。当 alpha 为 0 时算法等同于普通最小二乘法,可通过 Linear Regression 实现,因此不建议将 alpha 设为 0.

fit_intercept : boolean
是否进行拦截计算(intercept)。若 false,则不计算(比如数据已经经过集中了)。

normalize : boolean, 可选, 默认 False 是否将数据归一化。
若 True,则先 normalize 再 regression。若 fit_intercept 为 false 则忽略此参数。当 regressors 被 normalize 的时候,需要注意超参(hyperparameters)的学习会更稳定,几乎独立于 sample。对于标准化的数据,就不会有此种情况。如果需要标准化数据,请对数据预处理。然后在学习时设置 normalize=False。这里归一化有两个好处:(1):提升模型的收敛速度,减少寻找最优解的时间。(2)提升模型的精度

copy_X : boolean, 可选, 默认 True
若 True,则会复制 X;否则可能会被覆盖。

precompute : True | False | array-like, 默认=False
是否使用预计算的 Gram 矩阵来加速计算。如果设置为 ‘auto’ 则机器决定。Gram 矩阵也可以 pass。对于 sparse input 这个选项永远为 True。

max_iter : int, 可选 最大循环次数。

tol : float, 可选 优化容忍度 The tolerance for the optimization: 若更新后小于 tol,优化代码检查优化的 dual gap 并继续直到小于 tol 为止。

warm_start : bool, 可选为 True 时, 重复使用上一次学习作为初始化,否则直接清除上次方案。

positive : bool, 可选 设为 True 时,强制使系数为正。

selection : str, 默认 ‘cyclic’
若设为 ‘random’, 每次循环会随机更新参数,而按照默认设置则会依次更新。设为随机通常会极大地加速交点(convergence)的产生,尤其是 tol 比 1e-4 大的情况下。可以是"cyclic"或"random"。它指定了当每轮迭代的时候,选择权重向量的哪个分量来更新。
(1)“random”:更新的时候,随机选择权重向量的一个分量来更新。
(2)“cyclic”:更新的时候,从前向后依次选择权重向量的一个分量来更新。

random_state : int, RandomState instance, 或者 None (默认值)
pseudo random number generator 用来产生随机 feature 进行更新时需要用的seed。仅当 selection 为 random 时才可用。

Lasso回归基本操作

%config InteractiveShell.ast_node_interactivity = 'all'   #同时输出多行结果
from sklearn.linear_model import Lasso
X = [[3], [8]]
y = [1, 2]
reg = Lasso(alpha=3.0)            # 惩罚项系数为3.0
reg.fit(X, y)                     # 拟合
Lasso(alpha=3.0, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
reg.coef_                         # 查看系数
reg.intercept_                    # 查看截距
reg.predict([[6]])

Lasso(alpha=3.0, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)

Lasso(alpha=3.0, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
array([0.])
1.5
array([1.5])
reg = Lasso(alpha=0.2)  #调整系数
reg.fit(X, y)
Lasso(alpha=0.2, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
reg.coef_
reg.intercept_
reg.predict([[6]])
Lasso(alpha=0.2, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
Lasso(alpha=0.2, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
array([0.168])
0.576
array([1.584])

Lasso回归例子

#采用lasso CV和lassoLarsCV可实现最佳参数选择  
#案例 研究两变量之间的关系,采用lasso回归
import numpy as np # 快速操作结构数组的工具
import matplotlib.pyplot as plt  # 可视化绘制
from sklearn.linear_model import Lasso,LassoCV,LassoLarsCV   # Lasso回归,LassoCV交叉验证实现alpha的选取,LassoLarsCV基于最小角回归交叉验证实现alpha的选取

# 样本数据集,第一列为x,第二列为y,在x和y之间建立回归模型
data=[
    [0.067732,3.176513],[0.427810,3.816464],[0.995731,4.550095],[0.738336,4.256571],[0.981083,4.560815],
    [0.526171,3.929515],[0.378887,3.526170],[0.033859,3.156393],[0.132791,3.110301],[0.138306,3.149813],
    [0.247809,3.476346],[0.648270,4.119688],[0.731209,4.282233],[0.236833,3.486582],[0.969788,4.655492],
    [0.607492,3.965162],[0.358622,3.514900],[0.147846,3.125947],[0.637820,4.094115],[0.230372,3.476039],
    [0.070237,3.210610],[0.067154,3.190612],[0.925577,4.631504],[0.717733,4.295890],[0.015371,3.085028],
    [0.335070,3.448080],[0.040486,3.167440],[0.212575,3.364266],[0.617218,3.993482],[0.541196,3.891471]
]

#生成X和y矩阵
dataj = np.array(data)
X = dataj[:,0:1]   # 变量x
y = dataj[:,1]   #变量y

# ========Lasso回归========
model = Lasso(alpha=0.01)  # 调节alpha可以实现对拟合的程度
model.fit(X, y)   # 线性回归建模
print('系数矩阵:\n',model.coef_)
print('线性回归模型:\n',model)
# 使用模型预测
predicted = model.predict(X)

# 绘制散点图 参数:x横轴 y纵轴
plt.scatter(X, y, marker='x')
plt.plot(X, predicted,c='r')

# 绘制x轴和y轴坐标
plt.xlabel("x")
plt.ylabel("y")

# 显示图形
plt.show()



Lasso(alpha=0.01, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
系数矩阵:
 [1.52826579]
线性回归模型:
 Lasso(alpha=0.01, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)

<matplotlib.collections.PathCollection at 0x14227d39a58>
[<matplotlib.lines.Line2D at 0x14224ab2e80>]
Text(0.5,0,'x')
Text(0,0.5,'y')
<Figure size 640x480 with 1 Axes>

LassoCV回归(可实现最佳参数选择)

# ========Lasso回归========
#使用lassoCV选择最佳a
model = LassoCV()  # LassoCV自动调节alpha可以实现选择最佳的alpha。
model.fit(X, y)   # 线性回归建模
print('系数矩阵:\n',model.coef_)
print('线性回归模型:\n',model)
print('最佳的alpha:',model.alpha_)  # 只有在使用LassoCV、LassoLarsCV时才有效
#使用模型预测
predicted = model.predict(X)

# 绘制散点图 参数:x横轴 y纵轴
plt.scatter(X, y, marker='x')
plt.plot(X, predicted,c='r')

# 绘制x轴和y轴坐标
plt.xlabel("x")
plt.ylabel("y")

# 显示图形
plt.show()
LassoCV(alphas=None, copy_X=True, cv=None, eps=0.001, fit_intercept=True,
    max_iter=1000, n_alphas=100, n_jobs=1, normalize=False, positive=False,
    precompute='auto', random_state=None, selection='cyclic', tol=0.0001,
    verbose=False)
系数矩阵:
 [1.60985981]
线性回归模型:
 LassoCV(alphas=None, copy_X=True, cv=None, eps=0.001, fit_intercept=True,
    max_iter=1000, n_alphas=100, n_jobs=1, normalize=False, positive=False,
    precompute='auto', random_state=None, selection='cyclic', tol=0.0001,
    verbose=False)
最佳的alpha: 0.002090576613302052

<matplotlib.collections.PathCollection at 0x14227e1d0f0>
[<matplotlib.lines.Line2D at 0x14227df2400>]
Text(0.5,0,'x')
Text(0,0.5,'y')

在这里插入图片描述

LassoLarsCV回归(可实现最佳参数选择)

# ========Lasso回归========
#使用lassoLarsCV选择最佳a

model = LassoLarsCV()  # LassoLarsCV自动调节alpha可以实现选择最佳的alpha
model.fit(X, y)   # 线性回归建模
print('系数矩阵:\n',model.coef_)
print('线性回归模型:\n',model)
print('最佳的alpha:',model.alpha_)  # 只有在使用LassoCV、LassoLarsCV时才有效
# 使用模型预测
predicted = model.predict(X)

# 绘制散点图 参数:x横轴 y纵轴
plt.scatter(X, y, marker='x')
plt.plot(X, predicted,c='r')

# 绘制x轴和y轴坐标
plt.xlabel("x")
plt.ylabel("y")

# 显示图形
plt.show()
LassoLarsCV(copy_X=True, cv=None, eps=2.220446049250313e-16,
      fit_intercept=True, max_iter=500, max_n_alphas=1000, n_jobs=1,
      normalize=True, positive=False, precompute='auto', verbose=False)

系数矩阵:
 [1.6314263]
线性回归模型:
 LassoLarsCV(copy_X=True, cv=None, eps=2.220446049250313e-16,
      fit_intercept=True, max_iter=500, max_n_alphas=1000, n_jobs=1,
      normalize=True, positive=False, precompute='auto', verbose=False)
最佳的alpha: 0.0


<matplotlib.collections.PathCollection at 0x14228339518>
[<matplotlib.lines.Line2D at 0x14227e58a58>]
Text(0.5,0,'x')
Text(0,0.5,'y')

在这里插入图片描述

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Scikit-learn是一个用于机器学习的Python库,它提供了一系列用于回归分析的算法和工具。其中包括了非线性回归模型的实现。非线性回归是指因变量和自变量之间的关系不是简单的线性关系。 Scikit-learn中的非线性回归模型通过引入非线性的特征变换或者使用非线性的核函数来适应非线性数据关系。我们可以使用花费最小二乘法(如岭回归、Lasso回归、弹性网络等)或者支持向量回归(SVR)进行非线性回归建模。 非线性回归模型的使用步骤大致如下: 1. 载入数据:将数据导入Python环境,可以使用pandas库加载CSV文件或者直接导入NumPy数组格式的数据。 2. 特征转换:根据实际情况对特征进行非线性转换,例如多项式特征转换(PolynomialFeatures)或者其他的基函数转换。 3. 划分数据集:将数据集划分为训练集和测试集,训练集用于模型参数的学习,测试集用于模型的评估。 4. 模型训练:使用Scikit-learn中的非线性回归模型进行训练,例如岭回归、Lasso回归、弹性网络或者支持向量回归(SVR)等。 5. 模型评估:根据测试集上的表现指标,如均方误差(Mean Squared Error)、R平方值(R-squared)等评估模型的性能。 6. 模型预测:使用训练好的模型对新样本进行预测,得到预测结果。 Scikit-learn非线性回归模型的优点是具有灵活性和可解释性。同时,Scikit-learn库还提供了交叉验证、特征选择、模型选择等功能,可以帮助我们更好地进行非线性回归问题的建模和评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈伦2019

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值