【笔记】模型泛化与岭回归与LASSO
模型泛化与岭回归与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的更多相关文章
- 机器学习:模型泛化(岭回归:Ridge Regression)
一.基础理解 模型正则化(Regularization) # 有多种操作方差,岭回归只是其中一种方式: 功能:通过限制超参数大小,解决过拟合或者模型含有的巨大的方差误差的问题: 影响拟合曲线的两个因子 ...
- 多重共线性的解决方法之——岭回归与LASSO
多元线性回归模型 的最小二乘估计结果为 如果存在较强的共线性,即 中各列向量之间存在较强的相关性,会导致的从而引起对角线上的 值很大 并且不一样的样本也会导致参数估计值变化非常大.即参数估 ...
- 多元线性回归模型的特征压缩:岭回归和Lasso回归
多元线性回归模型中,如果所有特征一起上,容易造成过拟合使测试数据误差方差过大:因此减少不必要的特征,简化模型是减小方差的一个重要步骤.除了直接对特征筛选,来也可以进行特征压缩,减少某些不重要的特征系数 ...
- 【机器学习】正则化的线性回归 —— 岭回归与Lasso回归
注:正则化是用来防止过拟合的方法.在最开始学习机器学习的课程时,只是觉得这个方法就像某种魔法一样非常神奇的改变了模型的参数.但是一直也无法对其基本原理有一个透彻.直观的理解.直到最近再次接触到这个概念 ...
- 岭回归和Lasso回归以及norm1和norm2
norm代表的是距离,两个向量的距离:下图代表的就是p-norm,其实是对向量里面元素的一种运算: 最简单的距离计算(规范)是欧式距离(Euclidean distance),两点间距离是如下来算的, ...
- 岭回归和lasso回归(转)
回归和分类是机器学习算法所要解决的两个主要问题.分类大家都知道,模型的输出值是离散值,对应着相应的类别,通常的简单分类问题模型输出值是二值的,也就是二分类问题.但是回归就稍微复杂一些,回归模型的输出值 ...
- 机器学习-正则化(岭回归、lasso)和前向逐步回归
机器学习-正则化(岭回归.lasso)和前向逐步回归 本文代码均来自于<机器学习实战> 这三种要处理的是同样的问题,也就是数据的特征数量大于样本数量的情况.这个时候会出现矩阵不可逆的情况, ...
- 岭回归、lasso
参考:https://blog.csdn.net/Byron309/article/details/77716127 ---- https://blog.csdn.net/xbinwor ...
- 机器学习之五 正则化的线性回归-岭回归与Lasso回归
机器学习之五 正则化的线性回归-岭回归与Lasso回归 注:正则化是用来防止过拟合的方法.在最开始学习机器学习的课程时,只是觉得这个方法就像某种魔法一样非常神奇的改变了模型的参数.但是一直也无法对其基 ...
随机推荐
- hive学习笔记之十一:UDTF
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Mysql:报错message from server: "Too many connections"(连接太多)
报错信息 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source re ...
- java实现遍历文件目录,根据文件最后的修改时间排序,并将文件全路径存入List集合
package com.ultra.aliyun.control.main; import java.io.File; import java.util.ArrayList; import java. ...
- MySQL 插入中文后,显示为空白
https://blog.csdn.net/sun_hj_95/article/details/79488583 在MySQL中插入中文后,显示如下: 解决方案: 在my.ini (在MySQL的安装 ...
- P5816 [CQOI2010]内部白点 题解
[题目链接] [解析] 好题. 拿到题目首先先看一下它的无解情况是怎么判断的. 然后很明显这个是不存在无解情况的. 因为它的黑点开始都是给定了的,可以理解为一个边界. 而新的变化的黑点不会往外扩张,那 ...
- 家庭账本开发day01
--好长时间没有进行web应用的开发,手有些生疏了,知识点也有些遗忘了,不过抹油关系,边开发边复习边学习新的东西. 今天主要完成了,家庭记账本的项目梳理,如下: 利用layUI模板 修改layUImi ...
- [刘阳Java]_精选20道Java多线程面试题
1. 多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务可以将处理器时间让给其它任务 (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务 (4) ...
- [刘阳Java]_Spring AOP基于XML配置介绍_第9讲
基于注解配置的Spring AOP固然简单,但是这节我们会给大家介绍基于XML配置的AOP是如何应用的.为什么这么说了,因为后面我们还会介绍到Spring对Dao操作的事务管理(基于AOP的XML文件 ...
- Xshell、winscp连不上Linux虚拟机
1.环境 本地机器WIN7环境,使用VMware Workstation Pro安装的CentOS7,系统镜像CentOS-6.1-x86_64-netinstall.iso 2.问题与分析 我的虚拟 ...
- 微信小程序云开发-云存储的应用-识别行驶证
一.准备工作 1.创建云函数identify 2.云函数identify中index.js代码 1 // 云函数入口文件 2 const cloud = require('wx-server-sdk' ...