##19 序列与时间序列预测:运用RNN和LSTM在PyTorch中的实践


前言

随着数据的爆炸式增长,时间序列预测在多个领域内变得越来越重要。它能帮助我们分析过去、理解现在并预测未来。在本文中,我将深入探讨如何使用循环神经网络(RNN)和长短期记忆网络(LSTM)进行时间序列分析,具体实现将利用PyTorch框架。
在这里插入图片描述

时间序列预测的基本概念

时间序列预测指的是利用历史数据序列来预测未来某个时间点的值。不同于普通的回归问题,时间序列数据的特点是序列间存在时间上的依赖关系。

关键概念

  • 时间序列:按照时间顺序排列的数据点集合。
  • 趋势:时间序列的长期进展方向。
  • 季节性:时间序列显示的周期性波动。
  • 噪声:时间序列中不规则的、不可预测的波动。

RNN及其局限性

循环神经网络(RNN)是处理序列数据的一类神经网络,它通过循环的连接来传递信息,使得网络能够记忆之前的信息。然而,RNN也有其局限性,例如难以捕捉长期依赖关系,主要是因为梯度消失或梯度爆炸问题。

LSTM网络的崛起

为了克服RNN的短板,LSTM网络应运而生。LSTM通过引入三个门(遗忘门、输入门和输出门)和单元状态,能够有效地保留长期信息,缓解了梯度消失问题。

用PyTorch进行时间序列预测

接下来,我们将通过一个实例来具体展示如何使用PyTorch来完成一个时间序列预测的任务。

准备数据集

我们首先需要一个时间序列数据集。在这个例子中,假设我们已经有了一组股票市场的历史价格数据。

import pandas as pd
import numpy as np

# 载入数据集
data = pd.read_csv('stock_prices.csv', parse_dates=True, index_col='Date')

# 显示数据的前五行
print(data.head())

数据预处理

在开始模型构建之前,我们需要对数据进行预处理,包括归一化处理和划分训练集和测试集。

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(-1, 1))
scaled_data = scaler.fit_transform(data.values.reshape(-1, 1))

# 划分训练集和测试集
train_data = scaled_data[:int(len(scaled_data)*0.8)]
test_data = scaled_data[int(len(scaled_data)*0.8):]

创建数据加载器

在PyTorch中,我们使用TensorDatasetDataLoader来创建数据加载器,它能够在训练时提供批次数据。

import torch
from torch.utils.data import TensorDataset, DataLoader

def 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_seq

seq_length = 5
train_inout_seq = create_inout_sequences(train_data, seq_length)

train_dataset = TensorDataset(torch.FloatTensor(train_inout_seq))
train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)

构建LSTM模型

接下来,我们创建一个LSTM模型类。

import torch.nn as nn

class LSTM(nn.Module):
    def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):
        super().__init__()
        self.hidden_layer_size = hidden_layer_size

        self.lstm = nn.LSTM(input_size, hidden_layer_size)

        self.linear = nn.Linear(hidden_layer_size, output_size)

        self.hidden_cell = (torch.zeros(1,1,self.hidden_layer_size),
                            torch.zeros(1,1,self.hidden_layer_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)

训练模型

现在我们可以开始训练模型了。

epochs = 150

for i in range(epochs):
    for seq, labels in train_loader:
        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()

    if i%25 == 1:
        print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')

测试和评估模型

在训练结束后,我们应该在测试集上评估模型的性能。

model.eval()
test_inputs = train_data[-seq_length:].tolist()

for i in range(len(test_data)):
    seq = torch.FloatTensor(test_inputs[-seq_length:])
    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[seq_length:] ).reshape(-1, 1))

结语

时间序列预测是一个复杂但极具价值的领域。在本文中,我们介绍了利用PyTorch和LSTM网络进行时间序列预测的基本步骤。通过适当的数据预处理、模型设计和参数调整,我们能够构建出强大的预测模型来解决现实世界中的问题。这只是时间序列预测的冰山一角,更多高级技术和方法在等待着有志之士去探索和实践。

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值