Python 如何将CONVLSM2D的输入重塑为不过度拟合?

Python 如何将CONVLSM2D的输入重塑为不过度拟合?,python,keras,conv-neural-network,lstm,machine-learning-model,Python,Keras,Conv Neural Network,Lstm,Machine Learning Model,我有一个时间序列问题,时间步长为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 = PowerTr

我有一个时间序列问题,时间步长为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个纪元的同一个问题。

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

  • 我会先检查一下模型是否在训练。根据你的回答,我不确定当你的模型列车运行时,损失是如何变化的——如果有的话。如果有一些变化,您需要执行网格搜索(处理大量的层和过滤器)

  • 我还发现我的模型需要经过长时间的训练才能很好地执行,请参见ConvLSTM2d上的Keras示例,其中需要300个时代来训练一个模型以执行一项可以说是简单的任务:。我参与的一个案例也需要类似的时间来训练

  • 检查不同的损失函数和优化器(尽管我认为mse和adam适合处理此类问题)

  • 以不同的方式对数据进行规范化,您可能希望按照以下方式对数据进行统计规范化: 如本例所示:

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

  • *我知道您希望如何格式化数据,尽管它可能有效,但更简单的解决方案可能会更好。您可能希望尝试给出(v1、v2、v3、v4、v5)和预测v6。对此,您可以使用大批量*


感谢george的输入。但是我的输入是否正确?因为我是ConvLSTM2D的新手,想检查一下是否正确?Ricky,您的输入是否正确。话虽如此,请看我最后用星号标出的要点。我相信以这种方式提供您的数据对于网络来说可能很难理解(并非不可能!)。我建议尝试我的解决方案,提供(v1、v2、v3、v4、v5)的输入,并让网络预测v6。我不会像你那样提供5个延迟,网络可能很难轻松确定延迟之间的差异。哦,好吧,你的意思是,有时在时间步长之前给出延迟值对网络来说并不容易理解。我按照他们的方法做了2个滞后,我做了5个滞后。看起来您的数据结构与kaggle示例中使用的数据结构相似,所以这是正确的。如果我没有亲自培训过这个示例,我相信您的网络性能很差,因为您的网络缺乏复杂性。使用5个滞后而不是示例中的2个滞后-我相信您的网络中需要更多的参数。我发现性能不佳的原因是过度拟合问题。我已经用更多的信息更新了这个问题。我计划增加辍学者,先看看。你还有什么推荐的吗?