验证损失远高于训练损失

Mic*_*ton 4 machine-learning deep-learning lstm keras

我对深度学习模型非常陌生,并尝试使用带有 Keras Sequential 的 LSTM 训练多时间序列模型。50 年中每年有 25 个观测值 = 1250 个样本,因此不确定是否可以将 LSTM 用于如此小的数据。但是,我有数千个特征变量,不包括时间滞后。我正在尝试预测接下来 25 个时间步长的数据序列。数据在 0 和 1 之间标准化。我的问题是,尽管尝试了许多明显的调整,但我无法在任何接近训练损失的地方获得 LSTM 验证损失(我认为过度拟合)。

我尝试调整每个隐藏层的节点数 (25-375)、隐藏层数 (1-3)、dropout (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)
Run Code Online (Sandbox Code Playgroud)

纪元 19/20 - 14s - 损失:0.0512 - val_loss:188.9568

纪元 20/20 - 14s - 损失:0.0510 - val_loss:188.9537

链接到 Val 损失 / 火车损失图

我想我一定是在做一些明显的错误,但由于我是新手,所以无法意识到。我希望要么获得一些有用的验证损失(与训练相比),要么知道我的数据观察对于有用的 LSTM 建模来说根本不够大。非常感谢任何帮助或建议,谢谢!

Pet*_*ris 5

过拟合

一般来说,如果您看到验证损失比训练损失高得多,那么这表明您的模型过度拟合 - 它学习了“迷信”,即在您的训练数据中偶然发生的模式,但没有基础实际上,因此在您的验证数据中并非如此。

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

预期的结果是什么?

在构建模型之前,您应该问(并回答!)的第一个问题是关于预期准确度。您应该有一个合理的下限(什么是微不足道的基线?对于时间序列预测,例如线性回归可能是一个)和一个上限(在给定相同输入数据的情况下,专家可以预测什么?)。

在很大程度上取决于问题的性质。你真的要问,这些信息足以得到一个好的答案吗?对于时间序列预测的许多现实生活时间问题,答案是否定的 - 这样一个系统的未来状态取决于许多无法通过简单地查看历史测量值来确定的变量 - 要合理地预测下一个值,您需要除了历史价格之外,还引入了许多外部数据。Tukey 有一句经典的话:“一些数据和对答案的渴望并不能确保可以从给定的数据体中提取出合理的答案。”