如何重塑ConvLSTM2D的输入,使其不过度拟合?

问题描述 投票:0回答:1

我有一个以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个滞后值)。

因此,我总共有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.我的重塑是否正确? 任何帮助都是感激的。

EDIT.我已经意识到我的输入是正确地给了网络,但问题是我的输入是正确地给了ConvLSTM2D。

我已经意识到我的输入是正确的给网络,但问题是它是过拟合很多。enter image description here

我的超参数如下。

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

我甚至尝试了50和10个纪元,其相同的问题。

python keras conv-neural-network lstm machine-learning-model
1个回答
1
投票

以我个人的经验来说,使用ConvLSTM2D有几点心得。

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

  • 我还发现我的模型需要训练很长时间才能表现良好,参见ConvLSTM2d上的Keras例子,训练一个模型执行一个可以说是简单的任务需要300个纪元。https:/keras.ioexamplesconv_lstm. 我工作过的一个案例需要类似数量的纪元来训练。

  • 检查不同的损失函数和优化器(即使我认为mse和adam对这种类型的问题很好)。

  • 归一化你的数据不同,你可能想在统计上归一化你的数据,如这个keras的例子所示。https:/www.tensorflow.orgtutorialskerasregression

  • 根据个人经验,您可能需要更多的层数来解决这个具体问题。参见上面的keras ConvLSTM2d例子

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

© www.soinside.com 2019 - 2024. All rights reserved.