验证损失比培训损失高得多

时间:2019-03-31 19:40:27

标签: machine-learning keras deep-learning lstm

我对深度学习模型非常陌生,并尝试使用带有Keras Sequential的LSTM训练多时间序列模型。 50年中每年有25个观测值= 1250个样本,因此不确定是否可以使用LSTM来获取如此小的数据。但是,我有成千上万个功能变量,不包括时滞。我正在尝试预测数据的下25个时间步的顺序。数据在0到1之间进行了归一化。我的问题是,尽管尝试了许多明显的调整,但我无法在接近训练损失的位置得到LSTM验证损失(我认为过拟合过大)。

我尝试调整每个隐藏层的节点数(25-375),隐藏层数(1-3),辍学(0.2-0.8),batch_size(25-375)和训练/测试拆分(90 %:10%-50%-50%)。验证损失/训练损失差异并没有多大区别。

# SPLIT INTO TRAIN AND TEST SETS
# 25 observations per year; Allocate 5 years (2014-2018) for Testing
n_test = 5 * 25
test = values[:n_test, :]
train = values[n_test:, :]

# split into input and outputs
train_X, train_y = train[:, :-25], train[:, -25:]
test_X, test_y = test[:, :-25], test[:, -25:]

# reshape input to be 3D [samples, timesteps, features]
train_X = train_X.reshape((train_X.shape[0], 5, newdf.shape[1]))
test_X = test_X.reshape((test_X.shape[0], 5, newdf.shape[1]))
print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)


# design network
model = Sequential()
model.add(Masking(mask_value=-99, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(LSTM(375, return_sequences=True))
model.add(Dropout(0.8))
model.add(LSTM(125, return_sequences=True))
model.add(Dropout(0.8))
model.add(LSTM(25))
model.add(Dense(25))
model.compile(loss='mse', optimizer='adam')
# fit network
history = model.fit(train_X, train_y, epochs=20, batch_size=25, validation_data=(test_X, test_y), verbose=2, shuffle=False)

第19/20集  -14秒-损失:0.0512-val_loss:188.9568

第20/20集  -14秒-损失:0.0510-损失值:188.9537

link to plot of Val Loss / Train Loss

我认为我肯定在做某些明显的错误,但是由于我是新手,所以无法意识到。我希望要么获得一些有用的验证损失(与培训相比),要么希望我的数据观察结果不足以用于有用的LSTM建模。任何帮助或建议都非常感谢,谢谢!

1 个答案:

答案 0 :(得分:1)

过度拟合

通常,如果您看到的验证损失比训练损失高得多,则表明您的模型过度拟合-它会学习“迷信”,即模式在训练数据中偶然发生,但并非正确具有现实基础,因此在您的验证数据中并非如此。

通常表明您的模型“功能太强大”,参数太多,无法记住有限数量的训练数据。在您的特定模型中,您尝试从一千个数据点学习近一百万个参数(尝试打印model.summary())-这是不合理的,学习可以从数据中提取/压缩信息,而不是凭空创建。 / p>

预期结果是什么?

在构建模型之前,您应该问的第一个问题是预期的精度。您应该有一个合理的下限(什么是平凡的基线?对于时间序列预测,例如线性回归可能是一个上限)和一个上限(一个专家在给出相同的输入数据的情况下可以做出什么预测?

在很大程度上取决于问题的性质。您真的必须问,此信息是否足够以获得良好的答案?对于使用时间序列预测的许多现实生活中的问题,答案是否定的-这种系统的未来状态取决于许多变量,而这些变量不能仅通过查看历史测量值来确定-要合理地预测下一个值,您需要除了历史价格以外,还引入了许多外部数据。 Tukey引用了经典的话:“某些数据与对答案的渴望相结合并不能确保可以从给定的数据集中提取出合理的答案。”