首页 > 解决方案 > 如何重塑 ConvLSTM2D 的输入以不过度拟合?

问题描述

我有一个以 15 分钟为时间步长的时间序列问题。完整的数据将从 2016-09-01 00:00:15 到 2016-12-31 23:45:00。

我在数据框中有 5 个变量(v1、v2、v3、v4、v5、v6),我想预测下一个时间步长的第六个变量(v6)。

我准备数据集并将信息准备为 5 个时间滞后。就像如果时间是t在行中,我创建 (t-1) 到 (t-5) 的值作为 v1 到 v6 的滞后。

所以总的来说,我有 30 个特征(6 个变量有 5 个滞后)。我还通过 PowerTransformer 对值进行了标准化。

scaler_x = PowerTransformer()
scaler_y = PowerTransformer()
train_X = scaler_x.fit_transform(train_X)
train_y = scaler_y.fit_transform(train_y.reshape(-1,1))

我的 traix_X 和 train_y 的数据输入形状最初如下所示:

(11253, 30) , (11253, 1)

11253 行有 30 个变量作为输入,一个变量作为目标变量。然后我重塑它以适合我的 ConvLSTM2D,如下所示:

# define the number of subsequences and the length of subsequences
n_steps, n_length = 5, 6 #I take into account of past 5 steps for the 6 variables
n_features=1
#reshape for ConvLSTM
# reshape into subsequences [samples, time steps, rows, cols, channels]
train_X = train_X.reshape(train_X.shape[0], n_steps, 1, n_length, n_features)
train_y = train_y.reshape((train_y.shape[0], train_y.shape[1], 1))

ConvLSTM2D 架构如下所示:

model = Sequential()
model.add(ConvLSTM2D(filters=64, kernel_size=(1,3), activation='relu', input_shape=(n_steps, 1, n_length, n_features)))
model.add(Flatten())
model.add(RepeatVector(1))
model.add(LSTM(50, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(20, activation='relu')))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mse', optimizer='adam')
# fit network
model.fit(train_X, train_y, epochs=epochs, batch_size=batch_size, verbose=0)

但是这个模型给出了一个非常糟糕的结果(它过度拟合了很多)。我怀疑我的输入没有正确地提供给 ConvLSTM2D。我的整形正确吗?任何帮助表示赞赏。

编辑:

我已经意识到我的输入被正确地提供给了网络,但问题是它过度拟合了很多。 在此处输入图像描述

我的超参数如下:

#hyper-parameter
epochs=100
batch_size=64
adam_opt = keras.optimizers.Adam(lr=0.001)

我什至尝试了 50 和 10 个 epochs 相同的问题。

标签: pythonkerasconv-neural-networklstmmachine-learning-model

解决方案


以我个人的经验,关于使用 ConvLSTM2D,我学到了一些东西。

  • 我会首先检查模型是否正在训练。根据您的回答,我不确定随着您的模型训练损失如何变化 - 如果有的话。如果有一些变化,您需要执行网格搜索(玩弄层数和过滤器)

  • 我还发现我的模型需要长时间训练才能表现良好,请参阅 ConvLSTM2d 上的 Keras 示例,其中需要 300 个 epoch 来训练模型以执行可以说简单的任务:https ://keras.io/examples/conv_lstm/ . 我处理的一个案例需要类似数量的 epoch 来训练。

  • 检查不同的损失函数和优化器(尽管我认为 mse 和 adam 对这类问题有好处)

  • 以不同方式规范化您的数据,您可能希望统计地规范化您的数据,如以下 keras 示例所示:https ://www.tensorflow.org/tutorials/keras/regression

  • 根据个人经验,您可能需要更多层来解决这个特定问题。请参阅上面的 keras ConvLSTM2d 示例

  • * 我知道你想如何格式化你的数据,虽然它可能有效,但更直接的解决方案可能会更好。您可能想尝试给出 (v1,v2,v3,v4,v5) 并预测 v6。您可能为此使用大批量。*


推荐阅读