一、基础理解

  • LASSO 回归(Least Absolute Shrinkage and Selection Operator Regression)是模型正则化的一定方式;
  • 功能:与岭回归一样,解决过拟合或者模型含有的巨大的方差误差的问题;

二、LASSO 回归

  • 以线性回归为例

 1)对于岭回归

  • 任务:让最小化的损失函数对应的 θ 值尽量的小;
  • 操作:在损失函数中添加了一项:;希望在最小化损失函数时通过添加的此项代数式来控制参数 θ 的大小,并且为了平衡新的损失函数中的两项代数式对损失函数的影响,在添加的代数式中加入了新的参数 α

 2)对于 LASSO 回归

  • LASSO 回归的原理和岭回归是一样的,只是添加的代数式不同

三、模拟数据使用 LASSO 回归

 1)模拟数据集

  • 模拟并绘制数据集
    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3.  
    4. np.random.seed(42)
    5. x = np.random.uniform(-3.0, 3.0, size=100)
    6. X = x.reshape(-1, 1)
    7. y = 0.5 * x + 3. + np.random.normal(0, 1, size=100)
    8.  
    9. plt.scatter(x, y)
    10. plt.show()

  • 分割数据集
    1. from sklearn.model_selection import train_test_split
    2.  
    3. np.random.seed(666)
    4. X_train, X_test, y_train, y_test = train_test_split(X, y)

 2)使用多项式回归拟合数据

  • 管道
    1. from sklearn.pipeline import Pipeline
    2. from sklearn.preprocessing import PolynomialFeatures
    3. from sklearn.preprocessing import StandardScaler
    4. from sklearn.linear_model import LinearRegression
    5.  
    6. def PolynomialRegression(degree):
    7. return Pipeline([
    8. ('poly', PolynomialFeatures(degree=degree)),
    9. ('std_scaler', StandardScaler()),
    10. ('lin_reg', LinearRegression())
    11. ])
  • 封装绘制代码
    1. def plot_model(model):
    2. X_plot = np.linspace(-3, 3, 100).reshape(100, 1)
    3. y_plot = model.predict(X_plot)
    4.  
    5. plt.scatter(x, y)
    6. plt.plot(X_plot[:, 0], model.predict(X_plot), color='r')
    7. plt.axis([-3, 3, 0, 6])
    8. plt.show()
  • 多项式回归并绘图
    1. from sklearn.metrics import mean_squared_error
    2.  
    3. poly_reg = PolynomialRegression(degree=20)
    4. poly_reg.fit(X_train, y_train)
    5.  
    6. y_poly_predict = poly_reg.predict(X_test)
    7. mean_squared_error(y_test, y_poly_predict)
    8. # 输出:167.9401086729357(均方误差)
    9.  
    10. plot_model(poly_reg)

 3)使用 LASSO Regression 改进算法模型

  • 管道
    1. from sklearn.linear_model import Lasso
    2.  
    3. # 以管道的方式,使用 LASSO 回归的方法改进多项式回归的算法
    4. def LassoRegression(degree, alpha):
    5. return Pipeline([
    6. ('poly', PolynomialFeatures(degree=degree)),
    7. ('std_scaler', StandardScaler()),
    8. ('lasso_reg', Lasso(alpha=alpha))
    9. ])
  • degree = 20、α = 0.01
    1. lasso1_reg = LassoRegression(20, 0.01)
    2. lasso1_reg.fit(X_train, y_train)
    3.  
    4. y1_predict = lasso1_reg.predict(X_test)
    5. mean_squared_error(y_test, y1_predict)
    6. # 输出:1.149608084325997(均方误差)
    7.  
    8. plot_model(lasso1_reg)

  • degree = 20、α = 0.1
    1. lasso2_reg = LassoRegression(20, 0.1)
    2. lasso2_reg.fit(X_train, y_train)
    3.  
    4. y2_predict = lasso2_reg.predict(X_test)
    5. mean_squared_error(y_test, y2_predict)
    6. # 输出:1.1213911351818648(均方误差)
    7.  
    8. plot_model(lasso2_reg)

  • degree = 20、α = 1
    1. lasso3_reg = LassoRegression(20, 1)
    2. lasso3_reg.fit(X_train, y_train)
    3.  
    4. y3_predict = lasso3_reg.predict(X_test)
    5. mean_squared_error(y_test, y3_predict)
    6. # 输出:1.8408939659515595(均方误差)
    7.  
    8. plot_model(lasso3_reg)

 4)分析

  • α = 0.01,比岭回归中的第一个 α 的取值大很多,因为对于 RidgeRegression(),正则化的那一项中是 θ^2,平方后的结果会比较大,所以需要让 α 值很小来调节正则项的大小;而对于LassoRegression(),正则化的那一项中是 |θ|,比岭回归中的正则化项小很多,所以在 LassoRegression() 中 α 的取值可以相对大一些;
  • # 在具体进行机器学习算法的过程中,需要不断的试验不断的看结果,慢慢的形成经验,用各种不同的方法在调参时,对于不同的参数大概知道参数在哪个范围内进行选择会相应的比较好;
  • 当 α = 1 时,LassoRegression() 对应的正则化的程度已经比较高了;
  1. 正则化的程度:拟合曲线的上下抖动幅度;

  • 现实机器学习的过程中,就是在完全不进行模型正则化和过度模型正则化之间选择一个程度最好的一情况;

四、比较 Ridge Regression 和 LASSO Regression

 1)使用 Ridge 改进的多项式回归算法,随着 α 的改变,拟合曲线始终是各曲线,直到最后变成一条几乎水平的直线;也就是说,使用 Ridge 改造的多项式回归算法,得到的模型变量前还是有系数,因此很难得到一天斜的直线;

 2)而使用 Lasso 改进的多项式回归算法,随着 α 的改变,拟合曲线会很快变成一条斜的直线,最后慢慢变成一条几乎水平的直线;模型更倾向于一条直线。

五、其它

  •  LASSO 的特点:趋向于使得一部分 θ 值变为 0,也就是说 LASSO 认为与 θ = 0 对应的特征是完全没有用的,而剩下与 θ 不为 0 所对应的特征是有用的,所以 LASSO 可作为特征选择用
  • 在作为特征选择用时,LASSO 也可能将一些有用的特征的系数 θ 变为 0,会导致信息不准确;相比较来说,还是 Ridge 更准确。
  1. 但是如果样本特征非常的大,如使用多项式回归时 degree = 100,此种情况下使用 LASSO 可以使样本特征变小;

机器学习:模型泛化(LASSO 回归)的更多相关文章

  1. 机器学习中模型泛化能力和过拟合现象(overfitting)的矛盾、以及其主要缓解方法正则化技术原理初探

    1. 偏差与方差 - 机器学习算法泛化性能分析 在一个项目中,我们通过设计和训练得到了一个model,该model的泛化可能很好,也可能不尽如人意,其背后的决定因素是什么呢?或者说我们可以从哪些方面去 ...

  2. 热门数据挖掘模型应用入门(一): LASSO回归

    热门数据挖掘模型应用入门(一): LASSO回归 2016-10-10 20:46 作者简介: 侯澄钧,毕业于俄亥俄州立大学运筹学博士项目, 目前在美国从事个人保险产品(Personal Line)相 ...

  3. 【笔记】模型泛化与岭回归与LASSO

    模型泛化与岭回归与LASSO 模型正则化 模型正则化,简单来说就是限制参数大小 模型正则化是用什么思路来解决先前过拟合的由于过于拟合导致的曲线抖动(线性方程前的系数都很大) 线性回归的目标就是求一个最 ...

  4. 机器学习:模型泛化(L1、L2 和弹性网络)

    一.岭回归和 LASSO 回归的推导过程 1)岭回归和LASSO回归都是解决模型训练过程中的过拟合问题 具体操作:在原始的损失函数后添加正则项,来尽量的减小模型学习到的 θ 的大小,使得模型的泛化能力 ...

  5. 【机器学习】正则化的线性回归 —— 岭回归与Lasso回归

    注:正则化是用来防止过拟合的方法.在最开始学习机器学习的课程时,只是觉得这个方法就像某种魔法一样非常神奇的改变了模型的参数.但是一直也无法对其基本原理有一个透彻.直观的理解.直到最近再次接触到这个概念 ...

  6. 机器学习-正则化(岭回归、lasso)和前向逐步回归

    机器学习-正则化(岭回归.lasso)和前向逐步回归 本文代码均来自于<机器学习实战> 这三种要处理的是同样的问题,也就是数据的特征数量大于样本数量的情况.这个时候会出现矩阵不可逆的情况, ...

  7. 机器学习之五 正则化的线性回归-岭回归与Lasso回归

    机器学习之五 正则化的线性回归-岭回归与Lasso回归 注:正则化是用来防止过拟合的方法.在最开始学习机器学习的课程时,只是觉得这个方法就像某种魔法一样非常神奇的改变了模型的参数.但是一直也无法对其基 ...

  8. 多元线性回归模型的特征压缩:岭回归和Lasso回归

    多元线性回归模型中,如果所有特征一起上,容易造成过拟合使测试数据误差方差过大:因此减少不必要的特征,简化模型是减小方差的一个重要步骤.除了直接对特征筛选,来也可以进行特征压缩,减少某些不重要的特征系数 ...

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

    之前我们介绍了多元线性回归的原理, 又通过一个案例对多元线性回归模型进一步了解, 其中谈到自变量之间存在高度相关, 容易产生多重共线性问题, 对于多重共线性问题的解决方法有: 删除自变量, 改变数据形 ...

随机推荐

  1. 同类型元素,只有一个被选中js

    <div class="wrap-box flex_row"> <div class="wrap-block"> <div cla ...

  2. 吴恩达深度学习笔记(五) —— 优化算法:Mini-Batch GD、Momentum、RMSprop、Adam、学习率衰减

    主要内容: 一.Mini-Batch Gradient descent 二.Momentum 四.RMSprop 五.Adam 六.优化算法性能比较 七.学习率衰减 一.Mini-Batch Grad ...

  3. 【bzoj1299】[LLH邀请赛]巧克力棒(博弈论思维题)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1299 首先我们把每根巧克力棒看成一堆石子,把巧克力棒的长度看作石子的个数,那么原问题就 ...

  4. 【codevs1993】草地排水(最大流)

    最近学了最大流,于是去codevs找了几道最大流裸题(这是我第一次写网络流). 题目大意:求一个图的最大流(就是这样的裸题) 第一次A网络流的题,发个博客纪念一下. var n,m,i,j,k,h,t ...

  5. springboot 配置过滤器

    能配置例外 先写配置文件类 FilterConfig.java package com.ty.tyzxtj.config; import javax.servlet.Filter; import or ...

  6. js提示确认删除吗

    <script language="javascript"> function delcfm() { if (!confirm("确认要删除?")) ...

  7. Qt QTreeWidget节点的添加+双击响应+删除详解

    转自: http://www.cnblogs.com/Romi/archive/2012/08/08/2628163.html 承接该文http://www.cnblogs.com/Romi/arch ...

  8. Oracle中的BLOB和CLOB【转载】

    原文地址:http://jelly.iteye.com/blog/65796 一.区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多 ...

  9. Python基本语法(一)

    注释及注意 #代表注释:冒号:结尾时,接下来的代码会自动缩进,一般为4个空格.Python程序是大小写敏感的. 数据类型和变量 在Python中能够直接处理的数据类型有以下几种: 整数 浮点数 字符串 ...

  10. CentOS7 常用命名整理

    前言: 总是为了一点命令去查搜索引擎,今天简单整理了一下常用的一些命名: 一.网络配置相关 0.修改 IP&DNS 信息 # vi /etc/sysconfig/network-scripts ...