用Python实现时间序列模型实战——Day 22: LSTM 与 RNN 模型

一、学习内容
1. 长短期记忆网络 (LSTM) 的原理

LSTM(长短期记忆网络) 是一种专门用于处理时间序列数据的神经网络,它克服了传统 RNN 在处理长序列时出现的梯度消失问题。LSTM 通过引入 记忆单元门控机制(输入门、遗忘门、输出门)来选择性地保留或遗忘信息,从而更好地捕捉长期依赖性。

LSTM的主要公式

  • 遗忘门:决定当前单元状态应该遗忘多少过去的信息。

    f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)
  • 输入门:决定将多少新的信息写入到细胞状态。

    i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)
  • 候选记忆状态:将当前输入与过去的信息结合,用于更新细胞状态。

    \tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)
  • 输出门:决定输出多少细胞状态中的信息作为当前时刻的隐藏状态。

    o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)
  • 细胞状态更新

    C_t = f_t \cdot C_{t-1} + i_t \cdot \tilde{C}_t
  • 隐藏状态更新

    h_t = o_t \cdot \tanh(C_t)
2. 循环神经网络 (RNN) 的应用

RNN(循环神经网络) 是处理序列数据的基本模型,它通过连接到自身的隐状态,捕捉序列中的时间依赖性。然而,RNN 存在梯度消失问题,导致其在处理长序列时效果较差。

3. LSTM 与 RNN 的超参数调优
  • 学习率:控制模型更新的步长,过大或过小都会影响模型的训练效果。
  • 隐藏层神经元数量:影响模型的表达能力,神经元越多模型越复杂。
  • 序列长度:输入到模型的时间步长,过短可能无法捕捉长依赖,过长则增加计算复杂度。
  • 优化器:常用的优化器有 Adam、RMSprop 等,选择合适的优化器能够加速训练过程。
二、实战案例

我们将使用 tensorflow 构建 LSTM 和 RNN 模型,对时间序列数据进行预测。代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, SimpleRNN

# 1. 数据加载与预处理
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv'
data = pd.read_csv(url, header=0, parse_dates=['Month'], index_col='Month')

# 数据归一化处理
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data[['Passengers']])

# 生成输入序列
def create_sequences(data, seq_length):
    X, y = [], []
    for i in range(len(data) - seq_length):
        X.append(data[i:i+seq_length])
        y.append(data[i+seq_length])
    return np.array(X), np.array(y)

seq_length = 10
X, y = create_sequences(scaled_data, seq_length)

# 将数据集分为训练集和测试集
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

# 2. LSTM 模型构建
lstm_model = Sequential()
lstm_model.add(LSTM(50, activation='relu', input_shape=(X_train.shape[1], X_train.shape[2])))
lstm_model.add(Dense(1))
lstm_model.compile(optimizer='adam', loss='mse')

# 训练 LSTM 模型
lstm_model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0)

# 进行预测
lstm_preds = lstm_model.predict(X_test)
lstm_preds_rescaled = scaler.inverse_transform(lstm_preds)

# 3. RNN 模型构建
rnn_model = Sequential()
rnn_model.add(SimpleRNN(50, activation='relu', input_shape=(X_train.shape[1], X_train.shape[2])))
rnn_model.add(Dense(1))
rnn_model.compile(optimizer='adam', loss='mse')

# 训练 RNN 模型
rnn_model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0)

# 进行预测
rnn_preds = rnn_model.predict(X_test)
rnn_preds_rescaled = scaler.inverse_transform(rnn_preds)

# 4. 结果可视化
plt.figure(figsize=(12, 6))
plt.plot(data.index[-len(y_test):], scaler.inverse_transform(y_test.reshape(-1, 1)), label='Actual Passengers')
plt.plot(data.index[-len(y_test):], lstm_preds_rescaled, label='LSTM Predictions')
plt.plot(data.index[-len(y_test):], rnn_preds_rescaled, label='RNN Predictions')
plt.title('LSTM vs RNN Predictions on Airline Passengers Data')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()
三、代码解释
3.1 数据加载与预处理
  • 使用航空乘客数据集,并对数据进行归一化处理,方便 LSTM 和 RNN 模型训练。
  • 使用 create_sequences 函数生成输入序列和对应的目标值,时间步长为10。
3.2 LSTM 模型构建
  • LSTM 模型中使用50个隐藏层神经元,激活函数为 relu,并使用 Adam 优化器和均方误差损失函数。
  • 模型训练了100个 epochs。
3.3 RNN 模型构建
  • RNN 模型中使用简单循环单元(SimpleRNN),结构与 LSTM 类似。
3.4预测与结果可视化
  • 将模型的预测结果与真实的乘客数量进行对比,绘制图形。
四、结果输出

五、结果分析
  • 5.1 LSTM 预测

    • LSTM 模型能够很好地捕捉时间序列中的长期依赖性,预测曲线与实际值较为接近。
  • 5.2 RNN 预测

    • RNN 模型虽然能够捕捉短期依赖性,但在长时间序列数据上表现较差,预测结果可能会出现偏差。
六、总结

通过本次案例,我们学习了如何构建 LSTM 和 RNN 模型进行时间序列预测。LSTM 由于其记忆门机制,能够较好地捕捉长序列中的模式,而传统的 RNN 在处理长序列时容易出现梯度消失问题。通过调节超参数(如隐藏层神经元数量、学习率等),可以进一步优化模型的预测性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值