📜  在Python中使用LSTM和PyTorch进行时间序列预测(1)

📅  最后修改于: 2023-12-03 15:23:26.322000             🧑  作者: Mango

在Python中使用LSTM和PyTorch进行时间序列预测

本文介绍如何使用LSTM(长短期记忆神经网络)和PyTorch(一个开源的深度学习框架)进行时间序列预测。时间序列预测是指对一系列时间上连续的数据进行预测。这种技术在金融、气象学和其他领域中有很广泛的应用。

什么是LSTM

LSTM是一种用于处理序列数据的人工神经网络模型。它是一种循环神经网络(RNN)的变体,可以更好地处理长期依赖性。

LSTM的关键是单元状态,它可以在时间上保持不变并且可以选择性地向外部输出。这使得LSTM可以学习长期依赖性关系,而不会受到“梯度消失”问题影响。

什么是PyTorch

PyTorch是一个开源的深度学习框架,由Facebook公司开发。它采用了动态图的机制,使得它能够更快地进行迭代和试错。

PyTorch还可以与NumPy非常好地集成,可以方便地进行数组操作,这使得它非常适合用于数据科学和机器学习。

如何使用LSTM和PyTorch进行时间序列预测

在这个示例中,我们将使用LSTM和PyTorch,对气温数据进行预测。我们将使用一个预测周期为12个月的小数据集。数据集包含了1981年到1990年期间每月的平均气温。

我们会使用PyTorch的torchtext模块来加载数据集。我们也会使用PyTorch的LSTM层。

以下是完整的代码片段:

# 导入必要的库

import torch
from torch import nn
from torch import optim
from torchtext.datasets import TimeSeries
from torchtext.data import Field, BucketIterator

# 定义Field

temperature = Field()

# 加载数据集

train, val, test = TimeSeries.splits(temperature, root='.data')

# 构建词汇表

temperature.build_vocab(train)

# 定义LSTM模型

class LSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim, batch_size, output_dim=1,
                 num_layers=2):
        super(LSTM, self).__init__()
        self.input_dim = input_dim
        self.hidden_dim = hidden_dim
        self.batch_size = batch_size
        self.num_layers = num_layers

        # LSTM层
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers)

        # 输出层
        self.linear = nn.Linear(hidden_dim, output_dim)

    def init_hidden(self):
        # 隐藏状态
        return (torch.zeros(self.num_layers, self.batch_size, self.hidden_dim),
                torch.zeros(self.num_layers, self.batch_size, self.hidden_dim))

    def forward(self, input):
        lstm_out, self.hidden = self.lstm(input.view(len(input), self.batch_size, -1))
        y_pred = self.linear(lstm_out[-1].view(self.batch_size, -1))
        return y_pred.view(-1)

# 设置超参数

input_dim = len(temperature.vocab)
hidden_dim = 32
batch_size = 64
num_layers = 2
epochs = 50
lr = 0.01

# 初始化模型和优化器

model = LSTM(input_dim, hidden_dim, batch_size, num_layers=num_layers)
optimizer = optim.Adam(model.parameters(), lr=lr)
loss_fn = nn.MSELoss()

# 构建Iterator

train_iter, val_iter, test_iter = BucketIterator.splits(
    (train, val, test), batch_sizes=(batch_size, batch_size, batch_size),
    sort=False, repeat=False)

# 训练模型

for epoch in range(epochs):
    model.train()
    train_loss = 0
    for batch in train_iter:
        x = batch.temperature
        y = x.clone()
        y[:-1] = x[1:]
        optimizer.zero_grad()
        hidden = model.init_hidden()
        y_pred = model(x)
        loss = loss_fn(y_pred, y)
        loss.backward()
        optimizer.step()
        train_loss += loss.item()

    model.eval()
    val_loss = 0
    with torch.no_grad():
        for batch in val_iter:
            x = batch.temperature
            y = x.clone()
            y[:-1] = x[1:]
            hidden = model.init_hidden()
            y_pred = model(x)
            loss = loss_fn(y_pred, y)
            val_loss += loss.item()

    print(f'Epoch: {epoch}, Train Loss: {train_loss:.3f}, Val Loss: {val_loss:.3f}')

# 测试模型

test_loss = 0
with torch.no_grad():
    for batch in test_iter:
        x = batch.temperature
        y = x.clone()
        y[:-1] = x[1:]
        hidden = model.init_hidden()
        y_pred = model(x)
        loss = loss_fn(y_pred, y)
        test_loss += loss.item()

print(f'Test Loss: {test_loss:.3f}')

在这个示例中,我们首先定义了一个Field,然后使用torchtext模块从文件中加载气温数据集。我们还使用temperature.build_vocab(train)来生成词汇表。

接下来,我们定义了一个LSTM模型,并使用PyTorch的优化器和损失函数来训练模型。我们使用train, val和test迭代器来训练,验证和测试模型。

最后,我们计算测试集上的损失。

总结

在这个教程中,我们介绍了LSTM和PyTorch,以及如何使用它们进行时间系列预测。我们使用PyTorch的torchtext模块加载数据集,并使用LSTM层,优化器和损失函数来训练模型。