这是一个我找不到明确答案的一般性问题,只有一些提示表明这是可能的:
假设我想预测未来的销售额。
y(t+1) = 第t+1天的销售额(t+1 = 次日)
我有两个输入变量:历史销售额和历史天气预报。
x1(t) = 第t天的历史销售额x2(t) = 第t天的历史天气预报
在训练了一个模型后,我可以预测y(t+1)。
但是,如何将未来的天气数据作为输入使用呢?我已经有了第t+1天的天气预报,这将影响我的销售额,我希望将其作为输入使用 – 在这种情况下是x2(t+1)。如下所示:
输出:y(t+1)输入:x1(t)x2(t)x2(t+1) <------
在LSTM模型中是否可以加入这一功能?如果可以,训练和使用模型的输入矩阵应该是什么样的?
回答:
您的理解是正确的。您可以将当前天气和之前的销售额作为输入来预测当前的销售额。
sales[t+1] = RNN(weather[t+1], sales[t]) <-- [正确]
然而,提供之前的天气数据并不是必要的,因为相关信息会通过隐藏特征传播。
sales[t+1] = RNN(weather[t+1], weather[t], sales[t]) <-- [错误]
示例
假设这是我们的样本数据。
df = pd.DataFrame([{'weather':1, 'sales':500}, {'weather':3, 'sales':200}, {'weather':2, 'sales':400}, {'weather':0, 'sales':600}])print(df) weather sales0 1 5001 3 2002 2 4003 0 600
我们需要生成具有特定维度的训练输入。
#训练输入维度 = (训练样本数, seq_length, 特征数)seq_len = 3 #LSTM循环的次数n_features = 2 #天气和销售额被视为输入training_input = torch.zeros((df.shape[0], seq_len, n_features))row = torch.zeros(seq_len, n_features)for i in range(df.shape[0]): row[:-1] = row[1:] prev_sales = df.sales[i-1] if i > 0 else 0 #即,sales[-1] = 0 row[-1, :] = torch.tensor([df.weather[i], prev_sales]) training_input[i] = rowprint(training_input)tensor([[[ 0., 0.], [ 0., 0.], [ 1., 0.]], [[ 0., 0.], [ 1., 0.], [ 3., 500.]], [[ 1., 0.], [ 3., 500.], [ 2., 200.]], [[ 3., 500.], [ 2., 200.], [ 0., 400.]]])
以下部分是一个关于将训练输入提供给LSTM层的示例。
初始化LSTM参数
input_size = 2 #天气和之前的销售额被视为输入hidden_size = 2 #可以使用任何数字n_layers = 1 #堆叠的LSTM数量。在这种情况下,只使用了一个LSTMbatch_size = training_input.size()[0] #一次性传递整个训练输入
初始化hidden_input
hidden_input = torch.zeros(n_layers,batch_size,hidden_size), torch.zeros(n_layers,batch_size, hidden_size)
创建LSTM层
lstm = nn.LSTM(input_size,hidden_size)
训练输入必须根据LSTM类中forward函数的接受输入维度进行重塑。
lstm_input = training_input.view(seq_len,batch_size,input_size)out, hidden = lstm(lstm_input, hidden_input)print(out[-1])tensor([[2.0370e-10, 9.6134e-07], [2.2299e-25, 7.1835e-28], [2.0600e-10, 1.1409e-06], [8.0952e-21, 1.2101e-24]], grad_fn=<SelectBackward>)
有关更多信息,请参考Pytorch的LSTM层文档。希望这对您有帮助。