自学内容网 自学内容网

【PyTorch】基于LSTM网络的气温预测模型实现

假设CSV文件名为temperature_data.csv,其前五行和标题如下:
在这里插入图片描述

这里,我们只使用Temperature列进行单步预测。以下是整合的代码示例:

import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

# 加载数据
data = pd.read_csv('temperature_data.csv')

# 选择Temperature列
temperatures = data['Temperature'].values.reshape(-1, 1)

# 数据归一化
scaler = MinMaxScaler()
temperatures = scaler.fit_transform(temperatures)

# 创建数据集函数
def create_dataset(data, time_step=1):
    dataX, dataY = [], []
    for i in range(len(data)-time_step-1):
        a = data[i:(i+time_step), 0]
        dataX.append(a)
        dataY.append(data[i + time_step, 0])
    return np.array(dataX), np.array(dataY)

# 定义时间步长
time_step = 5
X, y = create_dataset(temperatures, time_step)

# 重塑输入数据为[samples, time_step, features]
X = X.reshape(X.shape[0], X.shape[1], 1)

# 转换为PyTorch张量
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32)

# 定义LSTM模型
class LSTMModel(nn.Module):
    def __init__(self):
        super(LSTMModel, self).__init__()
        self.lstm = nn.LSTM(input_size=1, hidden_size=50, num_layers=1, batch_first=True)
        self.fc = nn.Linear(50, 1)

    def forward(self, x):
        output, (hn, cn) = self.lstm(x)
        y_pred = self.fc(output[:, -1, :])
        return y_pred

# 初始化模型、损失函数和优化器
model = LSTMModel()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
epochs = 100
for epoch in range(epochs):
    model.train()
    optimizer.zero_grad()
    outputs = model(X)
    loss = criterion(outputs, y.unsqueeze(2))
    loss.backward()
    optimizer.step()
    
    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item()}')

# 测试模型
model.eval()
with torch.no_grad():
    predicted = model(X)
    predicted = predicted.numpy().squeeze()

# 反归一化
predicted = scaler.inverse_transform(predicted.reshape(-1, 1))

# 绘制实际值和预测值
plt.figure(figsize=(10, 6))
plt.plot(y.numpy().squeeze(), label='Actual')
plt.plot(predicted, label='Predicted')
plt.title('Temperature Prediction')
plt.xlabel('Time Step')
plt.ylabel('Temperature')
plt.legend()
plt.show()

请注意,这段代码假设你已经有了一个名为temperature_data.csv的CSV文件,并且该文件位于你的工作目录中。此外,代码中的time_step变量可以根据需要调整,以改变模型预测的时间范围。这个例子中的模型是一个简单的LSTM网络,它可以根据前time_step个时间步的气温数据来预测下一个时间步的气温。


原文地址:https://blog.csdn.net/qq_33877849/article/details/140617525

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!