Pytorch贝叶斯深度学习库BLiTZ实现LSTM预测时序数据(二)

简介: Pytorch贝叶斯深度学习库BLiTZ实现LSTM预测时序数据(二)

创建神经网络类

我们的网络类接收variantal_estimator装饰器,该装饰器可简化对贝叶斯神经网络损失的采样。我们的网络具有一个贝叶斯LSTM层,参数设置为in_features = 1以及out_features = 10,后跟一个nn.Linear(10, 1),该层输出股票的标准化价格。

@variational_estimator
class NN(nn.Module):
     def __init__(self):
         super(NN, self).__init__()
         self.lstm_1 = BayesianLSTM(1, 10)
         self.linear = nn.Linear(10, 1)
     def forward(self, x):
         x_, _ = self.lstm_1(x)
         #gathering only the latent end-of-sequence for the linear layer
         x_ = x_[:, -1, :]
         x_ = self.linear(x_)
         return x_

如您所见,该网络可以正常工作,唯一的不同点是BayesianLSTM层和variantal_estimator装饰器,但其行为与一般的Torch对象相同。

完成后,我们可以创建我们的神经网络对象,分割数据集并进入训练循环:

创建对象

我们现在可以创建损失函数、神经网络、优化器和dataloader。请注意,我们不是随机分割数据集,因为我们将使用最后一批时间戳来计算模型。由于我们的数据集很小,我们不会对训练集创建dataloader。

Xs, ys = create_timestamps_ds(close_prices)
X_train, X_test, y_train, y_test = train_test_split(Xs,
                                                     ys,
                                                     test_size=.25,
                                                     random_state=42,
                                                     shuffle=False)
ds = torch.utils.data.TensorDataset(X_train, y_train)
dataloader_train = torch.utils.data.DataLoader(ds, batch_size=8, shuffle=True)
net = NN()
criterion = nn.MSELoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)

我们将使用MSE损失函数和学习率为0.001的Adam优化器

训练循环

对于训练循环,我们将使用添加了variational_estimatorsample_elbo方法。它对X个样本的损失进行平均,并帮助我们轻松地用蒙特卡洛估计来计算损失。

为了使网络正常工作,网络forward方法的输出必须与传入损失函数对象的标签的形状一致。

iteration = 0
for epoch in range(10):
     for i, (datapoints, labels) in enumerate(dataloader_train):
         optimizer.zero_grad()
         loss = net.sample_elbo(inputs=datapoints,
                                labels=labels,
                                criterion=criterion,
                                sample_nbr=3)
         loss.backward()
         optimizer.step()
         iteration += 1
         if iteration%250==0:
             preds_test = net(X_test)[:,0].unsqueeze(1)
             loss_test = criterion(preds_test, y_test)
             print("Iteration: {} Val-loss: {:.4f}".format(str(iteration), loss_test))

评估模型并计算置信区间

我们将首先创建一个具有要绘制的真实数据的dataframe:

original = close_prices_unscaled[1:][window_size:]
df_pred = pd.DataFrame(original)
df_pred["Date"] = df.Date
df["Date"] = pd.to_datetime(df_pred["Date"])
df_pred = df_pred.reset_index()

要预测置信区间,我们必须创建一个函数来预测同一数据X次,然后收集其均值和标准差。同时,在查询真实数据之前,我们必须设置将尝试预测的窗口大小。

让我们看一下预测函数的代码:

def pred_stock_future(X_test,
                                            future_length,
                                            sample_nbr=10):
     #sorry for that, window_size is a global variable, and so are X_train and Xs
     global window_size
     global X_train
     global Xs
     global scaler
     #creating auxiliar variables for future prediction
     preds_test = []
     test_begin = X_test[0:1, :, :]
     test_deque = deque(test_begin[0,:,0].tolist(), maxlen=window_size)
     idx_pred = np.arange(len(X_train), len(Xs))
     #predict it and append to list
     for i in range(len(X_test)):
         #print(i)
         as_net_input = torch.tensor(test_deque).unsqueeze(0).unsqueeze(2)
         pred = [net(as_net_input).cpu().item() for i in range(sample_nbr)]
         test_deque.append(torch.tensor(pred).mean().cpu().item())
         preds_test.append(pred)
         if i % future_length == 0:
             #our inptus become the i index of our X_test
             #That tweak just helps us with shape issues
             test_begin = X_test[i:i+1, :, :]
             test_deque = deque(test_begin[0,:,0].tolist(), maxlen=window_size)
     #preds_test = np.array(preds_test).reshape(-1, 1)
     #preds_test_unscaled = scaler.inverse_transform(preds_test)
     return idx_pred, preds_test

我们要将置信区间保存下来,确定我们置信区间的宽度。

def get_confidence_intervals(preds_test, ci_multiplier):
     global scaler
     preds_test = torch.tensor(preds_test)
     pred_mean = preds_test.mean(1)
     pred_std = preds_test.std(1).detach().cpu().numpy()
     pred_std = torch.tensor((pred_std))
     upper_bound = pred_mean + (pred_std * ci_multiplier)
     lower_bound = pred_mean - (pred_std * ci_multiplier)
     #gather unscaled confidence intervals
     pred_mean_final = pred_mean.unsqueeze(1).detach().cpu().numpy()
     pred_mean_unscaled = scaler.inverse_transform(pred_mean_final)
     upper_bound_unscaled = upper_bound.unsqueeze(1).detach().cpu().numpy()
     upper_bound_unscaled = scaler.inverse_transform(upper_bound_unscaled)
     lower_bound_unscaled = lower_bound.unsqueeze(1).detach().cpu().numpy()
     lower_bound_unscaled = scaler.inverse_transform(lower_bound_unscaled)
     return pred_mean_unscaled, upper_bound_unscaled, lower_bound_unscaled

由于我们使用的样本数量很少,因此用一个很高的标准差对其进行了补偿。我们的网络将尝试预测7天,然后将参考数据:

future_length=7
sample_nbr=4
ci_multiplier=10
idx_pred, preds_test = pred_stock_future(X_test, future_length, sample_nbr)
pred_mean_unscaled, upper_bound_unscaled, lower_bound_unscaled = get_confidence_intervals(preds_test,
                                                                                           ci_multiplier)

我们可以通过查看实际值是否低于上限并高于下限来检查置信区间。设置好参数后,您应该拥有95%的置信区间,如下所示:

y = np.array(df.Close[-750:]).reshape(-1, 1)
under_upper = upper_bound_unscaled > y
over_lower = lower_bound_unscaled < y
total = (under_upper == over_lower)
print("{} our predictions are in our confidence interval".format(np.mean(total)))


检查输出图形

现在,我们将把预测结果绘制为可视化图形来检查我们的网络是否运行的很顺利,我们将在置信区间内绘制真实值与预测值。

params = {"ytick.color" : "w",
           "xtick.color" : "w",
           "axes.labelcolor" : "w",
           "axes.edgecolor" : "w"}
plt.rcParams.update(params)
plt.title("IBM Stock prices", color="white")
plt.plot(df_pred.index,
          df_pred.Close,
          color='black',
          label="Real")
plt.plot(idx_pred,
          pred_mean_unscaled,
          label="Prediction for {} days, than consult".format(future_length),
          color="red")
plt.fill_between(x=idx_pred,
                  y1=upper_bound_unscaled[:,0],
                  y2=lower_bound_unscaled[:,0],
                  facecolor='green',
                  label="Confidence interval",
                  alpha=0.5)
plt.legend()

image.png

最后,我们放大一下着重看看预测部分。

params = {"ytick.color" : "w",
           "xtick.color" : "w",
           "axes.labelcolor" : "w",
           "axes.edgecolor" : "w"}
plt.rcParams.update(params)
plt.title("IBM Stock prices", color="white")
plt.fill_between(x=idx_pred,
                  y1=upper_bound_unscaled[:,0],
                  y2=lower_bound_unscaled[:,0],
                  facecolor='green',
                  label="Confidence interval",
                  alpha=0.75)
plt.plot(idx_pred,
          df_pred.Close[-len(pred_mean_unscaled):],
          label="Real",
          alpha=1,
          color='black',
          linewidth=0.5)
plt.plot(idx_pred,
          pred_mean_unscaled,
          label="Prediction for {} days, than consult".format(future_length),
          color="red",
          alpha=0.5)
plt.legend()

image.png

总结

我们看到BLiTZ内置的贝叶斯LSTM使得贝叶斯深度学习的所有功能都变得非常简单,并且可以顺利地在时间序列上进行迭代。我们还看到,贝叶斯LSTM已与Torch很好地集成在一起,并且易于使用,你可以在任何工作或研究中使用它。

我们还可以非常准确地预测IBM股票价格的置信区间,而且这比一般的点估计可能要有用的多。

目录
相关文章
|
4月前
|
机器学习/深度学习 安全 Serverless
【创新未发表】【故障诊断】基于连续小波变换-CNN, ResNet, CNN-SVM, CNN-BiGRU, CNN-LSTM的故障诊断研究【凯斯西储大学数据】(Matlab代码实现)
【创新未发表】【故障诊断】基于连续小波变换-CNN, ResNet, CNN-SVM, CNN-BiGRU, CNN-LSTM的故障诊断研究【凯斯西储大学数据】(Matlab代码实现)
365 0
|
4月前
|
机器学习/深度学习 传感器 数据采集
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
812 0
|
数据挖掘 PyTorch TensorFlow
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。
|
机器学习/深度学习 自然语言处理 PyTorch
【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
|
数据挖掘 PyTorch TensorFlow
Python数据分析新纪元:TensorFlow与PyTorch双剑合璧,深度挖掘数据价值
【7月更文挑战第30天】随着大数据时代的发展,数据分析变得至关重要,深度学习作为其前沿技术,正推动数据分析进入新阶段。本文介绍如何结合使用TensorFlow和PyTorch两大深度学习框架,最大化数据价值。
382 8
|
机器学习/深度学习 数据挖掘 TensorFlow
|
机器学习/深度学习 存储 并行计算
深入解析xLSTM:LSTM架构的演进及PyTorch代码实现详解
xLSTM的新闻大家可能前几天都已经看过了,原作者提出更强的xLSTM,可以将LSTM扩展到数十亿参数规模,我们今天就来将其与原始的lstm进行一个详细的对比,然后再使用Pytorch实现一个简单的xLSTM。
829 2
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
294 0
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
340 6

热门文章

最新文章

推荐镜像

更多