归一化/标准化对神经网络的训练是否有影响?

一、背景

        归一化(Normalization)和标准化(Standardization)是数据预处理中的两种常见技术,旨在调整数据的范围和分布,以提高机器学习模型或者深度学习模型的性能和训练速度。虽然它们的目标相似,但具体方法和应用场景有所不同。

1、归一化

        归一化是将数据缩放到一个特定的范围(通常是0到1之间),以确保不同特征具有相同的尺度。归一化常用于需要保持数据相对比例的场景,如图像处理和神经网络训练。最常见的归一化方法是最小-最大归一化(Min-Max Normalization),其公式为:

{x}' = \frac{x-x_{min}}{x_{max}-x_{min}}

        其中:

  • x是原始数据。
  • x′是归一化后的数据。
  • x_{min}x_{max}分别是数据集中的最小值和最大值。

2、标准化

        标准化是将数据转换为均值为0、标准差为1的标准正态分布。标准化常用于需要假设数据服从正态分布的场景,如线性回归和支持向量机:

{x}' = \frac{x-\mu}{\sigma }

        其中:

  • x是原始数据。
  • x′是标准化后的数据。
  • μ是数据的均值。
  • σ是数据的标准差。

二、python示例

        下面的代码中,我们构建了一个torch板的全连接神经网络,训练数据集采用sklearn自带的经典的乳腺癌二分类数据集。我们将展示对数据进行归一化以及不进行归一化会给模型训练带来什么样的影响(也可以换成标准化的代码试一下)。模型的结构以及构建过程不再赘述,可以参考笔者往期的博文。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.metrics import precision_score, recall_score, f1_score# 加载乳腺癌数据集
data = load_breast_cancer()
X = data.data
y = data.target# 数据标准化
scaler = MinMaxScaler()
X = scaler.fit_transform(X)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 将数据转换为PyTorch张量
X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.float32)# 定义自定义数据集类
class BreastCancerDataset(Dataset):def __init__(self, X, y):self.X = Xself.y = ydef __len__(self):return len(self.X)def __getitem__(self, idx):return self.X[idx], self.y[idx]# 创建数据集和数据加载器
train_dataset = BreastCancerDataset(X_train, y_train)
test_dataset = BreastCancerDataset(X_test, y_test)train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=4, shuffle=False)# 定义MLP模型
class MLP(nn.Module):def __init__(self, input_size, hidden_size, num_classes):super(MLP, self).__init__()self.fc1 = nn.Linear(input_size, hidden_size)self.relu = nn.ReLU()self.fc2 = nn.Linear(hidden_size, num_classes)self.sigmoid = nn.Sigmoid()def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)out = self.sigmoid(out)return out# 定义模型参数
input_size = X_train.shape[1]
hidden_size = 16
num_classes = 1# 创建模型
model = MLP(input_size, hidden_size, num_classes)# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 5for epoch in range(num_epochs):model.train()running_loss = 0.0for inputs, labels in train_loader:# 前向传播outputs = model(inputs)loss = criterion(outputs.squeeze(), labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}")print("Training complete.")# 评估模型
def evaluate(model, dataloader):model.eval()all_labels = []all_predictions = []with torch.no_grad():for inputs, labels in dataloader:outputs = model(inputs)predicted = (outputs.squeeze() > 0.5).float()all_labels.extend(labels.tolist())all_predictions.extend(predicted.tolist())precision = precision_score(all_labels, all_predictions)recall = recall_score(all_labels, all_predictions)f1 = f1_score(all_labels, all_predictions)return precision, recall, f1train_precision, train_recall, train_f1 = evaluate(model, train_loader)
test_precision, test_recall, test_f1 = evaluate(model, test_loader)print(f"Train Precision: {train_precision:.4f}")
print(f"Train Recall: {train_recall:.4f}")
print(f"Train F1 Score: {train_f1:.4f}")print(f"Test Precision: {test_precision:.4f}")
print(f"Test Recall: {test_recall:.4f}")
print(f"Test F1 Score: {test_f1:.4f}")

        未进行数据归一化直接训练的模型表现:

        归一化之后的模型表现:

        可以看到,数据归一化之后训练的模型性能相比原始数据训练出来的模型要大大提升。训练和测试是precision都提升了10%左右,F1值也提升了5%左右。

三、总结

        在机器学习建模过程中,许多模型在训练之前需要对输入数据进行归一化或标准化。这些模型通常对输入特征的尺度敏感,归一化或标准化可以提高模型的性能和训练速度。树类模型(如决策树、随机森林、梯度提升树等)不需要对特征进行归一化或标准化处理,因为它们的分裂标准与特征的尺度无关。然而,在神经网络中,输入数据的尺度过大可能导致激活函数的输出值过大或过小,影响梯度的计算,导致数值不稳定性。因此,我们在进行深度学习建模的过程中,如果特征取值之间的量纲差异较大,务必要对数据进行归一化或者标准化的处理。

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

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

相关文章

Redis、TongRDS 可视化工具使用之 Redis Insight

题外话:除了可以连接 redis,也可以用来连接 TongRDS 1)官网下载 Redis Insight 2)安装 3)连接 4)使用 这里只是给一个使用例子

oracle查看锁阻塞-谁阻塞了谁

一 模拟锁阻塞 #阻塞1 一个会话正在往一个大表写入大量数据的时候,另一个会话加字段: #会话1 #会话2 会话2被阻塞了。 #阻塞2 模拟一个会话update一条记录,没提交。 另一个会话也update这一条记录: 会话2被阻塞了。 二 简单查…

django基于django的民族服饰数据分析系统的设计与实现

摘 要 随着网络科技的发展,利用大数据分析对民族服饰进行管理已势在必行;该平台将帮助企业更好地理解服饰市场的趋势,优化服装款式,提高服装的质量。 本文讲述了基于python语言开发,后台数据库选择MySQL进行数据的存储…

STM32单片机CAN总线汽车线路通断检测-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展,车辆通信接口在汽车电子控…

golang对日期格式化

1.对日期格式化为 YYYY-mm-dd, 并且没有数据时,返回空 import ("encoding/json""time" )type DateTime time.Timetype SysRole struct {RoleId int64 gorm:"type:bigint(20);primary_key;auto_increment;角色ID;" json:&quo…

MySQL系列之数据授权(privilege)

导览 前言Q:如何对MySQL数据库进行授权管理一、MySQL的“特权”1. 权限级别2. 权限清单 二、授权操作1. 查看权限2. 分配权限3. 回收权限 结语精彩回放 前言 看过博主上一篇的盆友,可以Get到一个知识点:数据授权(eg:g…

项目进度计划表:详细的甘特图的制作步骤

甘特图(Gantt chart),又称为横道图、条状图(Bar chart),是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特(Henry Laurence Gantt)发明,是一种通过条状图来…

【Redis】Redis实现的消息队列

一、用list实现【这是数据类型所以支持持久化】 消息基于redis存储不会因为受jvm内存上限的限制,支持消息的有序性,基于redis的持久化机制,只支持单一消费者订阅,无法避免消息丢失。 二、用PubSub【这不是数据类型,是…

Linux登录指令last详解

引言 在Linux系统中,了解用户登录记录是系统管理和安全审计的重要任务之一。last指令作为Linux系统中用于检索和展示用户登录信息的工具,扮演着至关重要的角色。本文将详细介绍last指令的定义、架构、原理、企业应用以及常见的命令体系,帮助…

CSP-X2024山东小学组T2:消灭怪兽

题目链接 题目名称 题目描述 怪兽入侵了地球! 为了抵抗入侵,人类设计出了按顺序排列好的 n n n 件武器,其中第 i i i 件武器的攻击力为 a i a_i ai​,可以造成 a i a_i ai​ 的伤害。 武器已经排列好了,因此不…

【操作系统笔记】目录

【操作系统笔记】操作系统框架https://blog.csdn.net/Resurgence03/article/details/142624262 【操作系统笔记】CPU管理https://blog.csdn.net/Resurgence03/article/details/142621526 【操作系统笔记】内存管理https://blog.csdn.net/Resurgence03/article/details/142669…

用 Python 与 Turtle 创作属于你的“冰墩墩”!

用 Python 与 Turtle 创作属于你的“冰墩墩”! 🦀 前言 🦀🐋 效果图 🐋🐉 代码 🐉 🦀 前言 🦀 冰墩墩是2022年北京冬季奥林匹克运动会的官方吉祥物。以熊猫为原型&#x…

C++将整形数据转换为字符串

在 C 中&#xff0c;将整数转换为字符串有多种方法&#xff0c;以下是几种常见的方式&#xff1a; 1. 使用 std::to_string 函数&#xff08;C11 及以后版本可用&#xff09; 函数介绍&#xff1a;std::to_string 是 C 标准库提供的一个非常方便的函数&#xff0c;它位于 <…

基于SSM的农家乐管理系统+论文示例参考

1.项目介绍 功能模块&#xff1a;管理员&#xff08;农家乐管理、美食信息管理、住宿信息管理、活动信息、用户管理、活动报名、论坛等&#xff09;&#xff0c;普通用户&#xff08;注册登录、活动报名、客房预订、用户评价、收藏管理、模拟支付等&#xff09;技术选型&#…

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台 传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大&#xff0c;也被企业广泛采用&#xff0c;然后也存着在诸如学习曲线陡峭&#xff0c;上手难度大&#x…

集群聊天服务器(8)用户登录业务

目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online 业务层代码 #include "chatservice.hpp" #include "public.hpp" #include <string> #include <muduo/base/Loggi…

04 - Clickhouse-21.7.3.14-2单机版安装

目录 一、准备工作 1、确定防火墙处于关闭状态 2、CentOS 取消打开文件数限制 3、安装依赖 4、CentOS取消SELINUX 二、单机安装 2.1、下载安装 2.2、安装这4个rpm包 2.3、修改配置文件 2.4、启动服务 2.5、关闭开机自启 2.6、使用Client连接server 一、准备工作 1…

RabbitMQ消息可靠性保证机制4--消费端限流

7.7 消费端限流 在类似如秒杀活动中&#xff0c;一开始会有大量并发写请求到达服务端&#xff0c;城机对消息进行削峰处理&#xff0c;如何做&#xff1f; 当消息投递的速度远快于消费的速度时&#xff0c;随着时间积累就会出现“消息积压”。消息中间件本身是具备一定的缓冲…

labview中的调用链

在有些项目中会用到调用链&#xff0c;用我自己的理解来说就像是递归函数那样层层调用&#xff0c;然后结果回退到第一次开始调用的main函数哪里&#xff0c;这里对于传值的时候还是非常好用&#xff0c;通过更改子VI然后来改变主VI的里面函数的值来实现这个效果。 我们可以看…

MySQL初学之旅(3)约束

目录 1.前言 2.正文 2.1约束类型 2.2NULL约束 2.3UNIQUE约束 2.4DEFAULT约束 2.5PRIMARY KEY主键约束 2.6FOREIGN KEY外键约束 2.7CHECK约束 3.小结 1.前言 哈喽大家好啊&#xff0c;今儿来继续给大家分享最近学习的MySQL和约束相关的知识点&#xff0c;希望大家一起…