模型泛化与岭回归与LASSO

模型正则化

模型正则化,简单来说就是限制参数大小

模型正则化是用什么思路来解决先前过拟合的由于过于拟合导致的曲线抖动(线性方程前的系数都很大)

线性回归的目标就是求一个最优解,让损失函数尽可能的小也就是使求出来的均方误差尽可能的小

如果过拟合的话,就会让theta系数过大,那么怎么限制呢,可以改变损失函数,加入模型正则化,将其加上所有thetai的平方和乘上一个常数(这个阿尔法是个新的超参数,代表着后面的式子在整个式子中的重要程度(占比)),变为

让式子中的theta尽可能小使式子尽可能小

实际上是让准确度和thetai尽可能小这两件事取得一个平衡,那么对于不同的数据,就要尝试取不同的值

那么这种模型正则化的方式通常称为岭回归

具体使用

(在notebook中)

基础代码:

  import numpy as np
import matplotlib.pyplot as plt np.random.seed(42)
x = np.random.uniform(-3.0,3.0,size=100)
X = x.reshape(-1,1)
y = 0.5 * x + 3 + np.random.normal(0,1,size=100) plt.scatter(x,y)

图像如下

使用多项式回归的方式,然后对数据进行分割,最后计算一下均方误差:

  from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression def PolynomialRegression(degree):
return Pipeline([
("poly",PolynomialFeatures(degree=degree)),
("std_scaler",StandardScaler()),
("lin_reg",LinearRegression())
]) from sklearn.model_selection import train_test_split np.random.seed(666)
X_train,X_test,y_train,y_test = train_test_split(X,y) from sklearn.metrics import mean_squared_error poly_reg = PolynomialRegression(degree=20)
poly_reg.fit(X_train,y_train) y_poly_predict = poly_reg.predict(X_test)
mean_squared_error(y_test,y_poly_predict)

结果为(显然是过拟合了)

绘制一下模型

  X_plot = np.linspace(-3,3,100).reshape(100,1)
y_plot = poly_reg.predict(X_plot) plt.scatter(x,y)
plt.plot(X_plot[:,0],y_plot,color='r')
plt.axis([-3,3,0,6])

图像如下

将绘图的代码进行包装:

  def plot_model(model):
X_plot = np.linspace(-3,3,100).reshape(100,1)
y_plot = model.predict(X_plot) plt.scatter(x,y)
plt.plot(X_plot[:,0],y_plot,color='r')
plt.axis([-3,3,0,6]) plot_model(poly_reg)

调用以后结果如下:

使用岭回归

调用sklearn中的Ridge类,使用管道的方式将其进行创建,将第三步创建一个ridge这个函数对象,这就封装好了一个岭回归的过程

  from sklearn.linear_model import Ridge

  def RidgeRegression(degree,alpha):
return Pipeline([
("poly",PolynomialFeatures(degree=degree)),
("std_scaler",StandardScaler()),
("ridge_reg",Ridge(alpha=alpha))
])

这里使用第一组数据,degree为20,alpha取0.0001,然后进行fit,得到训练数据以后进行预测,最后计算均方误差

  ridge1_reg = RidgeRegression(20,0.0001)
ridge1_reg.fit(X_train,y_train) y1_predict = ridge1_reg.predict(X_test)
mean_squared_error(y_test,y1_predict)

结果为(比起之前小了太多)

绘制图像

  plot_model(ridge1_reg)

图像如下

这里使用第二组数据,degree为20,alpha取1

  ridge2_reg = RidgeRegression(20,1)
ridge2_reg.fit(X_train,y_train) y2_predict = ridge2_reg.predict(X_test)
mean_squared_error(y_test,y2_predict)

结果为(又好了一些)

绘制图像

  plot_model(ridge2_reg)

图像为

这里使用第三组数据,degree为20,alpha取100

  ridge3_reg = RidgeRegression(20,100)
ridge3_reg.fit(X_train,y_train) y3_predict = ridge3_reg.predict(X_test)
mean_squared_error(y_test,y3_predict)

结果为(反而增加了)

绘制图像

  plot_model(ridge3_reg)

图像为

这里使用第四组数据,degree为20,alpha取1000000

  ridge4_reg = RidgeRegression(20,1000000)
ridge4_reg.fit(X_train,y_train) y4_predict = ridge4_reg.predict(X_test)
mean_squared_error(y_test,y4_predict)

结果为(又增加了)

绘制图像

  plot_model(ridge4_reg)

图像为(几乎的直线)

这里就知道了,使用岭回归的时候,引入了一个新的超参数,对于不同的数据,

会出现不同的模型

这是模型正则化的一种方式

LASSO

对于岭回归来说,其任务就是让损失函数对应的值尽可能的小,为了平衡,加入了一个超参数来平衡

LASSO的思想和岭回归其实一样,其目标是使这个式子尽可能小,即损失函数加上alpha乘上theta的绝对值的和尽可能小

从数学的意义上理解,感觉都是让theta尽可能的小,那么最终结果就通过具体实现看一下

具体实现

(在notebook中)

基础环境见上面

基本和上方的代码一样,方便观看就贴在这里了

  from sklearn.model_selection import train_test_split

  np.random.seed(666)
X_train,X_test,y_train,y_test = train_test_split(X,y) from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression def PolynomialRegression(degree):
return Pipeline([
("poly",PolynomialFeatures(degree=degree)),
("std_scaler",StandardScaler()),
("lin_reg",LinearRegression())
])

先尝试使用degree=20来进行一下拟合预测加计算均方误差

  from sklearn.metrics import mean_squared_error

  poly_reg = PolynomialRegression(degree=20)
poly_reg.fit(X_train,y_train) y_predict = poly_reg.predict(X_test)
mean_squared_error(y_test,y_predict)

结果如下

使用绘制函数

  def plot_model(model):
X_plot = np.linspace(-3,3,100).reshape(100,1)
y_plot = model.predict(X_plot) plt.scatter(x,y)
plt.plot(X_plot[:,0],y_plot,color='r')
plt.axis([-3,3,0,6]) plot_model(poly_reg)

图像如下

使用LASSO

调用sklearn中的Lasso类,同样的使用管道包装一个LASSO的方法使用

  from sklearn.linear_model import Lasso

  def LassoRegression(degree,alpha):
return Pipeline([
("poly",PolynomialFeatures(degree=degree)),
("std_scaler",StandardScaler()),
("lasso_reg",Lasso(alpha=alpha))
])

首先构建一个lasso_reg,传入degree=20,alpha=0.01(对于lasso正则化项要小很多,可以先取大的数值),然后fit训练,训练后进行预测,然后计算均方误差

  lasso1_reg = LassoRegression(20,0.01)
lasso1_reg.fit(X_train,y_train) y1_predict = lasso1_reg.predict(X_test)
mean_squared_error(y_test,y1_predict)

结果如下

绘制图像

  plot_model(lasso1_reg)

图像如下

传入degree=20,alpha=0.1

  lasso2_reg = LassoRegression(20,0.1)
lasso2_reg.fit(X_train,y_train) y2_predict = lasso2_reg.predict(X_test)
mean_squared_error(y_test,y2_predict)

结果如下

绘制图像

  plot_model(lasso2_reg)

图像如下

传入degree=20,alpha=1

  lasso3_reg = LassoRegression(20,1)
lasso3_reg.fit(X_train,y_train) y3_predict = lasso3_reg.predict(X_test)
mean_squared_error(y_test,y3_predict)

结果如下

绘制图像

  plot_model(lasso3_reg)

图像如下

比较ridge和lasso

可以通过上述的数据结果看出来,这两个方法的alpha的取值影响是差距很大的,可以说,使用lasso这个方法得到的模型更趋向于是一个直线,那么直线和曲线的区别在那里,使用ridge的时候得到了曲线,这代表着依然有很多的特征的前面还存在着系数,用了LASSO以后,就可以表示很多的特征的前面的系数是没有了的

这正是lasso的特点,其趋向于使得一部分的theta值变为0,而不是让theta变成一个很小的值,其可以作为一种特征选择方法来使用,这就说明如果lasso以后的特征前面的系数变成0了,可以认为这个特征是没有用的,剩下的不等于0的LASSO认为这些特征是有用的

如何解释呢(尝试解读)

在使用ridge的时候,只看后面的式子可以发现,在alpha趋于无穷的时候,按照梯度下降法的观点来看,其梯度为

在向着零点进发的过程中,每一步theta都是有值的,使用曲线的方式逐渐达到零

对于LASSO来说,在alpha趋于无穷的时候,虽然不可导,但是可以使用分类函数来刻画其导数

(Sign(x)的意思是,在x>0时,取1,在x=0时,取0,在x<0时,取-1)

相当于在不考虑前面的函数的时候,其后面的梯度就是一个alpha乘上一个向量,向量的值就三个,也就是说,在向着零点进发的时候,只能使用这种规则的方式,可能就在其中的一步,使得其到达了某个轴上,这就说明了为什么其中有很多的零

不过要注意,LASSO有的时候也会将有用的特征变成零,所以,从计算的准确度上来讲,还是ridge更加的准确,但是在特征很大的时候,使用LASSO可以起到将特征变小的作用

【笔记】模型泛化与岭回归与LASSO的更多相关文章

  1. 机器学习:模型泛化(岭回归:Ridge Regression)

    一.基础理解 模型正则化(Regularization) # 有多种操作方差,岭回归只是其中一种方式: 功能:通过限制超参数大小,解决过拟合或者模型含有的巨大的方差误差的问题: 影响拟合曲线的两个因子 ...

  2. 多重共线性的解决方法之——岭回归与LASSO

          多元线性回归模型 的最小二乘估计结果为 如果存在较强的共线性,即 中各列向量之间存在较强的相关性,会导致的从而引起对角线上的 值很大 并且不一样的样本也会导致参数估计值变化非常大.即参数估 ...

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

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

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

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

  5. 岭回归和Lasso回归以及norm1和norm2

    norm代表的是距离,两个向量的距离:下图代表的就是p-norm,其实是对向量里面元素的一种运算: 最简单的距离计算(规范)是欧式距离(Euclidean distance),两点间距离是如下来算的, ...

  6. 岭回归和lasso回归(转)

    回归和分类是机器学习算法所要解决的两个主要问题.分类大家都知道,模型的输出值是离散值,对应着相应的类别,通常的简单分类问题模型输出值是二值的,也就是二分类问题.但是回归就稍微复杂一些,回归模型的输出值 ...

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

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

  8. 岭回归、lasso

    参考:https://blog.csdn.net/Byron309/article/details/77716127     ----    https://blog.csdn.net/xbinwor ...

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

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

随机推荐

  1. Linux:Ka li 2020.4 安装教程

    下载地址 Ka li官网 :https://www.kali.org install 版本是安装版,安装后使用: Live    版本可以直接启动运行: netinstaller  版本是网络安装版, ...

  2. centos7 php开发环境安装-composer

    1.安装composer cd /usr/local/src curl -sS https://getcomposer.org/installer | php mv composer.phar /us ...

  3. webpack(11)配置文件分离为开发配置、生成配置和基础配置

    前言 上篇我们已经配置好了本地开发服务器,但是配置的相对比较凌乱,一个文件中有些是开发时用到的配置,有些是生成时用到的配置,有些是开发和生成都要用到的配置,所以我们这里把环境分为3个环境 webpac ...

  4. python 10篇 操作mysql

    一.操作数据库 使用pip install pymysql,安装pymysql模块,使用此模块连接MySQL数据库并操作数据库. import pymysql host = 'ip地址' # 链接的主 ...

  5. C语言:#error命令,阻止程序编译

    #error 指令用于在编译期间产生错误信息,并阻止程序的编译,其形式如下: #error error_message 例如,我们的程序针对 Linux 编写,不保证兼容 Windows,那么可以这样 ...

  6. 高校表白App-团队冲刺第九天

    今天要做什么 在Fragment首页加上轮转播报,点击图片进入相应连接 做了什么 功能实现,通过连接第三方库来进行实现,比较简单.(url就可以) 遇到的问题 在调用以前的工具类时,有点小问题,发现以 ...

  7. js浮点数保留位数方法封装

    大家在平时业务中应该经常跟小数打交道吧,有没有被小数点的保留位数问题搞得头疼啊.比如,保留一位小数,保留俩位小数,保留三位小数,向上取整.四舍五入等等. 而我最近在项目中正好遇到类似的问题:有的地方要 ...

  8. .net core番外第一篇:Autofac的几种常见注入方式、生命周期和AOP

    使用Autofac进行服务注册实践: 新建三个项目,分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Ser ...

  9. Python+Requests+Bs4(解析)爬取某诗词信息(数据分析二)

    1.环境安装 - 需要将pip源设置为国内源,阿里源.豆瓣源.网易源等 - windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %appdata% (3)在这里面新建一个 ...

  10. 队列Queue:任务间的消息读写,安排起来~

    摘要:本文通过分析鸿蒙轻内核队列模块的源码,掌握队列使用上的差异. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十三 消息队列Queue>,作者:zhushy . 队列(Queue)是 ...