N-BEATS:独特的可解释时间序列预测深度学习模型
集类 TimeSeriesDataset(Dataset):definit结论N-BEATS 不仅仅是一个预测工具,它还是一个强大且可解释的框架,可使深度学习在时间序列分析中普及。它能够清晰地洞察预测的驱动因素,这对于依赖准确、可解释预测的企业来说非常有价值。号召行动对于那些希望突破时间序列预测界限的人来说,实施 N-BEATS 可以完美地结合性能和可解释性,从而改变决策过程。尝试将 N-BEAT
N-BEATS:独特的可解释时间序列预测深度学习模型
介绍
在金融、零售和气象等各个领域,时间序列预测至关重要。传统模型通常在灵活性和可解释性方面存在问题,尤其是在处理复杂模式时。N-BEATS 是一种突破性的模型,由 Element AI 和蒙特利尔学习算法研究所 (MILA) 的研究人员开发。N-BEATS 以其可解释性和强大的预测能力而闻名,是真正的游戏规则改变者。
什么是 N-BEATS?
N-BEATS(时间序列预测的神经基础扩展分析)彻底改变了时间序列预测的方法。与依赖于循环神经网络 (RNN) 的典型模型不同,N-BEATS 采用一系列前馈神经网络。这种结构不仅提高了性能,而且还避免了 RNN 经常出现的复杂性和不稳定性。
N-BEATS 的主要功能
可解释性:N-BEATS 的一大亮点是其可解释性,它提供了哪些数据组件影响预测的见解——这是深度学习模型中罕见的功能。
模块化:该架构包含多个块,可以以各种方式配置以适应不同的应用程序,从而无需改变核心框架即可进行广泛的定制。
泛化:N-BEATS 旨在处理多种时间序列数据,可以适应不同的数据集而无需进行特定调整。
深入探究架构
块结构:N-BEATS 的核心由多个块组成,每个块负责捕获特定数据模式,例如趋势或季节性。这些块预测和预测回测值,帮助模型关注时间序列的不同方面。
堆叠块:N-BEATS 的优势在于堆叠这些块。每个块层通过处理残差(实际值与先前预测之间的差异)来细化预测。这种细化提高了最终预测的准确性。
N-BEATS 的工作原理
训练:N-BEATS 通过交替预测未来值和重建过去值(回溯)进行训练。它最大限度地减少了预测和实际数据之间的误差,从而提高了预测能力。
预测:在预测中,N-BEATS 汇总所有块的预测,确保在最终预测中考虑到从总体趋势到特定季节性模式的每个数据方面。
例如:每日温度数据
为了演示 N-BEATS,我们使用每日温度数据集,这是时间序列建模中的常见基准。它是一个周期为一年(365 天)且振幅为 10 的正弦波。此示例将展示如何使用 PyTorch 实现 N-BEATS 并解释模型的输出以了解不同时间序列组件的影响。
让我们探索练习的主要部分:(完整代码的链接位于参考部分)
步骤 1:创建合成温度数据集的函数
def create_temperature_dataset ( length, num_samples ):
np.random.seed( 0 )
x = np.linspace( 0 , length, num_samples)
seasonal = 10 + 10 * np.sin( 2 * np.pi * x / 365 )
noise = np.random.normal( 0 , 2 , num_samples)
y = seasonal + noise
return x, y
创建数据集
x, y = create_temperature_dataset( 365 , 3650 )
绘制数据集
图 1:该图显示了 365 天的温度(包括噪声)
步骤 2:定义 PyTorch 数据
集类 TimeSeriesDataset(Dataset):
def init(self,data,backcast_length,forecast_length):
self.data = data
self.backcast_length = backcast_length
self.forecast_length = Forecast_length
def __len__(self):
return len(self.data)-self.backcast_length-self.forecast_length
def __getitem__(self,index):
x = self.data[index:index + self.backcast_length]
y = self.data[index + self.backcast_length:index + self.backcast_length + self.forecast_length]
return torch.tensor(x,dtype=torch.float32),torch.tensor(y,dtype=torch.float32)
参数
backcast_length = 30forecast_length
= 7
创建数据集
dataset = TimeSeriesDataset(y,backcast_length,forecast_length)
dataloader =数据加载器(数据集,batch_size= 32,shuffle= True)
PyTorch 中的类TimeSeriesDataset旨在利用回溯和预测技术来处理时间序列数据。它需要三个参数进行初始化:(data时间序列数据)、backcast_length(要考虑的过去时间步数)和forecast_length(要预测的未来时间步数)。该类具有返回数据集长度和获取数据样本的方法,将时间序列的片段转换为张量。在此示例中,如果设置backcast_length为 30 和forecast_length7,则可以创建数据集的实例和 DataLoader 来处理数据的批处理和混洗,如下所示:dataset = TimeSeriesDataset(y, backcast_length, forecast_length)和dataloader = DataLoader(dataset, batch_size=32, shuffle=True)。此设置通过提供高效的数据处理来促进模型的训练。
步骤 3:定义和训练 N-BEATS 模型
device = ‘cuda’ if torch.cuda.is_available() else ‘cpu’
定义 N-BEATS 模型
model = NBeatsNet(
device=device,
stack_types=(NBeatsNet.GENERIC_BLOCK, NBeatsNet.GENERIC_BLOCK),
Forecast_length=forecast_length,
backcast_length=backcast_length,
hidden_layer_units= 128
).to(device)
定义损失和优化器
criterion = torch.nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters())
训练循环
epochs = 50
for epoch in range (epochs):
for x_batch, y_batch in dataloader:
x_batch, y_batch = x_batch.to(device), y_batch.to(device)
optimizer.zero_grad()
backcast, Forecast = 模型(x_batch)
损失 = 标准(预测,y_batch)
损失.backward()
优化器.step()
如果(epoch + 1)%10 == 0:
打印(f'Epoch {epoch + 1 } / {epochs},损失:{loss.item()} ')
N-BEATS 模型使用一系列完全连接的层,这些层被组织成块,每个块都有用于回溯和预测的子网络。该模型配置了回溯和预测长度以及隐藏单元数量等参数,可以捕获复杂的数据模式。
损失函数设置为均方误差 (MSE),Adam 优化器会调整模型的参数以最小化此损失。训练涉及对数据集进行几个时期的迭代、处理数据批次、计算预测以及通过反向传播更新参数。通过检查损失值来监控进度,以确保有效学习。
步骤 4:可视化回溯、预测和模型权重
model. eval ()
x_batch, y_batch = next ( iter (dataloader))
x_batch, y_batch = x_batch.to(device), y_batch.to(device)
with torch.no_grad():
backcast, Forecast = model(x_batch)
转换为 numpy 进行绘图
backcast = backcast.cpu().numpy()
Forecast = Forecast.cpu().numpy()
x_batch = x_batch.cpu().numpy()
y_batch = y_batch.cpu().numpy()
绘制结果
Redracted
可视化模型权重
weights = [param.cpu().data.numpy() for param in model.parameters()]
绘制前几层的权重以便说明
Redracted
可视化回测、预测和模型权重
要可视化回溯预测、预测和模型权重,请将模型设置为评估模式并从 DataLoader 获取一批数据。使用此批数据计算回溯预测和预测,而无需更新模型参数。将这些结果转换为 NumPy 数组以进行绘图。
创建图表以显示回测输入、实际预测、预测回测和预测。使用 matplotlib 显示这些结果,显示时间序列和预测。
该图直观地展示了 N-BEATS 模型的性能。
蓝线代表回溯输入,即模型用来进行预测的历史数据。
橙色线表示实际预测,即我们想要预测的真实未来值。
绿线显示模型的回测,表示模型重建过去数据点的程度。
红线表示模型的预测,即预测的未来值。将实际预测与模型预测进行比较有助于评估模型根据历史数据预测未来趋势的准确性和有效性。
可视化模型权重
接下来,提取并可视化模型权重。将模型参数转换为 NumPy 数组,并绘制前几层的权重以供说明。这有助于理解模型学习到的特征和模式。N-BEATS 模型权重的可视化揭示了以下内容:
第 1 层权重:该层的权重范围为 -0.4 到 0.4,分布密集且有大量小波动,表明它捕获了数据中的详细模式。
第 2 层权重:这些权重具有相似的范围,但分布更稀疏,表明该层识别了更广泛的趋势和变化。
第 3 层权重:此层的权重范围从 -0.4 到 0.4,像第 1 层一样密集排列,突出了该层在捕捉复杂细节方面的作用。
第 4 层权重:此层的权重范围为 -0.10 到 0.15,波动更明显,表明与前几层相比,它捕获了不同的模式和特征。
第 1 层权重
第 2 层权重
第 3 层权重
第 4 层权重
N-BEATS 示例中的关键超参数
您的模型并不总是能为您提供最佳性能,您可以使用 MSE、MAE 等指标来对其进行基准测试。超参数调整是让您的模型适应特定用例的好方法。以下是可以调整以获得最佳性能的常见参数。
学习率
描述:这控制模型根据所见错误调整权重的速度。学习率越高,调整幅度越大,而学习率越低,调整幅度越小。
典型用法:从 0.001 等常见值开始,并根据性能进行调整。如果模型训练速度太慢或卡住,请考虑增加学习率。如果模型的训练损失波动很大或学习速度太快(这可能会跳过最佳解决方案),请降低学习率。
2. 周期数
描述:这指的是模型将查看整个数据集的次数。更多的 epoch 意味着模型有更多的学习和调整机会。
典型用途:如果模型拟合不足,请尝试增加训练周期数。如果模型拟合过度,请减少训练周期数,或采用提前停止等技术,在验证性能下降时停止训练。
3. 批次大小
描述:这决定了模型在更新权重之前看到的数据点数量。较大的批量大小可以加快计算速度,但可能会影响模型的泛化能力。
典型用途:较小的批处理大小通常可以提供更稳健的收敛,但代价是增加计算时间。如果您的模型的性能在各个时期之间变化太大,请考虑减小批处理大小以提高稳定性。
4. 层数和每层神经元的数量
描述:在您的模型中,这与fc1和fc2层的配置有关。这些层的大小和数量决定了模型学习复杂模式的能力。
典型用途:更多的神经元和层可以模拟更复杂的函数,但也会导致过度拟合。从较简单的架构开始,并根据需要增加复杂性。如果模型太简单而无法捕捉数据中的趋势或季节性,则增加神经元的数量。
5. 网络架构调整
描述:激活函数的选择会影响网络对非线性关系建模的效果。在您的示例中,使用了 ReLU,这是许多任务的常见选择。
典型用途:ReLU 因其简单性和效率而在许多情况下效果很好。但是,如果您怀疑模型存在 ReLU 消亡问题(神经元持续输出零),请考虑使用 Leaky ReLU 或 ELU 等变体。
定义超参数网格
hyperparams = {
'backcast_length' : [ 15 , 30 , 60 ],
'forecast_length' : [ 5 , 7 , 10 ],
'hidden_layer_units' : [ 64 , 128 , 256 ],
'num_blocks' : [ 2 , 3 , 4 ],
'learning_rate' : [ 0.001 , 0.01 , 0.1 ],
'batch_size' : [ 16 , 32 , 64 ],
'epochs' : [ 50 , 100 , 200 ]
}
结论
N-BEATS 不仅仅是一个预测工具,它还是一个强大且可解释的框架,可使深度学习在时间序列分析中普及。它能够清晰地洞察预测的驱动因素,这对于依赖准确、可解释预测的企业来说非常有价值。
号召行动
对于那些希望突破时间序列预测界限的人来说,实施 N-BEATS 可以完美地结合性能和可解释性,从而改变决策过程。尝试将 N-BEATS 应用于您的数据,并深入了解它可以提供的深度见解。
有用的资源
完整代码可在此处访问:Google Collab N-BEAT
探索原始研究论文以深入了解 N-BEATS。
在 GitHub 上查看N-BEATS 的实现,开始试验该模型。
进一步阅读时间序列预测可以扩展您对这些模型的理解和在现实场景中的应用。
本文弥合了复杂的理论模型与实际可操作的见解之间的差距,帮助您在预测工作中利用 N-BEATS 的强大功能。
https://arxiv.org/abs/1905.10437
https://github.com/philipperemy/n-beats?tab=readme-ov-file
https://medium.com/@captnitinbhatnagar/n-beats-the-unique-interpretable-deep-learning-model-for-time-series-forecasting-8dfdefaf0e34
更多推荐
所有评论(0)