python - 如何重塑 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 相同的问题。
解决方案
以我个人的经验,关于使用 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。您可能为此使用大批量。*
推荐阅读
- mongodb - 根据条件从数组中删除完整的文档或元素
- office365 - Yammer 和通讯组 - 通知
- spring-security - Webflux 状态码无法更改
- ios - rightBarButtonItem 在 iOS-9 和 iOS-10 中弹出时消失
- android - 在 SQLite 中动态使用 IN()
- python - 根据条件从python中的数据库服务器中提取选择性数据
- apache-spark - 使用 ELK 堆栈进行日志处理
- python - 创建等距数组
- excel - 另一个 Excel 求解器中的 Excel 求解器(求解器的串联连接)
- excel - 句号后第一个字母大写的Excel公式