登录
首页大数据时代如何进行多变量LSTM时间序列预测未来一周的数据?
如何进行多变量LSTM时间序列预测未来一周的数据?
2023-04-07
收藏

随着时间序列分析的普及,LSTM 成为了深度学习中最常用的工具之一。它以其优异的性能和对数据的自适应特征提取而闻名。然而,在实际应用中,我们通常需要通过多变量来预测未来时间序列数据。本文将介绍如何使用多变量 LSTM 模型来进行时间序列预测,并且给出一个例子来预测未来一周的气温。

首先,我们需要准备数据集。在本例中,我们将使用包含多个变量的天气数据。这些变量包括温度、湿度、风速、降雨量等。我们将选取最近一年的数据,将其前80%作为训练集,后20%作为测试集。

接下来,我们需要对数据进行归一化处理。由于不同变量之间的值域差异较大,我们需要将其进行缩放到一个相同的范围内。这里我们将使用 Scikit-Learn 库中的 MinMaxScaler 函数。

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
train_data = scaler.fit_transform(train_data)
test_data = scaler.transform(test_data)

接下来,我们需要将数据转换成适合 LSTM 模型的格式。在多变量情况下,我们需要将每个时刻的输入向量扩展到包含多个变量。这里我们将以过去 30 天的数据为输入,预测未来一周的气温。

import numpy as np

def create_dataset(X, y, time_steps=1):
    Xs, ys = [], []
    for i in range(len(X) - time_steps):
        v = X[i:i + time_steps]
        Xs.append(v)
        ys.append(y[i + time_steps])
    return np.array(Xs), np.array(ys)

TIME_STEPS = 30
X_train, y_train = create_dataset(train_data, train_data[:, 0], TIME_STEPS)
X_test, y_test = create_dataset(test_data, test_data[:, 0], TIME_STEPS)

接下来,我们可以构建 LSTM 模型。在本例中,我们将使用两层 LSTM 和一个全连接层。模型的输入形状应该是 (samples, time_steps, features)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

model = Sequential([
    LSTM(units=64, input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences=True),
    LSTM(units=32, return_sequences=False),
    Dense(units=1)])

在训练模型之前,我们需要定义损失函数和优化器,并编译模型。

model.compile(loss='mean_squared_error', optimizer='adam')

现在,我们可以开始训练模型。在每个 epoch 后,我们将记录训练集和测试集上的损失值,并可视化它们的变化。

history = model.fit(
    X_train, y_train,
    epochs=50,
    batch_size=16,
    validation_split=0.1,
    verbose=1,
    shuffle=False)

import matplotlib.pyplot as plt

plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='test')
plt.legend()
plt.show()

在模型训练完成后,我们可以对测试集进行预测,并将预测结果与真实值进行比较。

y_pred = model.predict(X_test)

plt.plot(y_test, label='true')
plt.plot(y_pred, label='predicted')
plt.legend()
plt.show()

最后,我们将使用训练好的模型来预测未来一周的气温。首先,我们需要获取最近 30 天的数据,然后使用模型进行预测。每次预测完之后,我们将新的预测值添加到输入序列中,用于下一次的预测。

X_last30

= test_data[-TIME_STEPS:] forecast = [] for i in range(7): y_pred_one = model.predict(X_last30.reshape(1, TIME_STEPS, -1)) forecast.append(y_pred_one[0, 0]) X_last30 = np.vstack((X_last30[1:], y_pred_one))

forecast = scaler.inverse_transform(np.array(forecast).reshape(-1, 1))


以上便是使用多变量 LSTM 进行时间序列预测的整个流程。通过训练模型,我们可以获得对未来数据的预测结果,并且不仅仅考虑了单一变量的影响,而是综合了多个变量的影响。当然,这只是一个简单的例子,实际应用中可能会涉及到更加复杂的数据和模型。

数据分析咨询请扫描二维码

客服在线
立即咨询