Machine learning 验证损失远高于培训损失

Machine learning 验证损失远高于培训损失,machine-learning,keras,deep-learning,lstm,Machine Learning,Keras,Deep Learning,Lstm,我对深度学习模型非常陌生,并尝试使用LSTM和Keras序列训练多时间序列模型。50年内每年有25次观测=1250个样本,因此不确定是否有可能对如此小的数据使用LSTM。但是,我有数千个特性变量,不包括时间滞后。我试图预测接下来25个时间步的数据序列。数据在0和1之间标准化。我的问题是,尽管我尝试了许多明显的调整,但我无法使LSTM验证损失接近训练损失(我认为是过度拟合) 我尝试过调整每个隐藏层的节点数(25-375)、隐藏层数(1-3)、退出(0.2-0.8)、批量大小(25-375)和训练/

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

我尝试过调整每个隐藏层的节点数(25-375)、隐藏层数(1-3)、退出(0.2-0.8)、批量大小(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 -14s-损耗:0.0512-瓦卢损耗:188.9568

纪元20/20 -14s-损耗:0.0510-瓦卢损耗:188.9537

我想我一定是做错了什么事,但由于我是新手,所以我没意识到这一点。我希望获得一些有用的验证损失(与培训相比),或者知道我的数据观测值根本不足以进行有用的LSTM建模。非常感谢您的帮助或建议,谢谢

过度装配 一般来说,如果您看到的验证损失比培训损失高得多,则表明您的模型拟合过度-它学习到“迷信”,即在培训数据中意外出现的模式是真实的,但在现实中没有依据,因此在验证数据中不真实

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

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


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

谢谢你的回答,如果我理解正确,你是说我的模型中有太多的神经元+层。。。事实上,我一开始只有1个隐藏层@25个神经元,但在我显著扩展了隐藏层和神经元后发布了这段代码。即使有一个隐藏层@25个神经元,验证损失基本上是完全相同的。。。我可以用移动平均法得到80%的准确率,我也尝试了GAMM和ARIMAX,但我希望尝试LSTM来处理高维数据