多变量多步骤时间预测不良预测结果PyTorch LSTM Seq2Seq



我正试图在PyTorch中构建一个基于LSTM的Seq2Seq模型,用于多变量多步预测。

数据

使用的数据如上图所示,其中最后一列是目标,前面所有列都是功能。对于预处理,我使用MaxMinScaler将所有数据缩放到-1和1之间。

的特点和目标

然后我使用了编码器-解码器结构。

class Seq2Seq(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size, batch_size):
super().__init__()
self.output_size = output_size
self.Encoder = Encoder(input_size, hidden_size, num_layers, batch_size)
self.Decoder = Decoder(input_size, hidden_size,
num_layers, output_size, batch_size)
def forward(self, input_seq):
batch_size, seq_len, _ = input_seq.shape[0], input_seq.shape[1], input_seq.shape[2]
h, c = self.Encoder(input_seq)
outputs = torch.zeros(batch_size, seq_len, self.output_size).to(device)
for t in range(seq_len):
_input = input_seq[:, t, :]
# print(_input.shape)
output, h, c = self.Decoder(_input, h, c)
outputs[:, t, :] = output
return outputs[:, -1, :]

Traning

def seq2seq_train(model, Dtr, Val, path):
model = model
loss_function = nn.MSELoss().to(device)
# loss_function = nn.L1Loss().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, 
weight_decay=1e-4)

经过100个时期的训练,获得的损失和测试结果如下。

损失历史

测试结果

验证损失似乎没有下降,而且预测似乎很糟糕。

然后我使用Optuna来优化超参数,包括不同数量的隐藏层节点、LSTM层、丢弃等,但结果并不好,都有很高的验证损失。

我想知道是什么导致了这个结果,是数据、模型结构还是超参数的问题

我希望得到帮助,非常感谢。

基于所提供信息的初步答案:

注意,当人们像通常那样使用交叉熵损失进行分类时,糟糕的预测会受到比好的预测更强烈的惩罚。对于猫图像,损失是log(1−prediction),因此即使许多猫图像被正确地预测(低损失(,单个错误分类的猫图像也将具有高损失,因此;"炸毁";你的平均损失。请参阅此答案以进一步说明这一现象。(不断增加的损失和稳定的准确性也可能是由于好的预测被分类得更差,但我发现由于这种损失"不对称",这种可能性较小(。

所以我认为,当精度和损失都在增加时,网络开始过度拟合,这两种现象同时发生。网络开始学习只与训练集相关的模式,而不太适合泛化,这导致了所述现象,来自验证集的一些图像被预测得非常错误,其效果被"错误"放大;损失不对称";。然而,随着越来越多的图像被正确分类,它同时仍在学习一些对泛化有用的模式(现象一,"良好学习"(。

这条推文中还有一个很好的解释,简要解释了为什么你可能会遇到验证损失低于训练损失的情况。

最新更新