时间序列预测实战(十五)PyTorch实现GRU模型长期预测并可视化结果

使用Pytorch从零开始构建GRU 门控循环单元(GRU),顾名思义,是RNN 架构的一种变体,它使用门控机制来控制和管理神经网络中单元之间的信息流。Cho 等人于 2014 年才引入 GRU。可以被认为是一种相对较新的架构,特别是与Sepp Hochreiter 和 Jürgen Schmidhuber于 1997 年提出的广泛采用的 LSTM 相比。GRU 的结构使其能够自适应地捕获大型数据序列的依赖性,而不会丢弃序列早期部分的信息。这是通过其门控单元实现的,类似于 LSTM 中的门控单元,它解决了传统 RNN 的梯度消失/爆炸问题。 阅读详情
AI摘要

本文以电力负荷数据集为例,深入介绍GRU在时间序列预测中的应用。讲解了GRU基本原理和框架,给出项目全部代码并详细解读。进行模型训练和预测,训练后损失小,但评估结果一般,存在数据滞后性问题,还推荐了其他时间序列实战案例博客。

往期回顾:时间序列预测专栏——包含上百种时间序列模型带你从入门到精通时间序列预测

一、本文介绍

本文讲解的实战内容是GRU(门控循环单元),本文的实战内容通过时间序列领域最经典的数据集——电力负荷数据集为例,深入的了解GRU的基本原理和框架,GRU是时间序列领域最常见的Cell之一,其相对于LSTM需要的参数量更少结构也更加简单,经常用于复杂的模型的过度单元,本文的讲解内容包括详细的代码讲解,带你一行一行的理解整个项目的流程,从而对整个项目有一个深入的了解,如果你是时间序列领域的新人,这篇文章可以带你入门时间序列领域并对时间序列的流程有一个详细的了解。

预测类型->单元预测、多元预测、长期预测

代码地址->文末提供复制粘贴即可运行的代码块

二、框架原理介绍

1.GRU的基本原理

GRU(门控循环单元)是一种循环神经网络(RNN)的变体,主要用于处理序列数据,它的基本原理可以概括如下:

  1. 门控机制:GRU的核心是门控机制,包括更新门(update gate)和重置门(reset gate)。这些门控制着信息的流动,即决定哪些信息应该被保留,哪些应该被遗忘。

  2. 更新门:更新门帮助模型决定过去的信息有多少需要保留到当前状态。它是通过当前输入和前一个隐状态计算得出的,用于调节隐状态的更新程度。

  3. 重置门:重置门决定了多少过去的信息需要被忘记。它同样依赖于当前输入和前一个隐状态的信息。当重置门接近0时,模型会“忘记”过去的隐状态,只依赖于当前输入。

  4. 当前隐状态的计算:利用更新门和重置门的输出,结合前一隐状态和当前输入,GRU计算出当前的隐状态。这个隐状态包含了序列到目前为止的重要信息。

  5. 输出:GRU的最终输出通常是在序列的每个时间步上产生的,或者在序列的最后一个时间步产生,取决于具体的应用场景。

总结:GRU相较于传统的RNN,其优势在于能够更有效地处理长序列数据,减轻了梯度消失的问题。同时,它通常比LSTM(长短期记忆网络)更简单,因为它有更少的参数。

1.1GRU的基本框架

​​

上面的图片为一个GRU的基本结构图,解释如下->

  • 更新门(z) 在决定是否用新的隐藏状态更新当前隐藏状态时扮演重要角色。
  • 重置门(r) 决定是否忽略之前的隐藏状态。

这些部分是GRU的核心组成,它们共同决定了网络如何在序列数据中传递和更新信息,这对于时间序列分析至关重要。

总结:这个 GRU真的是结构太简单了,没什么好讲解的,如果你是时间序列预测的新手这篇文章能够帮助你很好的入门时间序列并且能够对时间序列的整体流程有一个完整的了解,如果你是大神这边文章可能并不能给你带来太多的帮助。

三、数据集介绍

我们本文用到的数据集是官方的ETTh1.csv ,该数据集是一个用于时间序列预测的电力负荷数据集,它是 ETTh 数据集系列中的一个。ETTh 数据集系列通常用于测试和评估时间序列预测模型。以下是 ETTh1.csv 数据集的一些内容:

数据内容:该数据集通常包含有关电力系统的多种变量,如电力负荷、价格、天气情况等。这些变量可以用于预测未来的电力需求或价格。

时间范围和分辨率:数据通常按小时或天记录,涵盖了数月或数年的时间跨度。具体的时间范围和分辨率可能会根据数据集的版本而异。 

以下是该数据集的部分截图->

​​

四、项目的全部代码

import time
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
from matplotlib import pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from torch.utils.data import DataLoader
import torch
from torch.utils.data import Dataset

# 随机数种子
np.random.seed(0)


class TimeSeriesDataset(Dataset):
    def __init__(self, sequences):
        self.sequences = sequences

    def __len__(self):
        return len(self.sequences)

    def __getitem__(self, index):
        sequence, label = self.sequences[index]
        return torch.Tensor(sequence), torch.Tensor(label)


def calculate_mae(y_true, y_pred):
    # 平均绝对误差
    mae = np.mean(np.abs(y_true - y_pred))
    return mae

"""
数据定义部分
"""
true_data = pd.read_csv('ETTh1.csv')  # 填你自己的数据地址,自动选取你最后一列数据为特征列


target = 'OT'  # 添加你想要预测的特征列
test_size = 0.15  # 训练集和测试集的尺寸划分
train_size = 0.85  # 训练集和测试集的尺寸划分
pre_len = 4  # 预测未来数据的长度
train_window = 32  # 观测窗口

# 这里加一些数据的预处理, 最后需要的格式是pd.series
true_data = np.array(true_data[target])

# 定义标准化优化器
scaler_train = MinMaxScaler(feature_range=(0, 1))
scaler_test = MinMaxScaler(feature_range=(0, 1))

# 训练集和测试集划分
train_data = true_data[:int(train_size * len(true_data))]
test_data = true_data[-int(test_size * len(true_data)):]
print("训练集尺寸:", len(train_data))
print("测试集尺寸:", len(test_data))

# 进行标准化处理
train_data_normalized = scaler_train.fit_transform(train_data.reshape(-1, 1))
test_data_normalized = scaler_test.fit_transform(test_data.reshape(-1, 1))

# 转化为深度学习模型需要的类型Tensor
train_data_normalized = torch.FloatTensor(train_data_normalized)
test_data_normalized = torch.FloatTensor(test_data_normalized)


def create_inout_sequences(input_data, tw, pre_len):
    # 创建时间序列数据专用的数据分割器
    inout_seq = []
    L = len(input_data)
    for i in range(L - tw):
        train_seq = input_data[i:i + tw]
        if (i + tw + 4) > len(input_data):
            break
        train_label = input_data[i + tw:i + tw + pre_len]
        inout_seq.append((train_seq, train_label))
    return inout_seq


# 定义训练器的的输入
train_inout_seq = create_inout_sequences(train_data_normalized, train_window, pre_len)
test_inout_seq = create_inout_sequences(test_data_normalized, train_window, pre_len)

# 创建数据集
train_dataset = TimeSeriesDataset(train_inout_seq)
test_dataset = TimeSeriesDataset(test_inout_seq)

# 创建 DataLoader
batch_size = 32  # 你可以根据需要调整批量大小
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, drop_last=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, drop_last=True)


class GRU(nn.Module):
    def __init__(self, input_dim=1, hidden_dim=32, num_layers=1, output_dim=1, pre_len= 4):
        super(GRU, self).__init__()
        self.pre_len = pre_len
        self.num_layers = num_layers
        self.hidden_dim = hidden_dim
        # 替换 LSTM 为 GRU
        self.gru = nn.GRU(input_dim, hidden_dim,num_layers=num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim)
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.1)
    def forward(self, x):
        h0_gru = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(x.device)

        out, _ = self.gru(x, h0_gru)

        out = self.dropout(out)

        # 取最后 pre_len 时间步的输出
        out = out[:, -self.pre_len:, :]

        out = self.fc(out)
        out = self.relu(out)
        return out


lstm_model = GRU(input_dim=1, output_dim=1, num_layers=2, hidden_dim=train_window, pre_len=pre_len)
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(lstm_model.parameters(), lr=0.005)
epochs = 20
Train = True  # 训练还是预测

if Train:
    losss = []
    lstm_model.train()  # 训练模式
    for i in range(epochs):
        start_time = time.time()  # 计算起始时间
        for seq, labels in train_loader:
            lstm_model.train()
            optimizer.zero_grad()

            y_pred = lstm_model(seq)

            single_loss = loss_function(y_pred, labels)

            single_loss.backward()
            optimizer.step()
            print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')
        losss.append(single_loss.detach().numpy())
    torch.save(lstm_model.state_dict(), 'save_model.pth')
    print(f"模型已保存,用时:{(time.time() - start_time) / 60:.4f} min")


else:
    # 加载模型进行预测
    lstm_model.load_state_dict(torch.load('save_model.pth'))
    lstm_model.eval()  # 评估模式
    results = []
    reals = []
    losss = []

    for seq, labels in test_loader:
        pred = lstm_model(seq)
        mae = calculate_mae(pred.detach().numpy(), np.array(labels))  # MAE误差计算绝对值(预测值  - 真实值)
        losss.append(mae)
        for j in range(batch_size):
            for i in range(pre_len):
                reals.append(labels[j][i][0].detach().numpy())
                results.append(pred[j][i][0].detach().numpy())

    reals = scaler_test.inverse_transform(np.array(reals).reshape(1, -1))[0]
    results = scaler_test.inverse_transform(np.array(results).reshape(1, -1))[0]
    print("模型预测结果:", results)
    print("预测误差MAE:", losss)

    plt.figure()
    plt.style.use('ggplot')

    # 创建折线图
    plt.plot(reals, label='real', color='blue')  # 实际值
    plt.plot(results, label='forecast', color='red', linestyle='--')  # 预测值

    # 增强视觉效果
    plt.grid(True)
    plt.title('real vs forecast')
    plt.xlabel('time')
    plt.ylabel('value')
    plt.legend()
    plt.savefig('test——results.png')

五、模型代码的详细讲解

整个代码的流程我会从模型的入口参数定义开始进行讲解, 然后顺序讲解在直到模型的结束。

true_data = pd.read_csv('ETTh1.csv')  # 填你自己的数据地址,自动选取你最后一列数据为特征列

这一步就是读取你的数据了~不给大家讲了主要是csv的格式数据。 

target = 'OT'  # 添加你想要预测的特征列
test_size = 0.15  # 训练集和测试集的尺寸划分
train_size = 0.85  # 训练集和测试集的尺寸划分
pre_len = 4  # 预测未来数据的长度
train_window = 32  # 观测窗口

这一步就是参数定义的部分,讲解我已经再代码里标注了出来,需要说说的就是,pre_len和train_window这两个参数,

其中pre_len就是你预测未来数据的长度,假设你有一百条数据你想知道未来多少条数据的信息就填多少。 

train_window是数据的观测窗口,就是你利用多少条数据去预测你定义的pre_len长度。

# 这里加一些数据的预处理, 最后需要的格式是pd.series
true_data = np.array(true_data[target])

这是提取出特征列,根据前面你定义的target。 

# 定义标准化优化器
scaler_train = MinMaxScaler(feature_range=(0, 1))
scaler_test = MinMaxScaler(feature_range=(0, 1))

# 训练集和测试集划分
train_data = true_data[:int(train_size * len(true_data))]
test_data = true_data[-int(test_size * len(true_data)):]
print("训练集尺寸:", len(train_data))
print("测试集尺寸:", len(test_data))

# 进行标准化处理
train_data_normalized = scaler_train.fit_transform(train_data.reshape(-1, 1))
test_data_normalized = scaler_test.fit_transform(test_data.reshape(-1, 1))

# 转化为深度学习模型需要的类型Tensor
train_data_normalized = torch.FloatTensor(train_data_normalized)
test_data_normalized = torch.FloatTensor(test_data_normalized)

这部分是定义优化器,我们的深度学习模型输入一般都是-1到1(虽然这不是必须的,但是如果你不进行标准化处理效果真是天差地别),然后是测试集和训练集的划分,和根据数据进行标准化处理的操作,并且将数据转化为tensor的格式(tensor是我们深度学习特有的数据格式)。

# 定义训练器的的输入
train_inout_seq = create_inout_sequences(train_data_normalized, train_window, pre_len)
test_inout_seq = create_inout_sequences(test_data_normalized, train_window, pre_len)

这一部分是重点!!!!!

时间序列的数据和其他领域的不一样他需要滑窗的数据形式,假设我有100条数据,前面定义的滑窗大小是32预测未来数据的长度是4那么他就会用32和4去滑动数据,

所以我们的到数据是多少呢就是100 - 32 - 4 =54条数据(每条数据包含32条观测数据和4个标签数据),这里必须理解大家这是时间序列的基础,他是不能够直接用Dataloader进行数据加载的。

# 创建数据集
train_dataset = TimeSeriesDataset(train_inout_seq)
test_dataset = TimeSeriesDataset(test_inout_seq)

# 创建 DataLoader
batch_size = 32  # 你可以根据需要调整批量大小
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, drop_last=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, drop_last=True)

这部分是创建数据集和Dataloader数据加载器,利用Dataloader的好处是可以避免内存爆炸,但是我们时间序列的数据一般都不大不会有这种情况。

class GRU(nn.Module):
    def __init__(self, input_dim=1, hidden_dim=32, num_layers=1, output_dim=1, pre_len= 4):
        super(GRU, self).__init__()
        self.pre_len = pre_len
        self.num_layers = num_layers
        self.hidden_dim = hidden_dim
        # 替换 LSTM 为 GRU
        self.gru = nn.GRU(input_dim, hidden_dim,num_layers=num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim)
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.1)
    def forward(self, x):
        h0_gru = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(x.device)

        out, _ = self.gru(x, h0_gru)

        out = self.dropout(out)

        # 取最后 pre_len 时间步的输出
        out = out[:, -self.pre_len:, :]

        out = self.fc(out)
        out = self.relu(out)
        return out

这是模型的内部,就是一个简单的gru模型,我来说一下其中的通道数情况,我们输入的X是三维的分别是[batch_size, train_window, target数量], 这是我们输入x的情况,经过gru进行处理我们添加了一个dropout避免过拟合,然后取出了你想要预测长度的步长数据,最后经过全连接层进行一个结果输出,大家有兴趣建议还是debug一下我这么讲你是不能理解的,最好还是实际动手debug看一下其中的通道数变化情况。

lstm_model = GRU(input_dim=1, output_dim=1, num_layers=2, hidden_dim=train_window, pre_len=pre_len)
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(lstm_model.parameters(), lr=0.005)
epochs = 20
Train = True  # 训练还是预测

这里实例化了我们的模型,定义了MSE损失函数,和优化器Adam和训练轮次,其中的Train是来判断是否进行训练。

if Train:
    losss = []
    lstm_model.train()  # 训练模式
    for i in range(epochs):
        start_time = time.time()  # 计算起始时间
        for seq, labels in train_loader:
            lstm_model.train()
            optimizer.zero_grad()

            y_pred = lstm_model(seq)

            single_loss = loss_function(y_pred, labels)

            single_loss.backward()
            optimizer.step()
            print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')
        losss.append(single_loss.detach().numpy())
    torch.save(lstm_model.state_dict(), 'save_model.pth')
    print(f"模型已保存,用时:{(time.time() - start_time) / 60:.4f} min")

 如果Train为True则开始训练执行上面的代码,这是一个标准pytorch框架下的训练过程就不给大家 说了,如果不能理解的话大家可以去补补基础,或者评论区问我我在给大家讲讲。

else:
    # 加载模型进行预测
    lstm_model.load_state_dict(torch.load('save_model.pth'))
    lstm_model.eval()  # 评估模式
    results = []
    reals = []
    losss = []

    for seq, labels in test_loader:
        pred = lstm_model(seq)
        mae = calculate_mae(pred.detach().numpy(), np.array(labels))  # MAE误差计算绝对值(预测值  - 真实值)
        losss.append(mae)
        for j in range(batch_size):
            for i in range(pre_len):
                reals.append(labels[j][i][0].detach().numpy())
                results.append(pred[j][i][0].detach().numpy())

如果Train为False时候则开始进行评估模式我们利用test的数据集进行测试评估训练模型,

 reals = scaler_test.inverse_transform(np.array(reals).reshape(1, -1))[0]
    results = scaler_test.inverse_transform(np.array(results).reshape(1, -1))[0]
    print("模型预测结果:", results)
    print("预测误差MAE:", losss)

    plt.figure()
    plt.style.use('ggplot')

    # 创建折线图
    plt.plot(reals, label='real', color='blue')  # 实际值
    plt.plot(results, label='forecast', color='red', linestyle='--')  # 预测值

    # 增强视觉效果
    plt.grid(True)
    plt.title('real vs forecast')
    plt.xlabel('time')
    plt.ylabel('value')
    plt.legend()
    plt.savefig('test——results.png')

 这一部分是我们预测值和真实值之间的对比,来确定我们预测的好坏,后面的结果分析会有展示。

六、模型的训练和预测

上面我把大多数的代码都讲了一便大家应该对整个过程有一个大致的了解下面来大家进行训练看看模型的结果。

6.1模型的训练

我们将我前面提供的全部代码块复制粘贴到随便一个.py的文件内然后将数据集和特征数填写进去,就可以开始训练模型了。

训练的过程中控制台会输出训练结果和损失,可以看到刚开始我们的损失非常的大,到训练结束之后我们的损失如下会变的非常小。

​​

 可以看到我们的模型损失只有0.010.5901一个批次下可以说模型的拟合效果是非常的好,我们下面来看一下模型的损失图像,可以看到我们模型拟合速度比较一般在20个epoch左右在完全拟合。

​

6.2模型的评估

经过训练之后我们可以开始进行模型的评估了。

6.2.1结果展示

下面的图片是模型的评估结果,其中评估数据大概有800条左右,评估了大概八百条数据,结果只能说太一般了。

6.2.2结果分析

这个模型结果只能说在意料之中,大家看其中的图像可以看到明显的数据滞后性,这一问题我在前面利用过ARIMA-LSTM进行解决进行了完美的解决,大家有兴趣可以去回去评估一下,这单个GRU模型结果在这样只能说是正常的情况。

全文总结

到此本文已经全部讲解完成了,希望能够帮助到大家,在这里也给大家推荐一些我其它的博客的时间序列实战案例讲解,其中有数据分析的讲解就是我前面提到的如何设置参数的分析博客,最后希望大家订阅我的专栏,本专栏均分文章均分98,并且免费阅读。

概念理解 

15种时间序列预测方法总结(包含多种方法代码实现)

数据分析

时间序列预测中的数据分析->周期性、相关性、滞后性、趋势性、离群值等特性的分析方法

机器学习——难度等级(⭐⭐)

时间序列预测实战(四)(Xgboost)(Python)(机器学习)图解机制原理实现时间序列预测和分类(附一键运行代码资源下载和代码讲解)

深度学习——难度等级(⭐⭐⭐⭐)

时间序列预测实战(五)基于Bi-LSTM横向搭配LSTM进行回归问题解决

时间序列预测实战(七)(TPA-LSTM)结合TPA注意力机制的LSTM实现多元预测

时间序列预测实战(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)

时间序列预测实战(十一)用SCINet实现滚动预测功能(附代码+数据集+原理介绍)

时间序列预测实战(十二)DLinear模型实现滚动长期预测并可视化预测结果

Transformer——难度等级(⭐⭐⭐⭐)

时间序列预测模型实战案例(八)(Informer)个人数据集、详细参数、代码实战讲解

时间序列预测模型实战案例(一)深度学习华为MTS-Mixers模型

时间序列预测实战(十三)定制化数据集FNet模型实现滚动长期预测并可视化结果

时间序列预测实战(十四)Transformer模型实现长期预测并可视化结果(附代码+数据集+原理介绍)

个人创新模型——难度等级(⭐⭐⭐⭐⭐)

时间序列预测实战(十)(CNN-GRU-LSTM)通过堆叠CNN、GRU、LSTM实现多元预测和单元预测

传统的时间序列预测模型(⭐⭐)

时间序列预测实战(二)(Holt-Winter)(Python)结合K-折交叉验证进行时间序列预测实现企业级预测精度(包括运行代码以及代码讲解)

时间序列预测实战(六)深入理解ARIMA包括差分和相关性分析

融合模型——难度等级(⭐⭐⭐)

时间序列预测实战(九)PyTorch实现融合移动平均和LSTM-ARIMA进行长期预测

​​​

pytorch实现GRU(附code) 接上一篇文章(pytorch实现LSTM),在实现LSTM之后,又发现了GRU网络。 说GRU是LSTM网络的一种效果很好的变体,它较LSTM网络的结构更加简单,而且效果也很好,也是当前非常流形的一种网络。 所以决定尝试一下! 注:数据集仍然使用上文中的IGBT加速老化数据集,数据与处理方法不变,直接上代码!!! 在保证输入样本参数和学习率不变的情况下,即input_size = 5,out_oput = 1,lr = 0.01,试了很多参数,发现在训练集80%,测试集20%,hidden_size 阅读详情

相关推荐

从代码学习深度学习 - GRU PyTorch版

在深度学习领域,循环神经网络(RNN)及其变种如GRU(Gated Recurrent Unit,门控循环单元)在处理序列数据时表现出色。相比传统RNN,GRU通过更新门(Update Gate)和重置门(Reset Gate)简化了结构,同时保持了对长期依赖关系的建模能力。本篇博客将通过PyTorch实现一个基于GRU的文本生成模型,结合《The Time Machine》数据集,逐步解析代码实现的全过程。从数据预处理到模型训练,再到结果可视化,我们将深入探讨每个模块的功能,并展示完整的代码实现。

weixin_43887510的博客 1262

PyTorch nn.GRU 使用详解

我们看官方文档一些参数介绍,以及如下一个简单例子: 看完之后,还是一脸懵逼: 输入什么鬼? 输出又什么鬼? (这里我先把官网中 h0 去掉了,便于大家先理解更重要的概念) import torch from torch import nn rnn = nn.GRU(10, 20, 2) input = torch.randn(5, 3, 10) output, hn = rnn(input) 运行之后,各变量的shape如下: 要使用GRU这个layer,就要明白,要先定义GRU,然后才是调用这个定义

周迪新的博客 4万+

GRU实现时间序列预测(PyTorch版)

本篇文章我们采用了经典的循环神经网络GRU来对我们的时序数据建模处理,作为该专栏的第一篇文章,本篇将详细介绍项目的每个实现部分以及细节处理,帮助新手小白快速建立起如何处理时序数据的框架。

优快云 精品推荐 6万+

深度学习笔记——pytorch实现双向GRU(BiGRU)

参考视频。

weixin_45978839的博客 4846

基于GRU实现股价多变量时间序列预测(PyTorch版)

本文通过对GRU时间序列模型的介绍,探讨StackedGRU在股市科技股中的表现。本研究文章的结构如下。第一节介绍金融时间序列数据。第二节对金融时间数进行特征工程。第三节是构建模型、定义参数空间、损失函数与优化器。第四节是训练模型。第五节是评估模型与结果可视化。第六部分是预测下一个时间点的收盘价。

时序笔记 2301

基于BiLSTM 实现股价多变量时间序列预测(PyTorch版)

在本文中,我们将探讨如何使用PyTorch框架实现基于双向长短期记忆网络(BiLSTM)的多变量时间序列预测模型。多变量时间序列预测涉及多个输入变量和一个或多个输出变量,这些变量随时间变化并可能相互影响。通过利用BiLSTM的双向特性,我们的模型将能够同时考虑历史数据和未来趋势,从而更准确地预测时间序列的未来值。

时序笔记 2412

时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)

本文给大家带来的实战内容是利用PyTorch实现LSTM-GRU模型,LSTM和GRU都分别是RNN中最常用Cell之一,也都是时间序列预测中最常见的结构单元之一,本文的内容将会从实战的角度带你分析LSTM和GRU的机制和效果,同时如果你是时间序列中的新手,这篇文章会带你了解整个时间序列的建模过程,同时本文的实战代码支持多元预测单元、单元预测单元、多元预测多元(为我个人编写大家如有转载请标明来源),本文的实战内容通过时间序列领域最经典的数据集——电力负荷数据集为例进行预测。内容回顾->

Snu77的博客 1万+

GRU模型实现时间序列预测

在时间序列预测任务中,我们通常使用均方误差(Mean Squared Error,MSE)作为损失函数,并使用随机梯度下降(Stochastic Gradient Descent,SGD)或Adam优化器来更新模型参数。现在,我们可以开始训练我们的GRU模型了。在时间序列预测任务中,我们通常将前一段时间的数据作为输入,预测下一个时间步的数值作为输出。训练完成后,我们可以使用训练好的模型对测试集进行预测,并评估模型的性能。最后,我们可以使用训练好的模型对未来的时间步进行预测,并可视化预测结果。

KsClang的博客 722

时间序列预测实战(十六)PyTorch实现GRU-FCN模型长期预测并可视化结果

本文讲解的实战内容是GRU-FCN(门控循环单元-全卷积网络),这是一种结合了GRU(用于处理时间序列数据)和FCN(全卷积网络)的深度学习模型,这种融合模型在处理时间序列预测的时候是十分经典且效果很好的组合方式。它的优势在于能够同时捕捉时间序列数据中的时间动态和空间特征,从而提高模型的准确度和效率,本文给大家讲解的就是这个模型,本文的实战内容通过时间序列领域最经典的数据集——电力负荷数据集为例,带大家深入的了解GRU和FCN的基本原理和融合思想。预测类型->单元预测、长期预测,

Snu77的博客 3950

基于LSTM-Transformer混合模型实现股票价格多变量时序预测(PyTorch版)

本文提出了一种结合LSTM和Transformer的混合模型用于股票价格多变量时序预测。该方法通过LSTM处理局部时序特征,同时利用Transformer捕捉长期依赖关系。实验采用亚马逊股票数据集,包含开盘价、最高价、最低价和收盘价等特征。数据预处理阶段使用MinMaxScaler进行归一化,并将时间序列转换为监督学习格式。模型通过PyTorch实现,综合评估指标包括MAE、MAPE和R2等。结果表明,该混合模型能有效提升股票价格预测精度,为金融时序分析提供了新的解决方案。代码实现完整展示了从数据加载、特征

时序笔记 1万+

Python实现基于CNN-GRU卷积门控循环单元进行时间序列预测的详细项目实例

本项目实现了一个基于CNN-GRU(卷积门控循环单元)混合神经网络的时间序列预测系统。该系统通过结合CNN局部特征提取能力和GRU的长期时序依赖建模优势,提高了对复杂时间序列的预测精度。 主要技术亮点包括: 创新性地融合CNN和GRU结构,充分利用两种网络的优势 实现了完整的数据预处理流程,包括缺失值处理、异常值检测和归一化 采用滑动窗口技术生成训练样本,支持多步预测 设计了正则化和早停机制防止过拟合 提供多种评估指标和可视化功能 开发了GUI界面便于用户操作 项目可广泛应用于: 金融市场预测 能源负荷预测

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 1528

时间序列预测实战(二十六)PyTorch实现Seq2Seq(LSTM)(结果可视化+自动保存结果)

本文给大家带来的时间序列模型是Seq2Seq,这个概念相信大家都不陌生了,网上的讲解已经满天飞了,但是本文给大家带来的是我在Seq2Seq思想上开发的一个模型和新的架构,其是专门为新手开发的,而且为了方便大家使用只定义了一个文件方便大家复制粘贴,架构功能包括:结果可视化、支持单元预测、多元预测、模型拟合效果检测、预测未知数据、以及滚动长期预测功能。Seq2Seq模型是一种处理序列数据的深度学习思想,广泛用于机器翻译、语音识别和文本摘要等任务(也能用于时间序列)。其核心思想是编码器-解码器。

Snu77的博客 1万+

MLX90640 热成像 STM32

MLX90640 热成像

zhaocundang's blog 5007

时间序列预测实战(二十五)PyTorch实现Seq2Seq进行多元和单元预测(附代码+数据集+完整解析)

本文给大家带来的时间序列模型是Seq2Seq,这个概念相信大家都不陌生了,网上的讲解已经满天飞了,但是本文给大家带来的是我在Seq2Seq思想上开发的一个模型和新的架构,架构前面的文章已经说过很多次了,其是专门为新手开发的,而且为了方便大家使用只定义了一个文件方便大家复制粘贴,架构功能包括:结果可视化、支持单元预测、多元预测、模型拟合效果检测、预测未知数据、以及滚动长期预测功能。Seq2Seq模型是一种处理序列数据的深度学习模型,广泛用于机器翻译、语音识别和文本摘要等任务(也能用于时间序列)。

Snu77的博客 9939

RK3588上rknn_toolkit_lite2报错解决:手把手教你更新librknnrt.so的正确姿势

本文针对在RK3588平台上使用rknn_toolkit_lite2时遇到的“Invalid RKNN model version”等常见错误,提供了完整的诊断与解决方案。文章深入剖析了RKNN生态系统各组件(如librknnrt.so、RKNN Server)版本不兼容的根源,并手把手指导如何安全、正确地更新librknnrt.so运行时库,确保AI模型在RK3588 NPU上实现高效推理。

weixin_29189003的博客 521

W5500以太网模块官方驱动移植

W5500驱动移植

weixin_42621095的博客 4131

时间序列预测实战(二十四)PyTorch实现RNN进行多元和单元预测(附代码+数据集+完整解析)

本篇文章给大家带来的是利用我个人编写的架构进行RNN时间序列卷积进行时间序列建模(专门为了时间序列领域新人编写的架构,简单且不同于市面上大家用GPT写的代码),包括结果可视化、支持单元预测、多元预测、模型拟合效果检测、预测未知数据、以及滚动长期预测功能。该结构是一个通用架构任何模型嵌入其中都可运行。下面来介绍一下RNN:循环神经网络(RNN)是深度学习中用于处理序列数据的一种基本网络结构。RNN的核心原理是它拥有一个循环结构这使得网络能够保持一个内部的状态,从而捕捉到数据中随时间演变的信息。

Snu77的博客 1万+

从波形到代码:手把手调试GaN图腾柱PFC的过零点切换与软启动策略

本文详细解析了GaN图腾柱无桥Boost PFC电路在过零点切换与软启动策略中的调试方法。通过波形分析、代码实现和寄存器配置,提供了解决误开通、震荡波形等问题的实用方案,帮助工程师优化电源设计效率与可靠性。

weixin_30831529的博客 424

多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型

本文基于前期介绍的风速数据(文末附数据集),介绍一种基于TCN-GRU网络模型的多特征变量序列预测模型。TCN-GRU模型是一种结合了 Temporal Convolutional Network (TCN) 和 Gated Recurrent Unit (GRU) 的深度学习模型,用于时间序列预测任务。该模型结合了卷积神经网络的并行化计算和循环神经网络的记忆性能,能够有效地捕捉时间序列数据中的长期依赖关系,以提高时间序列数据的预测性能。

2730

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 605

华为OD机考双机位C卷 - AI处理器组合 (Java & Python & JS & GO & C++ & C)

> 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录点击查看: [【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)](https://blog.youkuaiyun.com/banxia_frontend/article/details/155503868)

算法大师! 233

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型

本文基于前期介绍的风速数据(文末附数据集),先经过经验模态EMD分解,然后通过数据预处理,制作和加载数据集与标签,最后通过Pytorch实现EMD-CNN-GRU并行模型对风速数据的预测。

1225

【麒麟桌面系统】企业微信提示当前副设备的企业微信版本较低

银河麒麟系统中登录企业微信时出现"副设备版本较低"的报错,可通过两种方案解决:1)更新最新版企业微信,需替换软件源并刷新软件商店安装8.0-50-4.1.26.6019kylin5版本;2)安装内测5.0版本企业微信,需下载deb包后使用sudo dpkg命令安装。文章还提供了常见问题解决表和长期维护建议,包括系统更新检查、软件源验证等维护项目及具体操作指南。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2276

Python用GRU神经网络模型预测比特币价格时间序列数据2案例可视化|附代码数据...

全文链接:https://tecdat.cn/?p=36389门控循环单元(GRU)是一种循环神经网络(RNN)类型,旨在有效地捕获序列数据中的长期依赖关系。它是传统RNN的扩展,与长短期记忆(LSTM)网络具有相似性(点击文末“阅读原文”获取完整代码数据)。相关视频我们将简要了解GRU模型以及如何帮助客户在PyThon中使用GRU实现序列数据预测。GRU简介GRU背后的核心思想是解决梯度消失问题...

拓端研究室TRL 1143

(王道408考研操作系统)第一章计算机系统概述-第三节2:中断和异常

注意!!! 本节内容和《计算机组成原理》中的中断有重合,如果需要详细了解的话可以点击链接跳转:(计算机组成原理)第七章输入和输出系统-第四节2:I/O方式之程序中断方式 为了内容完整,部分内容会借用上述文章 文章目录一:中断和异常的基本概念(1)中断和异常的定义 一:中断和异常的基本概念 在操作系统引入核心态和用户态这两种工作状态后,就需要考虑两种状态之间是如何切换的。 操作系统内核工作在核心态,用户程序工作在用户态,系统不允许用户程序使用核心态的功能,但是用户程序为了完成某些操作又必须使用这些功能

快乐江湖的博客 3535

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

<span class=“js_title_inner“>Python用GRU神经网络模型预测比特币价格时间序列数据2案例可视化|附代码数据</span>

在这个模型中,我们首先定义了一个 Sequential 模型,然后添加了两个 GRU 层,每个 GRU 层后面都跟随了一个 Dropout 层。第二层 GRU 的隐藏单元数增加到了 2048,并且两个 Dropout 层的丢弃率分别设置为 0.9 和 0.8,用于在训练过程中随机丢弃一部分神经元的输出,以减少过拟合的风险。对于图中的每个节点(即每个神经元),我们设定了固定的尺寸(fixedsize=true),并使用了填充颜色(fillcolor)和形状(shape=circle)。

拓端研究室TRL 699

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 时间序列预测实战(十三)利用FNet模型实现滚动长期预测并可视化结果
下一篇: 时间序列预测实战(十六)PyTorch实现GRU-FCN模型长期预测并可视化结果
Snu77
Snu77 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域
博客等级 码龄5年 11万+粉丝 934原创
评论 44
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snu77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值