当前位置:   article > 正文

基于pytorch搭建多特征LSTM时间序列预测代码_lstm多特征 pytorch

lstm多特征 pytorch

这是一个基于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。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/168050?site
推荐阅读
相关标签
  

闽ICP备14008679号