Python实现LSTM时间序列预测时预测集输出维度重塑问题求解
你现在用的是seq2seq结构的LSTM,因为加了RepeatVector和TimeDistributed层,所以模型输出的是每个输入序列对应的完整长度为30的序列,所以维度是(样本数, 30, 1),你直接用reshape(-1,1)会把所有30个时间步的数值都展开,自然不符合预期。
正确处理步骤
- 提取单步预测值
你构造标签时,每个输入序列对应的是序列结束后的下一个时间步的数值,所以只需要取每个预测样本的最后一个时间步的输出即可:
# 处理训练集预测:取每个样本最后一个时间步的结果,形状变为 (1023, 1) trainPredict = trainPredict[:, -1, :] # 同理处理测试集预测,处理后形状为 (测试样本数, 1) testPredict = testPredict[:, -1, :]
如果你只是需要和训练集标签ytrain对齐的预测值来算精度,不需要补全其他位置,上面得到的trainPredict就已经是符合要求的二维数组,直接和ytrain计算指标即可。
- 补全前序缺失值拼接得到全量预测数组
你需要的总长度1203 = 初始序列长度30 + 训练集预测样本数1023 + 测试集预测样本数150,所以要把前30个没有预测值的位置补齐,再拼接所有结果:
import numpy as np # 前30个位置无预测值,可填充nan或者原始真实值,这里以填充nan为例 train_padding = np.full((seq_size, 1), np.nan) # 拼接训练集部分:填充区 + 训练预测结果,形状为 (30 + 1023, 1) = (1053, 1) full_train_predict = np.concatenate([train_padding, trainPredict], axis=0) # 拼接全量预测结果:训练集全预测 + 测试集预测,形状为 (1053 + 150, 1) = (1203, 1) full_predict = np.concatenate([full_train_predict, testPredict], axis=0)
- (可选)反归一化操作
如果需要把预测值转回原始数值范围,直接把上面得到的二维数组传入scaler的反归一化方法即可:
full_predict_inv = scaler.inverse_transform(full_predict)
内容的提问来源于stack exchange,提问作者Giuseppe Luvarà
相关产品推荐
相关产品推荐

