任务:
我正在使用深度学习模型进行回归任务。
数据:
我有一个大约有 100 万行的表格数据集。每行包含 59 个特征和一个因变量。它不是顺序数据,如时间序列或自然语言数据。
我尝试过的:
我知道前馈神经网络 (FFNN) 通常适合我的任务。循环神经网络 (RNN) 或长短期记忆 (LSTM) 网络通常用于顺序数据。
尽管如此,我还是尝试在非序列数据上使用 LSTM 模型,类似于使用 FFNN 的方式。与 FFNN 相比,LSTM 模型的损失 (RMSE) 要小得多(0.06 比 0.1)。较小的损失似乎并不是由于过度拟合,因为训练集和测试集上的损失非常接近。
问题:
那么,使用 LSTM 来完成这项任务是否合理?是否有任何研究或文献支持在回归任务中使用 LSTM 处理非序列数据?
这是 LSTM 的代码:
X_train = tensor([[[ 1.4484, 0.7291, 0.6826, ..., 0.0000, 0.0000, 0.0000]],
[[-1.1500, 0.4385, 0.8845, ..., 0.0000, 0.0000, 0.0000]],
[[ 0.2358, 1.3103, -1.1840, ..., 0.0000, 0.0000, 0.0000]],
...,
[[-1.4964, -0.1426, -1.4673, ..., 0.0000, 0.0000, 0.0000]],
[[-0.4571, -1.3049, -1.7294, ..., 0.0000, 0.0000, 0.0000]],
[[ 1.6216, -1.3049, -1.9490, ..., 0.0000, 0.0000, 0.0000]]])
y_train = tensor([[[ 0.5081]],
[[ 0.9991]],
[[-0.2330]],
...,
[[-0.1037]],
[[-0.3245]],
[[-0.6687]]])
class LSTMNet(nn.Module):
def __init__(self, input_size, hidden_size=128, num_layers=2):
super(LSTMNet, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, 1)
def forward(self, x):
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[:, -1, :])
return out
model = LSTMNet(X_train.shape[2])
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
model.train()
for data, target in train_loader:
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
我也遇到了非顺序问题,但我正在研究时间序列分类。我使用 FFNN 获得了 64% 的准确率,而使用 LSTM 则获得了 90% 的准确率(所有验证/测试/训练都相同)。你知道为什么会出现这种情况吗?