【深度学习实验】网络优化与正则化(五):数据预处理详解——标准化、归一化、白化、去除异常值、处理缺失值

文章目录

  • 一、实验介绍
  • 二、实验环境
    • 1. 配置虚拟环境
    • 2. 库版本介绍
  • 三、优化算法
    • 0. 导入必要的库
    • 1. 随机梯度下降SGD算法
      • a. PyTorch中的SGD优化器
      • b. 使用SGD优化器的前馈神经网络
    • 2.随机梯度下降的改进方法
      • a. 学习率调整
      • b. 梯度估计修正
    • 3. 梯度估计修正:动量法Momentum
    • 4. 自适应学习率
    • 5. Adam算法
  • 四、参数初始化
  • 五、数据预处理
    • 1. 标准化
    • 2. 归一化
    • 3. 白化
    • 4. 去除异常值
    • 5. 处理缺失值
    • 6. 代码整合

一、实验介绍

  深度神经网络在机器学习中应用时面临两类主要问题:优化问题和泛化问题。

  • 优化问题:深度神经网络的优化具有挑战性。

    • 神经网络的损失函数通常是非凸函数,因此找到全局最优解往往困难。
    • 深度神经网络的参数通常非常多,而训练数据也很大,因此使用计算代价较高的二阶优化方法不太可行,而一阶优化方法的训练效率通常较低。
    • 深度神经网络存在梯度消失梯度爆炸问题,导致基于梯度的优化方法经常失效。
  • 泛化问题:由于深度神经网络的复杂度较高且具有强大的拟合能力,很容易在训练集上产生过拟合现象。因此,在训练深度神经网络时需要采用一定的正则化方法来提高网络的泛化能力。

  目前,研究人员通过大量实践总结了一些经验方法,以在神经网络的表示能力、复杂度、学习效率和泛化能力之间取得良好的平衡,从而得到良好的网络模型。本系列文章将从网络优化和网络正则化两个方面来介绍如下方法:

  • 在网络优化方面,常用的方法包括优化算法的选择参数初始化方法数据预处理方法逐层归一化方法超参数优化方法
  • 在网络正则化方面,一些提高网络泛化能力的方法包括ℓ1和ℓ2正则化权重衰减提前停止丢弃法数据增强标签平滑等。

  本文将介绍神经网络中的数据预处理方法

二、实验环境

  本系列实验使用了PyTorch深度学习框架,相关操作如下:

1. 配置虚拟环境

conda create -n DL python=3.7 
conda activate DL
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
conda install matplotlib
 conda install scikit-learn

2. 库版本介绍

软件包本实验版本目前最新版
matplotlib3.5.33.8.0
numpy1.21.61.26.0
python3.7.16
scikit-learn0.22.11.3.0
torch1.8.1+cu1022.0.1
torchaudio0.8.12.0.2
torchvision0.9.1+cu1020.15.2

三、优化算法

  神经网络的参数学习是一个非凸优化问题.当使用梯度下降法来进行优化网络参数时,参数初始值的选取十分关键,关系到网络的优化效率和泛化能力.参数初始化的方式通常有以下三种:

0. 导入必要的库

from torch import nn

1. 随机梯度下降SGD算法

  随机梯度下降(Stochastic Gradient Descent,SGD)是一种常用的优化算法,用于训练深度神经网络。在每次迭代中,SGD通过随机均匀采样一个数据样本的索引,并计算该样本的梯度来更新网络参数。具体而言,SGD的更新步骤如下:

  1. 从训练数据中随机选择一个样本的索引。
  2. 使用选择的样本计算损失函数对于网络参数的梯度。
  3. 根据计算得到的梯度更新网络参数。
  4. 重复以上步骤,直到达到停止条件(如达到固定的迭代次数或损失函数收敛)。

a. PyTorch中的SGD优化器

   Pytorch官方教程

optimizer = torch.optim.SGD(model.parameters(), lr=0.2)

b. 使用SGD优化器的前馈神经网络

   【深度学习实验】前馈神经网络(final):自定义鸢尾花分类前馈神经网络模型并进行训练及评价

2.随机梯度下降的改进方法

  传统的SGD在某些情况下可能存在一些问题,例如学习率选择困难和梯度的不稳定性。为了改进这些问题,提出了一些随机梯度下降的改进方法,其中包括学习率的调整和梯度的优化。

a. 学习率调整

在这里插入图片描述

  • 学习率衰减(Learning Rate Decay):随着训练的进行,逐渐降低学习率。常见的学习率衰减方法有固定衰减、按照指数衰减、按照时间表衰减等。
  • Adagrad:自适应地调整学习率。Adagrad根据参数在训练过程中的历史梯度进行调整,对于稀疏梯度较大的参数,降低学习率;对于稀疏梯度较小的参数,增加学习率。这样可以在不同参数上采用不同的学习率,提高收敛速度。
  • Adadelta:与Adagrad类似,但进一步解决了Adagrad学习率递减过快的问题。Adadelta不仅考虑了历史梯度,还引入了一个累积的平方梯度的衰减平均,以动态调整学习率。
  • RMSprop:也是一种自适应学习率的方法,通过使用梯度的指数加权移动平均来调整学习率。RMSprop结合了Adagrad的思想,但使用了衰减平均来减缓学习率的累积效果,从而更加稳定。

b. 梯度估计修正

  • Momentum:使用梯度的“加权移动平均”作为参数的更新方向。Momentum方法引入了一个动量项,用于加速梯度下降的过程。通过积累之前的梯度信息,可以在更新参数时保持一定的惯性,有助于跳出局部最优解、加快收敛速度。
  • Nesterov accelerated gradient:Nesterov加速梯度(NAG)是Momentum的一种变体。与Momentum不同的是,NAG会先根据当前的梯度估计出一个未来位置,然后在该位置计算梯度。这样可以更准确地估计当前位置的梯度,并且在参数更新时更加稳定。
  • 梯度截断(Gradient Clipping):为了应对梯度爆炸或梯度消失的问题,梯度截断的方法被提出。梯度截断通过限制梯度的范围,将梯度控制在一个合理的范围内。常见的梯度截断方法有阈值截断和梯度缩放。

3. 梯度估计修正:动量法Momentum

【深度学习实验】网络优化与正则化(一):优化算法:使用动量优化的随机梯度下降算法(Stochastic Gradient Descent with Momentum)

4. 自适应学习率

【深度学习实验】网络优化与正则化(二):基于自适应学习率的优化算法详解:Adagrad、Adadelta、RMSprop

5. Adam算法

  Adam算法(Adaptive Moment Estimation Algorithm)[Kingma et al., 2015]可以看作动量法和 RMSprop 算法的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率
【深度学习实验】网络优化与正则化(三):随机梯度下降的改进——Adam算法详解(Adam≈梯度方向优化Momentum+自适应学习率RMSprop)

四、参数初始化

【深度学习实验】网络优化与正则化(四):参数初始化及其Pytorch实现——基于固定方差的初始化(高斯、均匀分布),基于方差缩放的初始化(Xavier、He),正交初始化

五、数据预处理

  除了参数初始化比较困难之外,不同输入特征的尺度差异比较大时,梯度下降法的效率也会受到影响。一般而言,样本特征由于来源以及度量单位不同,它们的尺度(Scale)(即取值范围)往往差异很大.以描述长度的特征为例,当用“米”作单位时令其值为𝑥,那么当用“厘米”作单位时其值为100𝑥.
  对于尺度不同的特征,不同的机器学习模型对其敏感程度不同。尺度不变性是指机器学习算法在缩放全部或部分特征后仍能保持学习和预测性能的性质。例如,线性分类器具有尺度不变性,而最近邻分类器则对特征尺度敏感。当计算不同样本之间的欧氏距离时,尺度大的特征会起到主导作用。因此,对于尺度敏感的模型,需要对样本进行预处理,将各个特征转换到相同的取值区间,并消除不同特征之间的相关性,以获得更好的结果。
  理论上,神经网络应该具有尺度不变性,可以通过参数的调整来适应不同特征的尺度。然而,尺度不同的输入特征会增加训练的难度。以一个只有一层的神经网络为例,如果输入特征的尺度差异很大,那么tanh函数在区间[-2, 2]上的导数会很敏感,而在其他区间上接近于0。因此,如果参数𝑤1𝑥1 + 𝑤2𝑥2 + 𝑏过大或过小,梯度会变得很小,导致难以训练。为了提高训练效率,可以将𝑤1设为较小的值(例如[-0.1, 0.1]之间),从而使𝑤1𝑥1 + 𝑤2𝑥2 + 𝑏在[-2, 2]区间内。然而,当数据维度很多时,手动选择每个参数变得困难。因此,如果每个特征的尺度相似(例如[0, 1]或[-1, 1]),就可以减少人工干预,简化训练过程。
  数据预处理方法是在训练神经网络之前对数据进行处理,以提高模型的性能和训练效果。常见的数据预处理方法包括标准化、归一化、白化等操作。

1. 标准化

  将数据按照特征列进行均值为0,标准差为1的标准化处理。这种方法可以使得数据的分布更加接近正态分布,有助于提高模型的训练效果。

import torch
from sklearn.preprocessing import StandardScaler

# 假设有一个名为data的张量,形状为(100, 10)
data = torch.randn(100, 10)

# 创建StandardScaler对象
scaler = StandardScaler()

# 对数据进行标准化
normalized_data = scaler.fit_transform(data)

# 打印标准化后的数据
print(normalized_data)

2. 归一化

  将数据按照特征列进行线性变换,将数据的取值范围缩放到0到1之间。这种方法可以将不同特征的数据统一到同一个尺度上,避免不同特征之间的差异对模型的影响。

import torch
from sklearn.preprocessing import MinMaxScaler

# 假设有一个名为data的张量,形状为(100, 10)
data = torch.randn(100, 10)

# 创建MinMaxScaler对象
scaler = MinMaxScaler()

# 对数据进行最小最大值归一化
normalized_data = scaler.fit_transform(data)

# 打印归一化后的数据
print(normalized_data)

在这里插入图片描述

3. 白化

  白化(Whitening)是一种重要的预处理方法,用来降低输入数据特征之间的冗余性。输入数据经过白化处理后,特征之间相关性较低,并且所有特征具有相同的方差。白化的一个主要实现方式是使用主成分分析(Principal Component Analysis,PCA)方法去除掉各个成分之间的相关性。

import numpy as np
from sklearn.decomposition import PCA

# 假设有一个名为data的数组,形状为(100, 10)
data = np.random.randn(100, 10)

# 计算数据的协方差矩阵
covariance_matrix = np.cov(data, rowvar=False)

# 使用PCA方法进行白化处理
pca = PCA(whiten=True)
whitened_data = pca.fit_transform(data)

# 打印白化后的数据
print(whitened_data)

在这里插入图片描述

4. 去除异常值

  将数据中的异常值进行处理或去除,避免异常值对模型的影响,可以考虑以下几种常见方法:

  1. 删除异常值:将数据中的异常值直接删除或忽略。这种方法适用于异常值对整体数据影响较小的情况,但需要注意可能会导致数据的信息损失。

  2. 替换异常值:将异常值替换为合理的数值。可以使用均值、中位数、众数等统计量来替换异常值,或者使用插值法进行填充。这种方法适用于异常值数量较少且可以通过合理的替换来保持数据整体分布特征的情况。

  3. 离散化处理:将连续型的异常值转化为离散型数据,例如将连续的数值分桶为不同的类别。这种方法适用于异常值呈现明显分布特征的情况。

  4. 使用统计方法:使用统计方法来识别和处理异常值,例如Z-score方法或箱线图方法等。这些方法可以通过计算数据的偏差程度来确定异常值,并进一步进行处理。

5. 处理缺失值

  对于数据中存在的缺失值,可以通过填充、删除或插值等方法进行处理。

  1. 填充是指用某个合理的数值替代缺失值,可以使用均值、中位数、众数等统计量来填充。
  2. 删除是指直接删除包含缺失值的样本或特征,但需要注意可能会导致数据的信息损失。
  3. 插值是指根据已有的数据推测缺失值,常用的插值方法有线性插值、多项式插值、样条插值等。

6. 代码整合

import torch
import pandas as pd
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.impute import SimpleImputer
import numpy as np

# 假设有一个名为data的张量,形状为(100, 10),其中含有缺失值和异常值
data = torch.randn(100, 10)
data[0, 0] = torch.tensor(float('nan'))  # 添加一个缺失值
data[1, 1] = 1000  # 添加一个异常值

# 缩放
scaler = MinMaxScaler()  # 最小最大值缩放
scaled_data = scaler.fit_transform(data)

scaler = StandardScaler()  # 标准化
scaled_data = scaler.fit_transform(data)

# 去除异常值
std = torch.std(data)
mean = torch.mean(data)
data[(data - mean).abs() > 3 * std] = float('nan')  # 使用3倍标准差去除异常值

# 处理缺失值
data = pd.DataFrame(data.numpy())  # 转换为DataFrame
imputer = SimpleImputer(strategy='mean')  # 使用均值插补缺失值
imputed_data = imputer.fit_transform(data)
imputed_data = torch.tensor(imputed_data)  # 转换为Tensor

# 打印处理后的数据
print(imputed_data)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【文件包含】phpmyadmin 文件包含(CVE-2014-8959)

1.1漏洞描述 漏洞编号CVE-2014-8959漏洞类型文件包含漏洞等级高危漏洞环境Windows漏洞名称phpmyadmin 文件包含(CVE-2014-8959) 描述: phpMyAdmin是一套开源的、基于Web的MySQL数据库管理工具。其index.php中存在一处文件包含逻辑,通过二次编…

通过maven命令手动上传jar私服Nexus

Nexus3在界面上传组件时报: Ext.JSON.decode(): Youre trying to decode an invalid JSON String: 查找了很多资料,都没有解决。有哪位大佬知道的评论告诉一下,万分感谢。 于是换成maven命令上传: mvn deploy:deploy-file -Dgr…

promise时效架构升级方案的实施及落地 | 京东物流技术团队

一、项目背景 为什么需要架构升级 promise时效包含两个子系统:内核时效计算系统(系统核心是时效计算)和组件化时效系统(系统核心是复杂业务处理以及多种时效业务聚合,承接结算下单黄金流程流量)&#xff…

Google codelab WebGPU入门教程源码<4> - 使用Uniform类型对象给着色器传数据(源码)

对应的教程文章: https://codelabs.developers.google.com/your-first-webgpu-app?hlzh-cn#5 对应的源码执行效果: 对应的教程源码: 此处源码和教程本身提供的部分代码可能存在一点差异。 class Color4 {r: number;g: number;b: number;a: number;constructor(pr 1.0, …

FactoryIO 分拣仿真博图实现

FC_LightSygnalization FC_Manual Forward Backward

虚幻C++ day5

角色状态的常见机制 创建角色状态设置到UI上 在MainPlayer.h中新建血量,最大血量,耐力,最大耐力,金币变量,作为角色的状态 //主角状态UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category "Playe Stats&…

最新PS 2024 虎标正式版来啦,附带AI神经滤镜(支持win/mac)

软件简介 文件名称 PS2024 虎标正式版 支持系统 windows、Mac 获取方式 文章底部 分享形式 百度网盘 小伙伴们,下午好!今天给大家的是PS 2024 25.0虎标正式版。 PS 2024 25.0 正式版介绍 经历了多次Photoshop 2023 Beta 测试之后,今天…

01.智慧商城——项目介绍与初始化

智慧商城 - 授课大纲 接口文档:https://apifox.com/apidoc/shared-12ab6b18-adc2-444c-ad11-0e60f5693f66/doc-2221080 演示地址:http://cba.itlike.com/public/mweb/#/ 01. 项目功能演示 1.明确功能模块 启动准备好的代码,演示移动端面…

Mahony 滤波算法参数自动调节方法 11

Mahony 滤波算法参数自动调节方法 1. 基于无阻尼自由频率设计设置Kp、Ki参数[^1]2.基于时间常数设置Kp, Ki参数[^2][^3] 1. 基于无阻尼自由频率设计设置Kp、Ki参数1 2.基于时间常数设置Kp, Ki参数23 Gain-Scheduled Complementary Filter Design for a M…

Vue3:给表格的单元格增加超链接功能(点击单元格可以跳转到新的页面)

一、目的 在Vue3项目中&#xff0c;给表格某个字段下的全部单元格添加超链接功能&#xff0c;点击对应的单元格可以进入对应的页面 二、定义单元格内容 使用ElementPlus的el-table组件来实现表格 1、代码 <template> <el-table :data"dataAll"> &…

成都瀚网科技有限公司抖音带货正规么

近年来&#xff0c;随着抖音等短视频平台的兴起&#xff0c;越来越多的企业和个人选择在抖音上进行带货。成都瀚网科技有限公司&#xff08;以下简称瀚网科技&#xff09;也提供抖音带货服务&#xff0c;那么&#xff0c;瀚网科技的抖音带货正规吗&#xff1f; 首先&#xff0c…

达索系统SOLIDWORKS Electrical机电一体化协同设计

一秒读懂 SOLIDWORKS Electrical 问题点 电气、机械设计各自为政数据传递困难&#xff0c;存在设计错误 CHALLENGE电气设计面临挑战 问题点&#xff1a;电气、机械设计各自为政数据传递困难&#xff0c;存在设计错误 原理图绘制完毕后&#xff0c;再绘制接线图,人工统计BOM&a…

【新版Bing】集成chatGpt4的搜索引擎

具体步骤 打开Chrome浏览器&#xff0c;进入无痕模式。 访问bing.com/new;&#xff08;需要kexueshangwang&#xff0c;评论区有具体方法&#xff09; 注册账号或使用老帐号登录&#xff08;我是直接用的老帐号&#xff09; 注册界面 登录成功 点击在Microsoft Edge中…

windows usbip(瑞芯微windows开发)

Rockchip RK3588 windows开发 安装usbipd 除usbipd之外&#xff0c;还有一个usbip仓库可以参考usbip-win&#xff0c;但是相对麻烦一些 windows install winget install usbipdShare Devices usbipd --help usbipd list usbipd bind --busid<BUSID>Remote Connectin…

金融行业如何数字化转型?_光点科技

金融行业的数字化转型涉及技术创新的引入、客户体验的改善、内部流程的优化、安全和合规性的加强以及员工技能和企业文化的转变。 技术创新 包括云计算、人工智能、大数据分析和区块链技术的采用。云计算增强数据处理的灵活性&#xff0c;AI和机器学习在风险评估和欺诈检测方面…

YOLOv8-Seg改进: 捕捉空间上的局部关系和全局关系的CoordAttention注意力 | 分割注意力系列篇

🚀🚀🚀本文改进:CoordAttention注意力,引入到YOLOv8-seg,CoordAttention在计算注意力时,不仅会考虑输入的特征信息,还会考虑每个像素点的位置信息,从而更好地捕捉空间上的局部关系和全局关系。 🚀🚀🚀Context Aggregation小目标分割&复杂场景首选,实现…

二叉树的创建与遍历

目录 前言&#xff1a; 二叉树的概念与结构 二叉树的链式存储 二叉树的创建 二叉树的销毁 二叉树结点个数计算 二叉树叶子结点个数计算 二叉树第k层节点个数的计算 二叉树高度的计算 二叉树查找值为x的结点 二叉树的遍历 二叉树的前序遍历 二叉树的中序遍历 二叉树…

还在为忘记BIOS密码担心?至少有五种方法可以重置或删除BIOS密码

忘记密码是一个我们都非常熟悉的问题。虽然在大多数情况下,只需单击“忘记密码”选项,然后按照几个简单的步骤即可恢复访问权限,但情况并非总是如此。忘记BIOS密码(通常为避免进入BIOS设置或避免个人计算机启动而设置的密码)意味着你将无法完全启动系统。 幸运的是,就像…

oracle初步学习

先了解几个登录的方式 1.直接在cmd输入 sqlplus scott/tiger //登陆普通用户scott 2.输入sqlplus sys as sysdba 之后 紧接着让你输入口令&#xff0c;直接输入sys就行了 3.先输入sqlplus/nolog 在输入conn system/managerorcl 先在cmd窗口输入sqlplus/nolog &#x…

免费分享一套基于Springboot+Vue的医院管理系统,挺漂亮的

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringbootVue的医院管理系统&#xff0c;分享下哈。 项目视频演示 【免费】springbootvue医院管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】springbootvue医院管理系统 Java毕业设计项目来自互联网&a…