使用TensorFlow和Keras在Python中构建时间序列神经网络

2025年01月15日 由 alex 发表 1464 0

神经网络擅长捕捉复杂的模式和关系。它们能够处理传统统计方法无法应对的非线性趋势和交互效应。其权衡之处在于,这一过程是一个黑箱——我们不知道预测结果为何如此,只知道它有效。


实现神经网络的方法有很多。


在这个项目中,我使用TensorFlow(Keras)构建了三种神经网络:基本的前馈神经网络、循环神经网络(RNN)和长短期记忆网络(LSTM)。指数平滑和ARIMA对于具有线性模式的数据非常有效,但传统方法在处理非线性关系时显得力不从心。神经网络能够建模时间依赖特征之间的复杂交互。神经网络还能处理多个输入(多元数据),这将提高预测的准确性。


此外,神经网络对数据的平稳性或预定义趋势没有假设。这意味着我们可以直接使用它们,而无需进行像Dickey-Fuller这样的测试。


用于时间序列的前馈神经网络

前馈神经网络可以通过使用滞后观测值作为输入特征来预测未来值。虽然这种方法较为基础,但它是时间序列预测的一个良好起点。


"""
Feedforward Neural Network for Simple Forecasting
"""
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# Generate synthetic data
np.random.seed(42)
time = np.arange(100)
data = 10 + 0.5 * time + np.sin(0.2 * time) + np.random.normal(scale=1.0, size=100)
# Create lagged features
def create_features(data, lag=3):
    X, y = [], []
    for i in range(len(data) - lag):
        X.append(data[i:i + lag])
        y.append(data[i + lag])
    return np.array(X), np.array(y)
lag = 3
X, y = create_features(data, lag=lag)
# Split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Normalize the data
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Build a simple feedforward neural network
model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu', input_shape=(lag,)),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.summary()
# Train the model
model.fit(X_train, y_train, epochs=50, batch_size=8, verbose=1, validation_split=0.1)
# Evaluate and predict
y_pred = model.predict(X_test)
mape = mean_absolute_percentage_error(y_test, y_pred)
# Plot results
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(y_test, label='Actual', color='Blue')
plt.plot(y_pred, label='Predicted', color='Red')
plt.title(f'Feedforward Neural Network Forecast \n MAPE: {mape:.3f}')
plt.legend()
plt.savefig("NN_forecast.png")
plt.show()


1


循环神经网络(RNN)

循环神经网络通过维持一个隐藏状态来处理序列数据,该隐藏状态捕捉了之前时间步的信息。这使得它们非常适合处理时间序列数据。


"""
Basic RNN for Time Series
"""
from tensorflow.keras.layers import SimpleRNN
# Build an RNN model
model = tf.keras.Sequential([
    SimpleRNN(50, activation='relu', input_shape=(lag, 1)),
    tf.keras.layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.summary()
# Reshape input for RNN (samples, timesteps, features)
X_train_rnn = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test_rnn = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
# Train the model
model.fit(X_train_rnn, y_train, epochs=50, batch_size=8, verbose=1, validation_split=0.1)
# Predict
y_pred_rnn = model.predict(X_test_rnn)
mape = mean_absolute_percentage_error(y_test, y_pred_rnn)
# Plot results
plt.figure(figsize=(10, 6))
plt.plot(y_test, label='Actual', color='Blue')
plt.plot(y_pred_rnn, label='Predicted', color='Red')
plt.title(f'Recurrent Neural Network Forecast \n MAPE: {mape:.3f}')
plt.legend()
plt.savefig("RNN_forecast.png")
plt.show()


2


长短期记忆(LSTM)网络

LSTM是一种RNN,解决了梯度消失问题。基本上,LSTM能够记住之前的值,这使得它们在处理具有长程模式的复杂时间序列时,相比其他神经网络具有优势。


"""
Long Short-Term Memory (LSTM) Networks for time series
"""
from tensorflow.keras.layers import LSTM
# Build an LSTM model
model = tf.keras.Sequential([
    LSTM(50, activation='relu', input_shape=(lag, 1)),
    tf.keras.layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.summary()
# Train the model
model.fit(X_train_rnn, y_train, epochs=50, batch_size=8, verbose=1, validation_split=0.1)
# Predict
y_pred_lstm = model.predict(X_test_rnn)
mape = mean_absolute_percentage_error(y_test, y_pred_lstm)
# Plot results
plt.figure(figsize=(10, 6))
plt.plot(y_test, label='Actual', color='Blue')
plt.plot(y_pred_lstm, label='Predicted', color='Red')
plt.title(f'LSTM Forecast. MAPE: {mape:.3f}')
plt.legend()
plt.savefig("LSTM_forecast.png")
plt.show()


3


这些图表说明了神经网络在匹配复杂时间序列方面的出色表现,但这种程度的模仿也引发了对过拟合的担忧。


我是直接使用TensorFlow来构建这些模型的。在时间序列领域,还有很多其他使用神经网络的方法,比如通过Darts库实现的N-BEATS。


现实世界数据:ERCOT负荷数据

最初我使用了模拟数据。但如果是真实数据呢?让我们使用来自德克萨斯州电网平衡管理机构ERCOT的数据。


4


RNN比基本神经网络效果好得多。


5


LSTM相比RNN并没有明显优势。


6


RNN和LSTM在建模这组数据方面都表现得非常出色。


那又怎样?

神经网络运算速度快,能够处理非线性模式和多元输入。TensorFlow(搭配Keras)使用起来非常方便。但神经网络可能会对数据过拟合,而且它们是一个“黑箱”,所以我们无法对模型本身进行分解。

文章来源:https://medium.com/@kylejones_47003/neural-networks-for-time-series-with-tensorflow-keras-in-python-0479918268f1
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消