赞
踩
这是一个基于PyTorch的简单多特征LSTM时间序列预测代码示例。假设我们有一个时间序列数据集,它有两个特征(feature1和feature2)。
python
复制代码
import torch
import torch.nn as nn
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
# 1. 数据预处理
# 假设我们有如下数据
data = np.array([
[1, 2],
[2, 3],
[3, 4],
[4, 5],
[5, 6]
])
# 添加偏移量以提高预测的准确性
data = data[:, :-1]
target = data[:, -1]
# 数据归一化
scaler = MinMaxScaler()
data = scaler.fit_transform(data)
target = scaler.transform(target.reshape(-1, 1))
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=42)
# 2. 构建模型
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(LSTM, self).__init__()
self.hidden_size = hidden_size
self.lstm = nn.LSTM(input_size, hidden_size)
self.linear = nn.Linear(hidden_size, output_size)
self.hidden = (torch.zeros(1, 1, self.hidden_size), torch.zeros(1, 1, self.hidden_size))
def forward(self, input):
lstm_out, self.hidden = self.lstm(input.view(len(input), 1, -1), self.hidden)
predictions = self.linear(lstm_out.view(len(input), -1))
return predictions[-1]
input_size = X_train.shape[1] # 特征数,这里是2,因为我们有两个特征:feature1和feature2
hidden_size = 10 # LSTM隐藏层大小,你可以根据需要调整这个值。
output_size = 1 # 输出维度,因为我们要预测一个值,所以这里是1。
model = LSTM(input_size, hidden_size, output_size) # 实例化模型
criterion = nn.MSELoss() # 损失函数,这里使用均方误差损失。
optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 优化器,这里使用Adam优化器。
# 3. 训练模型
for epoch in range(500): # 设置训练轮数,你可以根据需要调整这个值。
inputs = torch.from_numpy(X_train) # 将numpy数组转换为torch张量。
targets = torch.from_numpy(y_train) # 将numpy数组转换为torch张量。
outputs = model(inputs) # 前向传播。
loss = criterion(outputs, targets) # 计算损失。
optimizer.zero_grad() # 清零梯度。
loss.backward() # 反向传播。
optimizer.step() # 更新权重。
if (epoch+1) % 50 == 0: # 每50轮输出一次损失。
print('Epoch: {}/{} - Loss: {:.4f}'.format(epoch+1, 500, loss.item())) # 输出损失。
mse = mean_squared_error(y_test, outputs.detach().numpy()) # 使用测试集评估模型。
print('MSE: {:.4f}'.format(mse)) # 输出MSE。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。