理解多维预测
# 预测多个变量
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
import matplotlib.pyplot as plt
# 生成示例数据
np.random.seed(42)
data = np.random.randn(100, 3) # 100个时间步,3列数据
df = pd.DataFrame(data, columns=['col1', 'col2', 'col3'])
# 数据预处理
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df)
# 划分训练集和测试集
train_size = int(len(scaled_data) * 0.8)
train_data = scaled_data[:train_size]
test_data = scaled_data[train_size:]
# 创建数据集
def create_dataset(dataset, time_step=1):
X, Y = [], []
for i in range(len(dataset)-time_step-1):
a = dataset[i:(i+time_step), :]
X.append(a)
Y.append(dataset[i + time_step, :])
return np.array(X), np.array(Y)
time_step = 10
X_train, y_train = create_dataset(train_data, time_step)
X_test, y_test = create_dataset(test_data, time_step)
# 构建LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, df.shape[1])))
model.add(LSTM(50, return_sequences=True))
model.add(LSTM(50))
model.add(Dense(df.shape[1]))
model.compile(loss='mean_squared_error', optimizer='adam')
# 训练模型
model.fit(X_train, y_train, epochs=3, batch_size=64, verbose=1)
# 进行预测
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)
# 反归一化
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)
y_train = scaler.inverse_transform(y_train)
y_test = scaler.inverse_transform(y_test)
# 绘制结果
for i in range(df.shape[1]):
plt.figure(figsize=(12, 6))
plt.plot(df.iloc[:, i], label='Original Data')
train_pred_start = time_step
train_pred_end = train_pred_start + len(train_predict)
test_pred_start = train_pred_end + time_step
test_pred_end = test_pred_start + len(test_predict)
plt.plot(range(train_pred_start, train_pred_end), train_predict[:, i], label='Train Prediction')
plt.plot(range(test_pred_start, test_pred_end), test_predict[:, i], label='Test Prediction')
# 计算绝对误差
abs_error = np.abs(y_test[:, i] - test_predict[:, i])
plt.plot(range(test_pred_start, test_pred_end), abs_error, label='Absolute Error', linestyle='--')
plt.title(f'Column {i + 1} Prediction')
plt.xlabel('Time Step')
plt.ylabel('Value')
plt.legend()
plt.show()
首先,明确一下“多维预测”的含义。 在时间序列预测的上下文中,多维预测通常意味着以下两种情况之一:
- 预测多个时间步的未来值: 也就是说,你不仅要预测下一个时间点的值,还要预测未来几个时间点的值。 例如,给定过去 10 天的数据,预测未来 3 天的数值。
- 预测多个变量: 也就是说,你不仅要预测一个变量的未来值,还要同时预测多个变量的未来值。 例如,给定过去 10 天的温度、湿度和风速,预测未来 1 天的这三个变量的数值。
return_sequences=True 与多维预测
现在,我们来解释为什么 return_sequences=True 通常是实现多维预测所必需的:
当每个时间步的输入传递给所有 50 个 LSTM 单元时,每个单元独立地更新自己的细胞状态和隐藏状态。最终,在组合每个单元的隐藏状态时,如果 return_sequences=False,则输出的是隐藏状态序列的最后一个时间步的值;如果 return_sequences=True,则输出是每个时间步的隐藏状态序列。通过学习不同的特征和模式,这些隐藏状态被后续层用来完成特定任务。
预测多个时间步
- 需要每个时间步的信息: 如果你想预测未来多个时间步的值,那么你需要模型能够“记住”过去序列中的信息。 通过设置 return_sequences=True,你可以获得 LSTM 层在 每个时间步 的隐藏状态序列。 这些隐藏状态包含了过去序列的信息,可以用来预测未来的多个值。
- 序列到序列的映射: 你可以将多步预测看作是一个序列到序列的映射问题。 输入是过去的序列,输出是未来的序列。 LSTM 擅长处理序列到序列的映射问题。
- 后续层需要序列: 后续的层(例如 TimeDistributed Dense 层)可以利用每个时间步的隐藏状态信息来生成未来多个时间步的预测值。
预测多个变量
- 每个变量的依赖关系: 如果你想同时预测多个变量的未来值,那么你需要模型能够学习这些变量之间的依赖关系。 通过设置 return_sequences=True, 你可以让 LSTM 层输出每个时间步的隐藏状态序列,然后后续的层可以利用这些隐藏状态来学习变量之间的依赖关系,并生成多个变量的预测值。
- 捕捉变量间的相关性: 多个变量通常是相互影响的,例如,温度升高可能会导致湿度降低。 return_sequences=True 允许模型在每个时间步都考虑所有变量的信息,从而更好地捕捉变量之间的相关性。
参考链接:
1、另外,预测一个变量,使用了多个变量作为输入,仍然属于多维预测问题https://yuanbao.tencent.com/bot/app/share/chat/5Yg5OrUWHNL8
https://www.doubao.com/thread/w68bf9d0fb149bf68
2、预测问题总结:https://www.doubao.com/thread/w5064bab5e1789d75