超全面讲透一个算法模型,LSTM!!

文摘   2024-11-07 16:36   北京  

大家好~

今儿和大家聊聊LSTM,以及关于 LSTM 的案例。在之前咱们详细的解释过关于LSTM的原理和公式推理,大家「点击这里」可以看到。

好了,下面,咱们简单介绍LSTM之后,给大家一个完整的案例~

1. LSTM 核心原理

长短期记忆网络(LSTM) 是一种特殊的循环神经网络(RNN)结构,能够有效处理长序列数据,避免普通RNN常见的梯度消失和梯度爆炸问题。LSTM的核心在于其“记忆单元”结构,能够在长时间跨度内保留和传递信息。

LSTM的记忆单元中包含三个“门”结构:

  1. 遗忘门(Forget Gate):控制是否保留前一时刻的信息,决定遗忘哪些信息。
  2. 输入门(Input Gate):决定是否更新当前时刻的信息,从而将有用信息加入记忆单元。
  3. 输出门(Output Gate):控制输出信息,决定记忆单元的哪部分信息用来作为输出。

这些门结构的引入帮助LSTM更好地对长时间序列信息进行学习,尤其适用于时间序列数据的预测。

2. 案例概述

咱们这里使用虚拟的气象数据集,实际数据集非常大,虚拟数据集便于大家学习算法原理。通过 LSTM 模型对未来的气象趋势(例如温度、湿度)进行预测。我们将生成虚拟气象数据,并对数据进行预处理,再通过LSTM进行建模,最后分析预测结果的表现。案例将涵盖数据可视化、数据预处理、LSTM模型的训练与预测,以及结果的多角度可视化分析。

3. 数据准备与预处理

数据集生成

我们将构建一个虚拟气象数据集,包含日期、气温、湿度、风速等指标。为了模拟实际的气象数据,我们将设置一段时间范围,生成每日报告数据。

数据预处理

  • 数据标准化:由于不同气象指标的取值范围不同,我们需要进行标准化处理,使得每个特征的数据在相同的尺度下训练。
  • 序列化数据:LSTM模型输入的是时间序列数据,因此我们需要将数据序列化,即使用过去若干天的数据预测未来的气象状况。

4. LSTM 模型构建与训练

我们将使用 PyTorch 实现 LSTM 模型,训练该模型以预测未来的气象数据。模型的训练包括前向传播和反向传播,通过不断调整模型参数来降低误差。

5. 数据分析

在本案例中,数据分析将包括以下图形:

  1. 时间序列趋势图:展示原始数据的趋势,例如温度和湿度的变化。
  2. 训练损失曲线:展示LSTM模型训练过程中损失值的变化趋势,以分析模型的收敛性。
  3. 预测结果与真实值对比图:对比模型预测结果与真实数据的差异。
  4. 误差分布图:分析预测误差的分布情况,以评估模型的稳定性。

6. 代码实现

以下代码包括数据生成、数据处理、LSTM 模型构建、训练及预测,并生成相关图形进行数据分析。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
from sklearn.preprocessing import MinMaxScaler
from torch.utils.data import DataLoader, TensorDataset

# 生成虚拟气象数据集
np.random.seed(42)
dates = pd.date_range(start="2023-01-01", end="2023-12-31")
temperature = np.sin(np.linspace(02 * np.pi, len(dates))) * 10 + 20 + np.random.normal(02, len(dates))
humidity = np.cos(np.linspace(02 * np.pi, len(dates))) * 20 + 60 + np.random.normal(05, len(dates))
wind_speed = np.abs(np.sin(np.linspace(04 * np.pi, len(dates)))) * 5 + np.random.normal(01, len(dates))

# 构建 DataFrame
df = pd.DataFrame({'Date': dates, 'Temperature': temperature, 'Humidity': humidity, 'WindSpeed': wind_speed})
df.set_index('Date', inplace=True)

# 数据标准化
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(df)

# 转换为时间序列格式
def create_sequences(data, seq_length):
    xs, ys = [], []
    for i in range(len(data) - seq_length):
        x = data[i:i+seq_length]
        y = data[i+seq_length][0]  # 预测温度
        xs.append(x)
        ys.append(y)
    return np.array(xs), np.array(ys)

seq_length = 30  # 使用过去30天的数据
X, y = create_sequences(data_scaled, seq_length)

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

# 构建数据加载器
batch_size = 16
train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

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

    def forward(self, x):
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
        out, _ = self.lstm(x, (h0, c0))
        out = self.fc(out[:, -1, :])
        return out

# 初始化模型、损失函数和优化器
input_size = X_train.shape[2]
hidden_size = 64
num_layers = 2
output_size = 1
model = LSTM(input_size, hidden_size, num_layers, output_size)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 训练模型
epochs = 100
losses = []

for epoch in range(epochs):
    for batch_x, batch_y in train_loader:
        outputs = model(batch_x)
        loss = criterion(outputs, batch_y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    losses.append(loss.item())
    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')

# 绘制训练损失曲线
plt.figure(figsize=(106))
plt.plot(losses, color="red")
plt.title("Training Loss Curve")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.show()

# 模型预测
model.eval()
with torch.no_grad():
    predictions = model(X_train).cpu().numpy()

# 可视化原始数据的趋势
plt.figure(figsize=(148))
plt.plot(df.index, df['Temperature'], label="Temperature", color="blue")
plt.plot(df.index, df['Humidity'], label="Humidity", color="green")
plt.title("Original Weather Data Trends")
plt.xlabel("Date")
plt.ylabel("Values")
plt.legend()
plt.show()

# 可视化预测结果和真实值对比
plt.figure(figsize=(148))
plt.plot(df.index[seq_length:], y, label="True Temperature", color="blue")
plt.plot(df.index[seq_length:], predictions, label="Predicted Temperature", color="orange")
plt.title("Prediction vs True Temperature")
plt.xlabel("Date")
plt.ylabel("Temperature")
plt.legend()
plt.show()

# 误差分布图
errors = y - predictions.flatten()
plt.figure(figsize=(106))
plt.hist(errors, bins=30, color="purple", alpha=0.7)
plt.title("Prediction Error Distribution")
plt.xlabel("Error")
plt.ylabel("Frequency")
plt.show()

在代码实现中,我们通过以下四个图表对数据进行了详细的分析:

1. 训练损失曲线:显示模型在每个迭代中的损失值变化,红色曲线展示了损失逐渐减少的趋势,表明模型逐渐收敛。

2. 原始数据趋势图:展示了气温、湿度随时间的变化,通过蓝色和绿色曲线分别代表气温和湿度,帮助理解数据的周期性。

3. 预测与真实值对比图:橙色线为预测气温,蓝色线为真实气温。该图用于观察预测的准确度和模型的泛化能力。

4. 误差分布图:显示误差的分布情况,使用紫色直方图展示误差集中于较小值的频率,评估模型的稳定性和可靠性。

以上案例完整地展示了一个基于LSTM的气象预测模型,从数据生成、预处理、模型训练、到结果分析均详细呈现,通过图形帮助理解气象预测模型的表现。

最后

通过这个案例,给大家展现了这种从零实现 GBDT 的过程能帮助你更好地理解梯度提升决策树的核心原理。
最近准备了16大块的内容,124个算法问题的总结,完整的机器学习小册,免费领取~
另外,今天给大家准备了关于「深度学习」的论文合集,往期核心论文汇总,分享给大家。
点击名片,回复「深度学习论文」即可~
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~

机器学习和人工智能AI
让我们一起期待 AI 带给我们的每一场变革!推送最新行业内最新最前沿人工智能技术!
 最新文章