我有一个以 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 相同的问题。