07- 梯度下降优化(Lasso/Ridge/ElasticNet) (机器学习)

news2024/12/25 12:15:19
  • 归一化: 减少数据不同数量级对预测的影响, 主要是将数据不同属性的数据都降到一个数量级
    • 最大值最小值归一化:优点是可以把所有数值归一到 0~1 之间,缺点受离群值影响较大
    • 0-均值标准化: 经过处理的数据符合标准正态分布,即均值为0,标准差为1, 有正有负。
from sklearn.preprocessing import MinMaxScaler    # 最大值最小值归一化
min_max_scaler = MinMaxScaler()
x_ = min_max_scaler.fit_transform(x) 

from sklearn.preprocessing import StandardScaler  # 0-均值标准化
standard_scaler = StandardScaler()
x_ = standard_scaler.fit_transform(x)
  • 正则化:  防止数据过拟合, 增强模型的泛化能力, 常用方式为增加L1 L2干扰项。
  • Lasso 回归:  把多元线性回归损失函数加上 L1 正则,
# 套索回归: Lasso回归
from sklearn.linear_model import Lasso
lasso = Lasso(alpha= 0.5)
lasso.fit(X, y)
print('套索回归求解的斜率:',lasso.coef_)
print('套索回归求解的截距:',lasso.intercept_)
  • Ridge 岭回归:  多元线性回归损失函数加上 L2 正则的时候
from sklearn.linear_model import Ridge
ridge = Ridge(alpha= 1, solver='sag')
ridge.fit(X, y)
print('岭回归求解的斜率:',ridge.coef_)
print('岭回归求解的截距:',ridge.intercept_)
  • Elastic-Net算法 很多特征互相联系的情况下是非常有用的, 融合了L1正则化L2正则化。
from sklearn.linear_model import ElasticNet
model = ElasticNet(alpha= 1, l1_ratio = 0.7)
model.fit(X, y)
print('弹性网络回归求解的斜率:',model.coef_)
print('弹性网络回归求解的截距:',model.intercept_)
  • 多项式回归的目的: 数据不够时防止欠拟合, 通常是使用现有参数相乘, 或者自身平方达到增加数据量的目的


二、梯度下降优化

1、归一化 (Normalization)

归一化的目的: 减少数据不同数量级对数据预测的影响, 主要是将数据不同属性的数据都降到一个数量级
由于不同方向的陡峭度是不一样的,即不同维度的数值大小是不同。也就是说梯度下降的快慢是不同的,归一化的一个目的是,使得梯度下降在不同维度 \small \theta 参数(不同数量级)上,可以步调一致协同的进行梯度下降。归一化的本质就要把各个特征维度 \bg_white \small x_1, x_2, ...... , x_n 的数量级统一,来做到无量纲化。

1.1、最大值最小值归一化

也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间。转换函数如下:
        .X^* = \frac{X - X\_min}{X\_max -X\_min}

通过公式可以发现,该方式受离群值的影响比较大.
使用scikit-learn函数演示:

import numpy as np
from sklearn.preprocessing import MinMaxScaler
x_1 = np.random.randint(1,10,size = 10)
x_2 = np.random.randint(100,300,size = 10)
x = np.c_[x_1,x_2]    # 将数组放到一起
print('归一化之前的数据:')
min_max_scaler = MinMaxScaler()
x_ = min_max_scaler.fit_transform(x)
print('归一化之后的数据:')
display(x_)

1.2、0-均值标准化

这种方法给予原始数据的均值(mean)标准差(standard deviation)进行数据的标准化,也叫做Z-score标准化经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:

        X^* = \frac{X - \mu}{\sigma}
其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
相对于最大值最小值归一化来说,因为标准归一化除以了标准差,而标准差的计算会考虑到所有样本数据,所以受到离群值的影响会小一些,这就是除以方差的好处!但是,0-均值标准化不一定会把数据缩放到 0 ~ 1 之间了。既然是0均值,也就意味着,有正有负
使用scikit-learn函数

import numpy as np
from sklearn.preprocessing import StandardScaler
x_1 = np.random.randint(1,10,size = 10)
x_2 = np.random.randint(100,300,size = 10)
x = np.c_[x_1,x_2]
print('归一化之前的数据:')
standard_scaler = StandardScaler()
x_ = standard_scaler.fit_transform(x)
print('归一化之后的数据:')
display(x_)

注意:

  • 我们在做特征工程的时候,很多时候如果对训练集的数据进行了预处理,比如这里讲的归一化,那么未来对测试集的时候,和模型上线来新的数据的时候,都要进行相同的数据预处理流程,而且所使用的均值和方差是来自当时训练集的均值和方差!
  • 通过把 scaler 对象持久化, 回头模型上线的时候再加载进来去对新来的数据进行处理。
import joblib
joblib.dump(standard_scaler,'scale')     # 持久化
standard_scaler = joblib.load('scale')   # 加载
standard_scaler.transform(x)    # 使用

2、正则化 Regularization

正则化的目的: 防止数据过拟合, 增强模型的泛化能力, 常用方式为增加L1 L2干扰项。

2.1、过拟合欠拟合

        正则化就是防止过拟合,增加模型的鲁棒性,鲁棒是 Robust 的音译,也就是强壮的意思。正则化(鲁棒性调优)的本质就是牺牲模型在训练集上的正确率来提高推广、泛化能力, W 在数值上越小越好,这样能抵抗数值的扰动。同时为了保证模型的正确率 W 又不能极小。
        常用的惩罚项L1 正则项或者 L2 正则项,分别对应曼哈顿距离(x+y),和欧式距离(平方再开方), 当我们把多元线性回归损失函数加上 L2 正则的时候,就诞生了 Ridge 岭回归。当我们把多元线性回归损失函数加上 L1 正则的时候,就孕育出来了 Lasso 回归

  • 欠拟合(under fit)还没有拟合到位,训练集和测试集的准确率都还没有到达最高,学的还不到位。
  • 过拟合(over fit)拟合过度,训练集的准确率升高的同时,测试集的准确率反而降低。学的过度了(走火入魔),做过的卷子都能再次答对(死记硬背),考试碰到新的没见过的题就考不好(不会举一反三)。
  • 恰到好处(just right):过拟合前,训练集和测试集准确率都达到巅峰。好比,学习并不需要花费很多时间,理解的很好,考试的时候可以很好的把知识举一反三。

2.2、套索回归(Lasso)

先从线性回归开始,其损失函数如下:

J(\theta) = \frac{1}{2}\sum\limits_{i = 1}^n(h_{\theta}(x^{(i)}) - y^{(i)})^2

L1正则化的损失函数,令 ​J_0 = J(\theta)

J = J_0 + \alpha * \sum\limits_{i = 1}^n|w_i|

令 ​L_1 = \alpha * \sum\limits_{i = 1}^n|w_i|

J = J_0 + L_1

其中 J_0 是原始的损失函数,加号后面的一项是L1正则化项, \alpha 是正则化系数。注意到 L1正则化是权值的绝对值之和。 J 是带有绝对值符号的函数,因此 J 是不完全可微的。机器学习的任务就是要通过一些方法(比如梯度下降)求出损失函数的最小值。当我们在原始损失函数 J_0​ 后面添加L1正则项时,相当于对 J_0​ 做了一个约束。令 L_1 = \alpha * \sum\limits_{i = 1}^n|w_i| ,则 J = J_0 + L_1,此时我们的任务变成在 L_1​ 约束下求出 J_0​ 取最小值的解。考虑二维的情况,即只有两个权值 w_1, w_2  ,此时 L_1 = |w_1| + |w_2|。对于梯度下降法,求解 J_0 过程可以画出等值线,同时 L1 正则化的函数 ​ 也可以在 w_1, w_2 ​所在的平面上画出来:

 
用 \lambda 表示L1正则化系数

 \theta_j^{n + 1} = \theta_j^{n} -\eta\sum\limits_{i = 1}^{n} (h_{\theta}(x^{(i)}) - y^{(i)} )x_j^{(i)} - \eta*\alpha * sgn(w_i)

L1正则化和普通线性回归系数对比:

和没有正则项约束线性回归对比,可知L1正则化,将方程系数进行了缩减,部分系数为0,产生稀疏模型

\alpha 越大,模型稀疏性越强,越多的参数为0

Lasso回归源码解析:

  • alpha:正则项系数
  • fit_intercept:是否计算 w 0 w_0 w0​ 截距项
  • normalize:是否做归一化
  • precompute:bool 类型,默认值为False,决定是否提前计算Gram矩阵来加速计算
  • max_iter:最大迭代次数
  • tol:结果的精确度
  • warm_start:bool类型,默认值为False。如果为True,那么使⽤用前⼀次训练结果继续训练。否则从头开始训练
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.linear_model import SGDRegressor

# 1、创建数据集X,y
X = 2*np.random.rand(100, 20)
w = np.random.randn(20,1)
b = np.random.randint(1,10,size = 1)
y = X.dot(w) + b + np.random.randn(100, 1)

print('原始方程的斜率:',w.ravel())
print('原始方程的截距:',b)

lasso = Lasso(alpha= 0.5)
lasso.fit(X, y)
print('套索回归求解的斜率:',lasso.coef_)
print('套索回归求解的截距:',lasso.intercept_)

# 线性回归梯度下降方法
sgd = SGDRegressor(penalty='l2',alpha=0, l1_ratio=0)
sgd.fit(X, y.reshape(-1,))
print('随机梯度下降求解的斜率是:',sgd.coef_)
print('随机梯度下降求解的截距是:',sgd.intercept_)

2.3、岭回归(Ridge)

也是先从线性回归开始,其损失函数如下:

J(\theta) = \frac{1}{2}\sum\limits_{i = 1}^n(h_{\theta}(x^{(i)}) - y^{(i)})^2
L2正则化的损失函数(对L2范数,进行了平方运算),令 J_0 = J(\theta)

J = J_0 + \alpha * \sum\limits_{i = 1}^n(w_i)^2
L_2 = \alpha * \sum\limits_{i = 1}^n(w_i)^2

{\color{DarkGreen} J = J_0 + L_2}
二维平面下 L2 正则化的函数图形是个圆(绝对值的平方和,是个圆),与方形相比,被磨去了棱角。因此 J_0 与 L_2 相交时使得 w_1, w_2​ 等于零的机率小了许多(这个也是一个很直观的想象),这就是为什么L2正则化不具有稀疏性的原因,因为不太可能出现多数 w 都为0的情况(这种情况就叫稀疏性)

用 \lambda 表示L2正则化系数:

 \theta_j^{n + 1} = \theta_j^{n}(1-\eta * \lambda) -\eta *\sum\limits_{i = 1}^{n} (h_{\theta}(x^{(i)}) - y^{(i)} )x_j^{(i)}

L2正则化和普通线性回归系数对比:

和没有正则项约束线性回归对比,可知L2正则化,将方程系数进行了缩小
\alpha 增大求解出来的方程斜率变小
Ridge回归源码解析:

  • alpha:正则项系数
  • fit_intercept:是否计算 w_0​ 截距项
  • normalize:是否做归一化
  • max_iter:最大迭代次数
  • tol:结果的精确度
  • solver:优化算法的选择
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressor

# 1、创建数据集X,y
X = 2*np.random.rand(100, 5)
w = np.random.randint(1,10,size = (5,1))
b = np.random.randint(1,10,size = 1)
y = X.dot(w) + b + np.random.randn(100, 1)

print('原始方程的斜率:',w.ravel())
print('原始方程的截距:',b)

ridge = Ridge(alpha= 1, solver='sag')
ridge.fit(X, y)
print('岭回归求解的斜率:',ridge.coef_)
print('岭回归求解的截距:',ridge.intercept_)

# 线性回归梯度下降方法
sgd = SGDRegressor(penalty='l2',alpha=0,l1_ratio=0)
sgd.fit(X, y.reshape(-1,))
print('随机梯度下降求解的斜率是:',sgd.coef_)
print('随机梯度下降求解的截距是:',sgd.intercept_)

2.4、Elastic-Net算法使用

        Elastic-Net 回归,即岭回归和Lasso技术的混合。弹性网络是一种使用 L1, L2 范数作为先验正则项训练的线性回归模型。 这种组合允许学习到一个只有少量参数是非零稀疏的模型,就像 Lasso 一样,但是它仍然保持一些像 Ridge 的正则性质。我们可利用 l1_ratio 参数控制 L1 和 L2 的凸组合。
        弹性网络在很多特征互相联系(相关性,比如身高和体重就很有关系)的情况下是非常有用的。Lasso 很可能只随机考虑这些特征中的一个,而弹性网络更倾向于选择两个。在实践中, Lasso 和 Ridge 之间权衡的一个优势是它允许在迭代过程中继承 Ridge 的稳定性。

弹性网络回归和普通线性回归系数对比:

import numpy as np
from sklearn.linear_model import ElasticNet
from sklearn.linear_model import SGDRegressor

# 1、创建数据集X,y
X = 2*np.random.rand(100, 20)
w = np.random.randn(20,1)
b = np.random.randint(1,10,size = 1)
y = X.dot(w) + b + np.random.randn(100, 1)

print('原始方程的斜率:',w.ravel())
print('原始方程的截距:',b)

model = ElasticNet(alpha= 1, l1_ratio = 0.7)
model.fit(X, y)
print('弹性网络回归求解的斜率:',model.coef_)
print('弹性网络回归求解的截距:',model.intercept_)

# 线性回归梯度下降方法
sgd = SGDRegressor(penalty='l2',alpha=0, l1_ratio=0)
sgd.fit(X, y.reshape(-1,))
print('随机梯度下降求解的斜率是:',sgd.coef_)
print('随机梯度下降求解的截距是:',sgd.intercept_)

3、多项式回归

多项式回归的目的: 数据不够时防止欠拟合, 通常是使用现有参数相乘, 或者自身平方达到增加数据量的目的。

3.1、多项式回归基本概念

升维的目的是为了去解决欠拟合的问题的,也就是为了提高模型的准确率为目的的,因为当维度不够时,说白了就是对于预测结果考虑的因素少的话,肯定不能准确的计算出模型。
在做升维的时候,最常见的手段就是将已知维度进行相乘(或者自乘)来构建新的维度,如下图所示。普通线性方程,无法拟合规律,必须是多项式,才可以完美拟合曲线规律,图中是二次多项式。
对于多项式回归来说主要是为了扩展线性回归算法来适应更广泛的数据集,比如我们数据集有两个维度 x_1, x_2​,那么用多元线性回归公式就是: \hat{y} = w_0 + w_1x_1 + w_2x_2,当我们使用二阶多项式升维的时候,数据集就从原来的 x_1, x_2 扩展成了 x_1, x_2, x_1^2, x_2^2, x_1x_2 。因此多元线性回归就得去多计算三个维度所对应的w值:\hat{y} = w_0 + w_1x_1 + w_2x_2 + w_3x_1^2 + w_4x_2^2 + w_5x_1x_2
此时拟合出来的方程就是曲线,可以解决一些线性回归的欠拟合问题!

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 1、创建数据,并进行可视化
X = np.linspace(-1,11,num = 100)
y = (X - 5)**2 + 3*X -12 + np.random.randn(100)
X = X.reshape(-1,1)
plt.scatter(X,y)

# 2、创建预测数据
X_test = np.linspace(-2,12,num = 200).reshape(-1,1)

# 3、不进行升维 + 普通线性回归
model_1 = LinearRegression()
model_1.fit(X,y)
y_test_1 = model_1.predict(X_test)
plt.plot(X_test,y_test_1,color = 'red')

# 4、多项式升维 + 普通线性回归
X = np.concatenate([X,X**2],axis = 1)
model_2 = LinearRegression()
model_2.fit(X,y)
# 5、测试数据处理,并预测
X_test = np.concatenate([X_test,X_test**2],axis = 1)
y_test_2 = model_2.predict(X_test)

# 6、数据可视化,切片操作
plt.plot(X_test[:,0],y_test_2,color = 'green')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 逆向工具大整理,碉堡了

文章目录jadx打开 gui 界面把安装包打开双击变量名和方法名可以高亮所有出现的地方**强大的搜索功能****搜索资源****查看 APK 签名****查看 APK dex 数,方法数****查看资源,配置清单****展开包名**查找方式引用反混淆导出 Gradle 工程导出反编译资源cla…

腾讯云安全组配置参考版

官方文档参考: 云服务器 安全组应用案例-操作指南-文档中心-腾讯云 新建安全组时,您可以选择腾讯云为您提供的两种安全组模板: 放通全部端口模板:将会放通所有出入站流量。放通常用端口模板:将会放通 TCP 22端口(Lin…

JDBC(老版)

文章目录JDBC概述数据持久化Java中的数据存储技术JDBC介绍JDBC体系结构JDBC程序编写步骤获取数据库连接要素一:Driver接口实现类Driver接口介绍加载与注册JDBC驱动要素二:URL要素三:用户名和密码数据库连接方式举例使用PreparedStatement实现…

元学习方法解决CDFSL以及两篇SOTA论文讲解

来源:投稿 作者:橡皮 编辑:学姐 带你学习跨域小样本系列1-简介篇 跨域小样本系列2-常用数据集与任务设定详解 跨域小样本系列3:元学习方法解决CDFSL以及两篇SOTA论文讲解(本篇) 跨域小样本系列4&#xf…

Lesson 6.5 机器学习调参基础理论与网格搜索

文章目录一、机器学习调参理论基础1. 机器学习调参目标及基本方法2. 基于网格搜索的超参数的调整方法2.1 参数空间2.2 交叉验证与评估指标二、基于 Scikit-Learn 的网格搜索调参1. sklearn 中网格搜索的基本说明2. sklearn 中 GridSearchCV 的参数解释3. sklearn 中 GridSearch…

漏洞扫描器之AWVS

数据来源 01 漏洞扫描器及AWVS介绍 》漏洞扫描 》常见漏洞扫描工具 网络上公布的付费的或者免费的漏洞扫描工具、脚本多种多样。 √ 针对某类漏洞的:sql注入(sqlmap)、weblogic(weblogicscan) √ 针对某类CMS的: wordpress( wpscan)、 …

数据分析到底该怎么学呢?讲真,真不难!

这几年,“数据分析”是很火啊,在这个数据驱动一切的时代,数据挖掘和数据分析就是这个时代的“淘金”,懂数据分析、拥有数据思维,往往成了大厂面试的加分项。 比如通过数据分析,我们可以更好地了解用户画像…

CSS 重新认识 !important 肯定有你不知道的

重新认识 !important 影响级联规则 与 animation 和 transition 的关系级联层cascade layer内联样式!important 与权重 !important 与简写属性!important 与自定义变量!important 最佳实践 在开始之前, 先来规范一下文中的用于, 首先看 W3C 中关于 CSS 的一些术语定义吧. 下图…

微信小程序如何获取用户信息

自我介绍我是IT果果日记,微信公众号请搜索 IT果果日记一个普通的技术宅,定期分享技术文章,欢迎点赞、关注和转发,请多关照。微信小程序用户基本信息有哪些?除了基本信息,微信还会提供openId和unionId&#…

微服务项目简介

项目简介 项目模式 电商模式:市面上有5种常见的电商模式,B2B、B2C、 C2B、 C2C、O2O; 1、B2B模式 B2B (Business to Business),是指 商家与商家建立的商业关系。如:阿里巴巴 2、B2C 模式 B2C (Business to Consumer), 就是我们经常看到的供…

6个月软件测试培训出来后的感悟 —— 写给正在迷茫是否要转行或去学软件测试的学弟们

本人刚从某培训机构学习结束,现在已经上班一个月了。这篇文章我不会说太多的知识点,或噱人去培训机构学习的话语,仅作为一个普通打工者的身份,来写给那些对于软件测试未来发展、薪资待遇等不清楚的正在为家庭,解决信用…

2023年中国数字化活动行业专题报告

易观:2023年2月,易观发布《2023年中国数字化活动行业专题报告》。报告主要分析了中国数字化活动市场发展背景与现状,数字化活动厂商的主要商业模式及其运作模式,典型案例,未来发展趋势洞察等。同时,易观分析…

网上流量卡可靠吗,网上的这些大流量卡你知道是怎么来的吗?

网上怎么这么多五花八门的流量卡,这些大流量卡是怎么来的你都知道吗?所谓的大流量卡,是因为每个省份为了拉新用户所自行包装的产品,一般是在在基础套餐上增加了一些流量包和充值送话费活动,然后得出来一个产品套餐&…

【动态规划】01背包问题(滚动数组 + 手画图解)

01背包除了可以用形象的二维动态数组表示外,还可以使用空间复杂度更低的一维滚动数组。 目录 文章目录 前言 一、滚动数组的基本理解 二、确定dp及其下标含义 三、确定递推公式 四、确定初始化 五、确定遍历顺序 1.用物品(正序)遍历背…

【刷题篇】链表(上)

前言🌈前段时间我们学习了单向链表和双向链表,本期将带来3道与链表相关的OJ题来巩固对链表的理解。话不多说,让我们进入今天的题目吧!🚀本期的题目有:反转单链表、链表的中间结点、合并两个有序链表反转单链…

XCP实战系列介绍09-基于Vehicle Spy进行XCP测量步骤详解

本文框架 1.概述2. 基于SPY进行测量步骤2.1 建立ECU和vspy3通信2.2 DAQ数据设置2.3 测量变量的记录2.3.1 需要记录变量的选择2.3.2 Log保存3. 在MEP中观测变量3.1 添加观测变量3.2 实时更新变量的值1.概述 在介绍了ASAP2 Editor进行A2l文件的生成,及如何使用Vehicle Spy进行X…

点云深度学习系列博客(五): Point Transformer方法概述

在上一篇博客《注意力机制原理概述》中,我们介绍了注意力机制的基本原理以及一些技术细节。基于注意力机制的深度学习模型在起初设计时,针对的是NLP问题。包括词元分析,翻译等语言处理任务,注意力机制能够训练超大规模数据&#x…

活动星投票午间修身自习室制作在线投票投票制作网页

“午间修身自习室”网络评选投票_免费小程序投票推广_小程序投票平台好处手机互联网给所有人都带来不同程度的便利,而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票,对于运营及推广来说找一个合适的投票小程序能够提高工…

SpringBoot整合(三)SpringBoot发送邮件

使用SpringBoot发送邮件 邮件发送其实是一个非常常见的需求,用户注册,找回密码等地方,都会用到,Spring Boot 中对于邮件发送,提供了相关的自动化配置类,使得邮件发送变得非常容易。 1、前置工作 目前国内…

[SSD固态硬盘技术 9] FTL详解

了解硬件特性有助于我们针对特性进行进一步的探索与优化。为了使闪存成为存储数据的友好介质,我们需要一种机制:将更新的信息写入新的空页,然后将 所有后续读取请求转移到其新地址确保新编程的页面均匀分布在所有可用闪存中,以便均…