数据分析——数据预处理和数据管道构建

目标:对于拿到的一个任意数据集,编写类似数据加载程序,以适应深度学习的研究。

 框架:

针对不同的时间序列数据集,可以总结如下关键步骤,以编写类似上述代码的深度学习数据处理流程:

1. **了解数据集:**


   - 了解新数据集的特性,包括时间序列的长度、采样频率、数据格式和标签信息等。

2. **数据加载:**


   - 实现加载时间序列数据的函数,可以使用常见的数据处理库(例如`pandas`、`numpy`)。

```python
# 例如,对CSV格式的时间序列数据进行加载
import pandas as pd

def load_time_series_data(file_path):
    return pd.read_csv(file_path)
```

3. **数据预处理:**


   - 根据时间序列数据的特点进行预处理,包括但不限于:
     - 缺失值处理
     - 平滑处理(如滤波)
     - 标准化或归一化
     - 特征工程(提取有用的特征)

```python
# 例如,简单的归一化处理
def normalize_time_series_data(data):
    return (data - data.mean()) / data.std()
```

4. **数据分割:**


   - 将时间序列数据集划分为训练集、验证集和测试集。

```python
# 例如,基于时间的分割
def split_time_series_data(data, train_ratio=0.8, val_ratio=0.1):
    train_size = int(len(data) * train_ratio)
    val_size = int(len(data) * val_ratio)
    test_size = len(data) - train_size - val_size
    train_data, val_data, test_data = data[:train_size], data[train_size:train_size + val_size], data[-test_size:]
    return train_data, val_data, test_data
```

5. **序列切割:**
   - 如果时间序列较长,可以将其切割成固定长度的序列,以便输入深度学习模型。

```python
# 例如,将时间序列切割成固定长度的子序列
def segment_time_series(data, segment_length):
    segments = []
    for i in range(0, len(data) - segment_length + 1, segment_length):
        segments.append(data[i:i+segment_length])
    return segments
```

6. **数据增强:**


   - 根据需要,实现时间序列数据的数据增强方法,例如引入噪声、随机缩放等。

```python
# 例如,简单的添加噪声
import numpy as np

def add_noise_to_time_series(data, noise_level=0.1):
    noise = np.random.normal(0, noise_level, len(data))
    return data + noise
```

7. **构建数据集类:**


   - 设计一个数据集类,整合加载、预处理、分割等操作,以便于在深度学习模型中使用。

```python
class TimeSeriesDataset:
    def __init__(self, file_path, segment_length=256, train_ratio=0.8, val_ratio=0.1):
        self.data = load_time_series_data(file_path)
        self.data = normalize_time_series_data(self.data)
        self.train_data, self.val_data, self.test_data = split_time_series_data(self.data, train_ratio, val_ratio)
        self.train_segments = segment_time_series(self.train_data, segment_length)
        # ...其他初始化步骤...

# 示例用法
time_series_dataset = TimeSeriesDataset('path/to/your/time_series_data.csv')
```

8. **数据管道:**


   - 建立一个数据管道,确保数据有效地输入到深度学习模型中。

```python
# 例如,使用 TensorFlow 的数据管道
import tensorflow as tf

def create_data_pipeline(data, batch_size=32):
    dataset = tf.data.Dataset.from_tensor_slices(data)
    dataset = dataset.shuffle(buffer_size=len(data))
    dataset = dataset.batch(batch_size)
    return dataset
```

通过按照这些步骤组织代码,您可以更容易地处理不同时间序列数据集,并确保数据准备流程适应您的深度学习任务。

案例一:将如下LSTM的时间预测项目代码改为由数据加载和处理(data_loader)、模型(models) 、训练代码(train.py)三部分组成。

 1.1 整体代码(修改前)

import torch
import torch.nn as nnimport numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 读取数据集
dataset = pd.read_csv(r'D:\datasets\预测模型实验\PRZ liquid space leak 0.8.csv')# 将行数做成一列显式的索引列
dataset.insert(0, 'Index_Column', dataset.index)all_data = dataset['主回路1热管段冷却剂温度(℃)306.852814'].values# 数据预处理
# 定义划分比例
train_ratio = 0.8  # 80%的数据作为训练集# 计算划分索引
split_index = int(len(dataset) * train_ratio)# 划分数据
train_data = dataset.iloc[:split_index]
test_data = dataset.iloc[split_index:]# 标准化
from sklearn.preprocessing import MinMaxScaler# '主回路1热管段冷却剂温度(℃)306.852814' 是要归一化的列名
column_name = '主回路1热管段冷却剂温度(℃)306.852814'# 将 DataFrame 转换为 NumPy 数组
train_data_array = train_data[column_name].values.reshape(-1, 1)# 使用 MinMaxScaler 进行归一化
scaler = MinMaxScaler(feature_range=(-1, 1))
train_data_normalized = scaler.fit_transform(train_data_array)# 数据张量化
train_data_normalized = torch.FloatTensor(train_data_normalized).view(-1)# 训练数据转换为序列和相应的标签
train_window = 30def create_inout_sequences(input_data, tw):inout_seq = []L = len(input_data)for i in range(L-tw):train_seq = input_data[i:i+tw]train_label = input_data[i+tw:i+tw+1]inout_seq.append((train_seq ,train_label))return inout_seqtrain_inout_seq = create_inout_sequences(train_data_normalized, train_window)# 创建模型
import torch.nn as nnclass LSTM(nn.Module):def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):super().__init__()self.hidden_layer_size = hidden_layer_sizeself.lstm = nn.LSTM(input_size, hidden_layer_size)self.linear = nn.Linear(hidden_layer_size, output_size)def forward(self, input_seq):lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq), 1, -1), self.hidden_cell)predictions = self.linear(lstm_out.view(len(input_seq), -1))return predictions[-1]# 构建模型对象
model = LSTM()
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)import matplotlib.pyplot as pltepochs = 50
losses = []  # 用于存储每个 epoch 的损失值for i in range(epochs):epoch_loss = 0.0  # 用于累积每个 epoch 的损失值for seq, labels in train_inout_seq:optimizer.zero_grad()model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size),torch.zeros(1, 1, model.hidden_layer_size))y_pred = model(seq)single_loss = loss_function(y_pred, labels)single_loss.backward()optimizer.step()epoch_loss += single_loss.item()losses.append(epoch_loss)  # 记录每个 epoch 的损失值if i % 5 == 0:  # 每5个 epoch 打印一次损失值print(f'Epoch [{i}/{epochs}], Loss: {epoch_loss:.8f}')# 绘制损失曲线
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss Over Epochs')
plt.show()# 进行预测
fut_pred = 30test_inputs = train_data_normalized[-train_window:].tolist()
#print(test_inputs)model.eval()for i in range(fut_pred):seq = torch.FloatTensor(test_inputs[-train_window:])with torch.no_grad():model.hidden = (torch.zeros(1, 1, model.hidden_layer_size),torch.zeros(1, 1, model.hidden_layer_size))test_inputs.append(model(seq).item())# 将归一化后的预测值转换为实际预测值
actual_predictions = scaler.inverse_transform(np.array(test_inputs[train_window:] ).reshape(-1, 1))# 可视化预测值与实际值
x = np.arange(437, 467, 1)# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用中文字体(例如:黑体)
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题plt.title('主回路1热管段冷却剂温度')
plt.ylabel('温度值')
plt.grid(True)
plt.autoscale(axis='x', tight=True)
plt.plot(dataset['主回路1热管段冷却剂温度(℃)306.852814'],label='实际温度')
plt.plot(x,actual_predictions, label='预测温度')
# 添加图例
plt.legend()
plt.show()

 将如上LSTM的时间预测项目代码改为由数据加载和处理(data_loader)、模型(models) 、训练代码(train.py)三部分组成。

1.2  数据加载和处理(data_loader)

将被用于深度学习的数据集定义为一个数据集类,数据的加载和预处理都通过这个类来实现。编写该类时,主要关注两个方面,其一是构造函数(详情如下),其二就是 

构造函数:

初始化可控参数,包括加载数据(导入数据)初始化超参数实例化某种工具(比如归一化实例)。 

data_loader部分的代码:

# data_loader/shujvjiazai.py
import torch
import pandas as pd
from sklearn.preprocessing import MinMaxScaler# 数据加载
class DataLoader:def __init__(self, file_path, column_name, train_ratio=0.8):self.dataset = pd.read_csv(file_path)self.train_ratio = train_ratio  # 划分为训练集的比例self.scaler = MinMaxScaler(feature_range=(-1, 1)) # 归一化实例self.column_name = column_name  # 将要被归一化的列名def load_and_preprocess_data(self):split_index = int(len(self.dataset) * self.train_ratio) # # 计算划分索引# 划分数据集train_data = self.dataset.iloc[:split_index] # 划分的训练集test_data = self.dataset.iloc[split_index:]  # 划分的测试集# # 将 DataFrame 转换为 NumPy 数组train_data_array = train_data[self.column_name].values.reshape(-1, 1)train_data_normalized = self.scaler.fit_transform(train_data_array)# 张量化train_data_normalized = torch.FloatTensor(train_data_normalized).view(-1)# 返回张量化后的数据return train_data_normalized

要点:
(1)构造函数负责加载数据和声明(初始化)可控参数。

(2)在函数中定义数据预处理的步骤,比如数据划分,归一化,张量化等。

1.3 模型(model)

整体代码中和将代码分写,关于model部分并无变化。

 

1.4 训练脚本(train.py)

在训练脚本train.py中,需要导入前面编写好的数据加载代码,比如要导入 

data_loader/shujvjiazai.py中的数据处理类DataLoader

那就在train.py中做导入,即:

from data_loader.shujvjiazai import DataLoader

由上可知,也可以在shujvjiazai.py文件中写下多个不同的数据集处理类,比如class DataLoader1,class DataLoader2,class DataLoader3

这样当train中需要对某个数据集做训练时,只要在train.py中导入该数据集类即可。比如:

from data_loader.shujvjiazai import DataLoader2  # 应用数据集DataLoader2 

 

 关于创建模型实例,以及迭代训练模型的代码,train.py中好“一体化”代码并没有什么两样。

总结

若想改变原来写“一体化”代码的习惯,养成将代码分块,其实就是python中模块化的思想。

(1)首先,编写好数据加载和预处理模块(例如:data_loader/shujvjiazai.py ),导入数据,设置好一些超参数。

(2)然后再根据数据预处理的基本步骤,将各个步骤写成函数,于数据集类中。

(3)编写好模型代码(例如:models/LSTM_LKW.py )。

(4)编写好模型训练代码(train.py)。主要在于导入包部分,其他的训练代码的写法其实和“一体化”代码一样。导入如上(1)(3)中的数据和模型,所以在train.py中。需要导入这两个模块。

 

 

 

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

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

相关文章

开源低代码开发平台如何在数字化转型中发挥价值?

当前,数字化转型升级是发展潮流,也是很多企业提升市场竞争力,获得更多利润价值的发展路径。作为提质增效的办公利器,开源低代码开发平台也将发挥应有的价值和作用,在推动企业数字化转型和流程化办公的过程中贡献力量&a…

layui表格中预览视频和图片

全代码 <!DOCTYPE html> <html><head><title>Layui&#xff1a;数据表格table中预览图片、视频</title><meta charset"utf-8"/><link rel"stylesheet" href"../dist/css/layui.css"><style>&l…

竞赛保研 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现SSA-BiLSTM麻雀算法优化…

UDP攻击是什么?遇到UDP攻击怎么办

UDP攻击&#xff0c;也称为UDP洪水攻击&#xff0c;是一种拒绝服务&#xff08;DoS&#xff09;或分布式拒绝服务&#xff08;DDoS&#xff09;攻击的形式。在此类攻击中&#xff0c;攻击者会发送大量的UDP流量到目标网络或服务器&#xff0c;以消耗其网络带宽或系统资源。由于…

爬虫工作量由小到大的思维转变---<第二十八章 Scrapy中间件说明书>

爬虫工作量由小到大的思维转变---&#xff1c;第二十六章 Scrapy通一通中间件的问题&#xff1e;-CSDN博客 前言: (书接上面链接)自定义中间件玩不明白? 好吧,写个翻译的文档点笔记,让中间件更通俗一点!!! 正文: 全局图: 爬虫中间件--->翻译笔记: from scrapy import s…

面试题之二HTTP和RPC的区别?

面试题之二 HTTP和RPC的区别&#xff1f; Ask范围&#xff1a;分布式和微服务 难度指数&#xff1a;4星 考察频率&#xff1a;70-80% 开发年限&#xff1a;3年左右 从三个方面来回答该问题&#xff1a; 一.功能特性 1)HTTP是属于应用层的协议&#xff1a;超文本传输协议…

【SpringCloud】-OpenFeign实战及源码解析、与Ribbon结合

一、背景介绍 二、正文 OpenFeign是什么&#xff1f; OpenFeign&#xff08;简称Feign&#xff09;是一个声明式的Web服务客户端&#xff0c;用于简化服务之间的HTTP通信。与Nacos和Ribbon等组件协同&#xff0c;以支持在微服务体系结构中方便地进行服务间的通信&#xff1b…

macos Apple开发证书 应用签名p12证书 获取生成方法 codesign 证书获取

在开发macos应用的时候必须要对自己开发的应用进行签名才能使用, 下面介绍个人如何获取Apple开发签名证书. 必备条件, 你需要先安装 xcode , 注册一个苹果开发者账号 免费的就可以, 以下为获取流程 You need to create a cert through xcode. Additionally, you need to have…

深信服技术认证“SCCA-C”划重点:云计算基础

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08…

[Angular] 笔记 10:服务与依赖注入

什么是 Services & Dependency Injection? chatgpt 回答&#xff1a; 在 Angular 中&#xff0c;Services 是用来提供特定功能或执行特定任务的可重用代码块。它们可以用于处理数据、执行 HTTP 请求、管理应用程序状态等。Dependency Injection&#xff08;依赖注入&#…

浅谈互联网架构演变

更好的阅读体验 \large{\color{red}{更好的阅读体验}} 更好的阅读体验 前言 可以将某个项目或产品的架构体系按照如下方式分层&#xff1a; 业务层面&#xff1a;项目业务体系技术层面&#xff1a; 数据架构&#xff1a;数据持久层策略应用架构&#xff1a;应用层的实现方式 …

AlignBench:量身打造的中文大语言模型对齐评测

对齐&#xff08;Alignment&#xff09;&#xff0c;是指大语言模型&#xff08;LLM&#xff09;与人类意图的一致性。换言之&#xff0c;就是让LLM生成的结果更加符合人类的预期&#xff0c;包括遵循人类的指令&#xff0c;理解人类的意图&#xff0c;进而能产生有帮助的回答等…

SadTalker数字人增加视频输出mp4质量精度

最近在用数字人简易方案&#xff0c;看到了sadtalker虽然效果差&#xff0c;但是可以作为一个快速方案&#xff0c;没有安装sd的版本&#xff0c;随便找了个一键安装包 设置如上 使用倒是非常简单&#xff0c;但是出现一个问题&#xff0c;就是输出的mp4都出马赛克了 界面上却…

Servlet见解2

4 创建servlet的三种方式 4.1 实现Servlet接口的方式 import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException;WebServlet("/test1") public class Servlet1 implements Servlet {Overridepublic void init(ServletConf…

怎么实现Servlet的自动加载

在实际开发时&#xff0c;有时候会希望某些Servlet程序可以在Tomcat启动时随即启动。但在默认情况下&#xff0c;第一次访问servlet的时候&#xff0c;才创建servlet对象。 如果servlet构造函数里面的代码或者init方法里面的代码比较多&#xff0c;就会导致用户第一次访问serv…

制作一个可以离线安装的Visual Studio安装包

须知 前提条件&#xff0c;需要电脑可以正常上网且网速还行&#xff0c;硬盘可以空间容量足够大&#xff0c;怎么判断容量够用&#xff1f;由组件数量的多少来决定。Visual Studio 频道和发布节奏 https://learn.microsoft.com/zh-cn/visualstudio/productinfo/release-rhythm…

简析SoBit 跨链桥图文教程

从BTC网络到Solana网络桥接BRC20 1.打开SoBit平台&#xff1a;在您的网络浏览器中启动SoBit Bridge应用程序。 2.连接您的钱包&#xff1a; 选择SoBit界面右上角的比特币网络来连接您的数字钱包。 3.选择源链、目标链和您想桥接的代币&#xff1a; 从下拉菜单中选择’BTC’作为…

讯飞星火认知大模型智能语音交互调用

随着国内外大模型热度的兴起&#xff0c;依托于大模型的智能化&#xff0c;传统的人机交互已经不能满足人们交互的需求。而结合语音和大模型的交互拜托传统互联网获取知识的文字限制&#xff0c;用语音也可以轻松获取想要的知识和思路。 一、大模型智能语音交互调用实现思路 …

华为ipv6配置之ospf案例

R1 ipv6 ospfv3 1 router-id 1.1.1.1 //必须要手动配置ospf id&#xff0c;它不会自动生成 interface GigabitEthernet0/0/0 ipv6 enable ipv6 address 2000::2/96 ospfv3 1 area 0.0.0.0 interface LoopBack0 ipv6 enable ipv6 address 2001::1/96 ospfv3 1 area 0.0.0.0 R2…