机器学习正则化算法的总结,建议收藏。(上篇)

下篇地址:

正则化是一种用于降低机器学习模型过拟合风险的技术。当模型过度拟合训练数据时,它会在新样本上表现不佳。所以为了解决这个问题,我们必须要引入正则化算法。

正则化通过在模型的损失函数中添加一个正则项(惩罚项)来实现。这个正则项通常基于模型参数的大小,以限制模型参数的数量或幅度。主要有两种常见的正则化算法:L1正则化和L2正则化。

  • L1正则化(Lasso):L1正则化添加了模型参数的绝对值之和作为正则项。它倾向于使一些参数变为零,从而达到特征选择的效果。所以,L1正则化可以用于自动选择最重要的特征,并减少模型复杂度。

  • L2正则化(Ridge):L2正则化添加了模型参数的平方和作为正则项。它倾向于使所有参数都较小,但没有明确地将某些参数设置为零。L2正则化对异常值更加鲁棒,并且可以减少模型的过度依赖单个特征的情况。

正则化通过控制模型参数的大小来限制模型的复杂度,从而避免过拟合。在损失函数中引入正则项后,模型的优化目标变为最小化损失函数和正则项之和。

今天要探究的是这7各部分,大家请看~

  • L1 正则化

  • L2 正则化

  • 弹性网络正则化

  • Dropout 正则化

  • 贝叶斯Ridge和Lasso回归

  • 早停法

  • 数据增强

1、L1 正则化(Lasso 正则化)

L1正则化(也称为Lasso正则化)是一种用于控制机器学习模型复杂度的技术。

通过向损失函数添加L1范数项来实现正则化,鼓励模型产生稀疏权重,即将一些特征的权重调整为0。

公式:

L1正则化在优化过程中有两个关键特点:

1、由于正则化项中包含绝对值操作,导致损失函数不可导。因此,在求解最小化损失函数时,需要使用其他方法(如坐标下降、梯度下降等)。

2、正则化项的存在促使部分特征的权重变为0,从而实现特征选择和模型简化。

咱们看一个简单案例,使用了sklearn库中的Lasso类来实现L1正则化的模型:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso# 生成示例数据
np.random.seed(42)
X = np.linspace(-5, 5, num=100).reshape(-1, 1)
y = 2 * X + np.random.normal(0, 1, size=(100, 1))# 创建Lasso模型对象
lasso = Lasso(alpha=0.1)  # 设置alpha参数,控制正则化强度# 拟合数据
lasso.fit(X, y)# 绘制优化复杂图形
fig, ax = plt.subplots()
ax.scatter(X, y, color="blue", label="Data")
ax.plot(X, lasso.predict(X), color="red", linewidth=2, label="L1 Regularization")# 在图中绘制L1正则化项的等高线
beta_0 = np.linspace(-10, 10, 100)
beta_1 = np.linspace(-10, 10, 100)
B0, B1 = np.meshgrid(beta_0, beta_1)
Z = np.zeros_like(B0)
for i in range(len(beta_0)):for j in range(len(beta_1)):lasso.coef_ = np.array([B0[i,j], B1[i,j]])Z[i,j] = np.sum(np.abs(lasso.coef_))
ax.contour(B0, B1, Z, levels=20, colors="black", alpha=0.5)ax.set_xlabel("X")
ax.set_ylabel("y")
ax.set_title("L1 Regularization with Contour Plot")
ax.legend()
plt.show()

除了绘制原始数据点和经过L1正则化的拟合线外,我们还使用等高线图形展示了L1正则化项。通过等高线图,可以更加直观地看到正则化项对权重的影响,以及如何促使模型产生稀疏权重。

2、L2 正则化(岭正则化)

L2正则化(也称为岭正则化)是一种用于控制机器学习模型复杂度的技术。

它通过向损失函数添加L2范数项来实现正则化,鼓励模型产生平滑权重,即将特征的权重调整为较小的值。

公式:

L2正则化在优化过程中的2个关键特点:

1、正则化项中包含平方操作,使得损失函数可导。因此,在求解最小化损失函数时,可以使用常见的梯度下降等优化算法。

2、正则化项的存在使得特征权重趋向于较小的值,从而避免了过拟合问题。

先看一个案例,使用sklearn库中的Ridge类来实现L2正则化的模型:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge# 生成示例数据
np.random.seed(42)
X = np.linspace(-5, 5, num=100).reshape(-1, 1)
y = 2 * X + np.random.normal(0, 1, size=(100, 1))# 创建Ridge模型对象
ridge = Ridge(alpha=0.1)  # 设置alpha参数,控制正则化强度# 拟合数据
ridge.fit(X, y)# 绘制优化复杂图形
fig, ax = plt.subplots()
ax.scatter(X, y, color="blue", label="Data")
ax.plot(X, ridge.predict(X), color="red", linewidth=2, label="L2 Regularization")# 在图中绘制L2正则化项的等高线
beta_0 = np.linspace(-10, 10, 100)
beta_1 = np.linspace(-10, 10, 100)
B0, B1 = np.meshgrid(beta_0, beta_1)
Z = np.zeros_like(B0)
for i in range(len(beta_0)):for j in range(len(beta_1)):ridge.coef_ = np.array([B0[i,j], B1[i,j]])Z[i,j] = np.sum(ridge.coef_ ** 2)
ax.contour(B0, B1, Z, levels=20, colors="black", alpha=0.5)ax.set_xlabel("X")
ax.set_ylabel("y")
ax.set_title("L2 Regularization with Contour Plot")
ax.legend()
plt.show()

除了绘制原始数据点和经过L2正则化的拟合线外,我们还使用等高线图形展示了L2正则化项。通过等高线图,可以更加直观地看到正则化项对权重的影响,以及如何促使模型产生平滑权重。

3、弹性网络正则化(Elastic Net 正则化)

弹性网络正则化是一种用于线性回归模型的正则化方法,结合了L1和L2正则化的特点。

可以在具有大量特征的数据集上处理多重共线性问题,并选择相关特征。

弹性网络正则化通过加权L1范数和L2范数来控制正则化项的大小。L1范数在某些情况下会产生稀疏解(即部分系数为零),而L2范数鼓励系数的平滑性。

因此,弹性网络正则化可以综合利用L1和L2正则化的优势。

弹性网络正则化的损失函数可以表示为:

下面是使用Python的scikit-learn库来拟合弹性网络回归模型:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import ElasticNet# 生成一些样本数据
np.random.seed(42)
n_samples = 100
X = np.linspace(-3, 3, n_samples)
y = 0.5 * X + np.random.normal(scale=0.5, size=n_samples)# 创建并拟合弹性网络模型
enet = ElasticNet(alpha=0.5, l1_ratio=0.7)
enet.fit(X.reshape(-1, 1), y)# 绘制原始数据和拟合曲线
plt.scatter(X, y, color='b', label='Original data')
plt.plot(X, enet.predict(X.reshape(-1, 1)), color='r', linewidth=2, label='Elastic Net')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('Elastic Net Regression')
plt.show()

代码中生成了一些具有噪声的样本数据,并使用弹性网络模型进行拟合。

通过绘制原始数据和拟合曲线,可以更好地理解弹性网络正则化在回归问题中的应用。

案例中只是一个简单的示例,实际使用时需要调整参数和改进模型以适应具体问题。

4、Dropout 正则化(用于神经网络)

Dropout 正则化是一种用于神经网络的正则化方法

通过在训练过程中随机将一部分神经元的输出设置为零,从而减少神经网络中的过拟合现象。

Dropout 正则化可以提高模型的泛化能力,并防止神经元之间过度依赖。

Dropout 正则化的原理是,在训练期间以概率  随机地将一部分神经元的输出设置为零,称为“丢弃”。丢弃的方式是对每个神经元引入一个二进制的随机变量 ,取值为 0 或 1,表示该神经元是否被丢弃。在前向传播和反向传播过程中,丢弃的神经元及其连接会被忽略。

在训练过程中,Dropout 正则化的损失函数可以表示为:

在测试阶段,不再进行丢弃操作,而是将所有神经元的输出乘以概率 P。通过这种方式,Dropout 正则化可以减少神经元之间的依赖性,提高模型的鲁棒性。

下面使用Python的tensorflow库来构建一个具有Dropout正则化的简单神经网络:

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf# 生成一些样本数据
np.random.seed(42)
n_samples = 100
X = np.linspace(-3, 3, n_samples)
y = 0.5 * X + np.random.normal(scale=0.5, size=n_samples)# 构建神经网络模型
model = tf.keras.models.Sequential([tf.keras.layers.Dense(16, activation='relu', input_shape=(1,)),tf.keras.layers.Dropout(0.5),tf.keras.layers.Dense(1)
])# 编译和拟合模型
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X, y, epochs=50, batch_size=16, verbose=0)# 绘制原始数据和拟合曲线
plt.scatter(X, y, color='b', label='Original data')
plt.plot(X, model.predict(X), color='r', linewidth=2, label='Dropout Regularization')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('Neural Network with Dropout Regularization')
plt.show()

上述代码生成了一些具有噪声的样本数据,并构建了一个简单的具有Dropout正则化的神经网络模型。通过绘制原始数据和拟合曲线,可以更好地理解Dropout正则化在神经网络中的应用。

5、贝叶斯Ridge和Lasso回归

贝叶斯Ridge回归和Lasso回归是两种基于贝叶斯统计思想的回归算法模型。它们都是经典的线性回归的扩展,可以用于特征选择和解决过拟合问题。

贝叶斯Ridge回归

贝叶斯Ridge回归通过引入正则化项来控制模型的复杂度,同时利用贝叶斯推断方法进行参数估计。其优化目标是最小化损失函数和正则化项的和。

贝叶斯Ridge回归的目标函数如下所示:

贝叶斯Ridge回归的核心思想是将权重参数视为一个随机变量,并使用贝叶斯推断对其进行估计。

通过引入先验分布p(W),根据贝叶斯定理可以得到后验分布P(W|X,y)。然后,可以通过采样或其他方法来估计权重参数的分布,从而得到预测结果。

贝叶斯Ridge回归的优点是可以灵活地处理不同类型的数据和噪声,并且可以用作特征选择方法。缺点是计算复杂度较高,需要进行概率推断。

贝叶斯Lasso回归

贝叶斯Lasso回归也是一种基于贝叶斯统计思想的回归模型。它与贝叶斯Ridge回归类似,但使用的是L1范数正则化项。

贝叶斯Lasso回归的目标函数如下所示:

贝叶斯Lasso回归通过最小化损失函数和L1范数正则化项来实现稀疏性。L1范数倾向于将一些权重参数设为0,从而实现特征选择。

贝叶斯Lasso回归的优点是可以自动进行特征选择,并且能够处理高维数据。缺点是计算复杂度较高,需要进行概率推断。

以贝叶斯Ridge回归为例,使用Python代码实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import BayesianRidge# 生成示例数据集
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 2 * X[:, 0] + np.random.randn(100)# 创建贝叶斯Ridge回归模型对象
model = BayesianRidge()# 拟合模型
model.fit(X, y)# 绘制原始数据和拟合曲线
fig, ax = plt.subplots()
ax.scatter(X, y, color='blue', label='Original data')# 生成用于预测的新样本点
x_new = np.linspace(0, 10, 100).reshape(-1, 1)# 预测新样本点的输出值
y_pred, y_std = model.predict(x_new, return_std=True)# 绘制拟合曲线及置信区间
ax.plot(x_new, y_pred, color='red', label='Fitted curve')
ax.fill_between(x_new.flatten(), y_pred - y_std, y_pred + y_std, color='pink',alpha=0.5, label='Confidence interval')ax.set_xlabel('X')
ax.set_ylabel('y')
ax.set_title('Bayesian Ridge Regression')
ax.legend()
plt.show()

未完待续....

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年建筑安全员C证模拟试题答案及解析

100分题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 单选题(1-10) 1. 发生生产安全事故,对负有责任的生产…

【Python 下载大量品牌网站的图片(一)】关于图片的处理和下载,吃满带宽,可多开窗口下载多个网站,DOS窗口类型

写作日期:2024.05.11 使用工具:Python 可修改功能:线程量、UA、Cookie、代理、存储目录、间隔时间、超时时间、图片压缩、图片缩放 默认功能:图片转换、断续下载、图片检测、路径处理、存储文件 GUI:DOS窗口 类型&…

excel转pdf的java实现

一、实现原理 采用java调用vbs脚本调用office应用把excel转成pdf。 支持文件格式:xlsx,xls,csv 二、前期准备 1、安装office软件 2、准备vbs脚本文件,放到C:\excel2pdf_script\目录下。(本文只用2个文件) 三、VBS转换脚本 1…

【机器学习300问】85、Adam梯度下降优化算法的原理是什么?

Adam优化算法取了两个算法名称的首字母——Adaptive Moment Estimation的缩写,结合了Momentum算法和RMSprop算法的优点。在Momentum中,会计算前一时刻的梯度,并将其用于当前时刻的梯度更新;而RMSprop会对梯度的大小进行自适应调整…

提高Rust安装与更新的速度

一、背景 因为rust安装过程中,默认的下载服务器为crates.io,这是一个国外的服务器,国内用户使用时,下载与更新的速度非常慢,因此,我们需要使用一个国内的服务器来提高下载与更新的速度。 本文推荐使用字节…

在windows下安装wsl子系统

一、安装环境 windows规格 版本Windows 10企业版版本号22H2操作系统内部版本19045.4291 二、安装过程 2.1 以管理员身份打开PowerShell(win X快捷键); 2.2 输入命令:wsl --list --online(简写:wsl -l …

FreeRTOS学习 -- 列表和列表项

列表和列表项是 FreeRTOS 的一个数据结构,FreeRTOS 大量使用到了列表和列表项。 一、什么是列表和列表项 1、列表 列表是 FreeRTOS 中的一个数据结构,被用来跟踪 FreeRTOS 中的任务。与列表相关的全部东西都在文件 list.c 和 list.h中。 List_t 结构体…

手写一个SPI FLASH 读写擦除控制器(未完)

文章目录 flash读写数据的特点1. 扇擦除SE(Sector Erase)1.1 flash_se 模块设计1.1.1 信号连接示意图:1.1.2 SE状态机1.1.3 波形图设计:1.1.4 代码 2. 页写PP(Page Program)2.1 flash_pp模块设计2.1.1 信号连接示意图:…

Python注意事项【自我维护版】

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 本篇博客在之前的博客上进行的维护 创建Python…

服务器内存占用不足会怎么样,解决方案

在当今数据驱动的时代,服务器对于我们的工作和生活起着举足轻重的作用。而在众多影响服务器性能的关键因素当中,内存扮演着极其重要的角色。 服务器内存,也称RAM(Random Access Memory),是服务器核心硬件部…

AC/DC电源模块的节能技术与环保优势

BOSHIDA AC/DC电源模块的节能技术与环保优势 AC/DC电源模块是一种广泛应用于各种电子设备中的电源转换器。随着环保意识的增强,节能技术成为了设计和生产这些模块的关键考虑因素。本文将介绍AC/DC电源模块的节能技术以及它们所带来的环保优势。 首先,AC…

Ps 滤镜:深色线条

Ps菜单:滤镜/滤镜库/画笔描边/深色线条 Filter Gallery/Brush Strokes/Dark Strokes 深色线条 Dark Strokes滤镜通过以独特的线条风格重绘图像的暗部和亮部来增强图像的视觉效果,适用于创作具有强烈对比和动态线条效果的艺术作品。 “深色线条”滤镜可以…