考虑到室内和室外的气候,我试图预测墙壁的湿热反应。根据文献研究,我相信这应该可以与RNN,但我一直无法获得良好的准确性。
该数据集有12个输入特征(外部和内部气候数据的时间序列)和10个输出特征(湿热响应的时间序列),均包含10年的小时值。该数据是用湿热模拟软件创建的,没有缺失数据。
数据集功能:
数据集目标:
与大多数时间序列预测问题不同,我希望预测每个时间步的输入特征时间序列的全长响应,而不是时间序列的后续值(例如金融时间序列预测)。我还没有发现类似的预测问题(在类似或其他领域),所以如果你知道其中一个,欢迎参考。
我认为这在RNN中应该是可能的,所以我目前正在使用Keras的LSTM。在培训之前,我按照以下方式预处理数据:
-
丢弃第一年的数据,因为墙湿热响应的第一时间步受初始温度和相对湿度的影响。
-
分为培训和测试集。训练集包含前8年的数据,测试集包含剩余的2年。
-
使用
StandardScaler
来自Sklearn。使用训练集的平均方差对测试集进行类似的正态化。
这将导致:
X_train.shape = (1, 61320, 12)
,
y_train.shape = (1, 61320, 10)
,
X_test.shape = (1, 17520, 12)
,
y_test.shape = (1, 17520, 10)
由于这些是长时间序列,我使用有状态LSTM并按说明剪切时间序列
here
,使用
stateful_cut()
作用我只有一个样本,所以
batch_size
是1。对于
T_after_cut
我试过24和120(24*5);24似乎给出了更好的结果。这导致
X_train.shape = (2555, 24, 12)
,
y_train.shape = (2555, 24, 10)
,
X_test.shape = (730, 24, 12)
,
y_test.shape = (730, 24, 10)
.
接下来,我构建并训练LSTM模型,如下所示:
model = Sequential()
model.add(LSTM(128,
batch_input_shape=(batch_size,T_after_cut,features),
return_sequences=True,
stateful=True,
))
model.addTimeDistributed(Dense(targets)))
model.compile(loss='mean_squared_error', optimizer=Adam())
model.fit(X_train, y_train, epochs=100, batch_size=batch=batch_size, verbose=2, shuffle=False)
不幸的是,我没有得到准确的预测结果;即使对于训练集也不行,因此模型有很高的偏差。
The prediction results of the LSTM model for all targets
如何改进我的模型?我已经尝试了以下方法:
-
不放弃数据集的第一年->无显著差异
-
区分输入特征时间序列(从当前值中减去以前的值)->稍差的结果
-
最多四个堆叠的LSTM层,都具有相同的超参数->结果无显著差异,但训练时间更长
-
LSTM层之后的退出层(尽管这通常用于减少方差,并且我的模型有很高的偏差)>稍好的结果,但差异可能没有统计学意义
我对有状态的LSTM做了什么错事吗?我需要尝试不同的RNN型号吗?我应该以不同的方式预处理数据吗?
此外,培训速度非常慢:上述型号约4小时。因此,我不愿意进行广泛的超参数网格搜索。。。