Python 如何将CONVLSM2D的输入重塑为不过度拟合?
我有一个时间序列问题,时间步长为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规范化了这些值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
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。对此,您可以使用大批量*强>