BiTCN:基于卷积网络的多元时间序列预测

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 该文探讨了时间序列预测中模型架构的选择,指出尽管MLP和Transformer模型常见,但CNN在预测领域的应用较少。BiTCN是一种利用两个时间卷积网络来编码历史和未来协变量的模型,提出于《Parameter-efficient deep probabilistic forecasting》(2023年3月)。它包含多个由扩张卷积、GELU激活函数、dropout和全连接层组成的临时块,有效地处理序列数据。实验表明,BiTCN在具有外生特征的预测任务中表现优于N-HiTS和PatchTST。BiTCN的效率和性能展示了CNN在时间序列预测中的潜力。

在时间序列预测领域中,模型的体系结构通常依赖于多层感知器(MLP)或Transformer体系结构。

基于mlp的模型,如N-HiTS, TiDE和TSMixer,可以在保持快速训练的同时获得非常好的预测性能。基于Transformer的模型,如PatchTST和ittransformer也取得了很好的性能,但需要更多的内存和时间来训练。

有一种架构在预测中仍未得到充分利用:卷积神经网络(CNN)。CNN已经应用于计算机视觉,但它们在预测方面的应用仍然很少,只有TimesNet算是最近的例子。但是CNN已经被证明在处理序列数据方面是有效的,并且它们的架构允许并行计算,这可以大大加快训练速度。

在本文中,我们将详细介绍了BiTCN,这是2023年3月在《Parameter-efficient deep probabilistic forecasting》一文中提出的模型。通过利用两个时间卷积网络(TCN),该模型可以编码过去和未来的协变量,同时保持计算效率。

BiTCN

BiTCN使用了两个时间卷积网络,因此被称为BiTCN。一个TCN负责编码未来的协变量,而另一个负责编码过去的协变量和序列的历史值。这样模型可以从数据中学习时间信息,并且卷积的使用保持了计算效率。

让我们仔细看看它的架构,BiTCN的体系结构由许多临时块组成,其中每个块由:

一个扩张卷积,一个GELU激活函数,然后是dropout ,最后紧接着一个全连接的层

上图中可以看到每个时态块产生一个输出o,最终的预测是将每个块的所有输出叠加在N层中得到的。

虽然dropout层和全连接层是神经网络中常见的组件,所以我们详细地扩张卷积和GELU激活函数。

扩张卷积

为了更好地理解扩展卷积的目的,我们回顾一下默认卷积是如何工作的。

在上图中,我们可以看到一维输入的典型卷积。输入序列左填充零,以确保输出长度相同。

如果核大小为3,步幅为1,,则输出张量的长度也为4。

可以看到,输出的每个元素都依赖于三个输入值。也就是说输出取决于索引处的值和前两个值。

这就是我们所说的感受野。因为我们正在处理时间序列数据,所以增加接受域将是有益的,这样输出的计算可以着眼于更长的历史。

我们可以简单的增加核的大小,或者堆叠更多的卷积层。但增加内核大小并不是最好的选择,因为可能会丢失信息,并且模型可能无法学习数据中的有用关系。那么叠加更多的卷积如何呢?

可以看到,通过使用核大小为3的卷积操作堆叠两个卷积,输出的最后一个元素现在依赖于输入的五个元素,感受野从3个增加到5个。

但是以这种方式增加接受野将导致非常深的网络,所以就出现了使用扩展卷积,它可以在增加感受野,同时避免向模型添加太多层

在上图中,我们可以看到运行扩展卷积的结果。每两个元素都会生成一个输出。因此可以看到,我们现在有5个感受野,而不需要堆叠卷积。

为了进一步增加接受野,我们使用膨胀基数(通常设置为2)堆叠许多稀释的核。这意味着第一层将是2¹膨胀的核,然后是2²膨胀的内核,然后是2³,以此类推。

这样模型可以考虑更长的输入序列来生成输出。通过使用膨胀基数可以保持合理的层数。

GELU激活函数

许多深度学习架构采用了ReLU激活函数。

可以看到ReLU只是取0和输入之间的最大值。也就是说如果输入为正,则返回输入。如果输入为负,则返回零。

虽然ReLU有助于缓解梯度消失的问题,但它也会产生所谓的“Dying ReLU”问题。当网络中的某些神经元只输出0时,就会发生这种情况,这意味着它们不再对模型的学习做出贡献。为了应对这种情况,可以使用GELU。

有了这个函数,当输入小于零时,激活函数允许小的负值。

这样神经元就不太可能消亡,因为非零值可以用负输入返回。为反向传播提供了更丰富的梯度,并且我们可以保持模型能力的完整性。

BiTCN完整架构

现在我们了解了BiTCN中临时块的内部工作原理,让我们看看它是如何在模型中组合在一起的。

在上图中可以看到滞后值在通过密集层和时间块堆栈之前与所有过去的协变量组合在一起。

我们还看到分类协变量首先被嵌入,然后再与其他协变量组合。这里过去和未来的协变量都组合在一起,如下所示。输出则是来自滞后值和协变量的信息的组合,如下所示。

上图额蓝点表示输入序列,黄点表示输出序列,红点表示未来协变量。我们可以看到具有扩展卷积的前瞻性时间块如何通过处理来自未来协变量的信息来帮助告知输出。

最后,BiTCN使用学生t分布来构建预测周围的置信区间。

使用BiTCN进行预测

下面我们将BiTCN与N-HiTS和PatchTST一起应用于长期预测任务。

我们用它来预测一个博客网站的每日浏览量。该数据集包含每日浏览量,以及外生特征,如新文章发表日期的指标,以及美国假期的指标。

我们使用库neuralforecast,因为这是唯一一个提供支持外生特性的BiTCN的即用型实现的库。本文的代码和数据都会在最后提供。

 import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt

 from neuralforecast.core import NeuralForecast
 from neuralforecast.models import NHITS, PatchTST, BiTCN

将数据读入DataFrame。

 df = pd.read_csv('https://raw.githubusercontent.com/marcopeix/time-series-analysis/master/data/medium_views_published_holidays.csv')
 df['ds'] = pd.to_datetime(df['ds'])

可以先看看数据

 published_dates = df[df['published'] == 1]
 holidays = df[df['is_holiday'] == 1]

 fig, ax = plt.subplots(figsize=(12,8))

 ax.plot(df['ds'], df['y'])
 ax.scatter(published_dates['ds'], published_dates['y'], marker='o', color='red', label='New article')
 ax.scatter(holidays['ds'], holidays['y'], marker='x', color='green', label='US holiday')
 ax.set_xlabel('Day')
 ax.set_ylabel('Total views')
 ax.legend(loc='best')

 fig.autofmt_xdate()

 plt.tight_layout()

我们可以清楚地看到每周的季节性,工作日的访问量比周末要多。

访问高峰通常伴随着新文章的发布(用红点表示),因为新内容通常会带来更多的流量。最后还可以看到美国的节假日(用绿色十字标记)通常意味着流量较低。

所以我们可以确定,这是一个受外生特征影响明显的数据,它可以成为BiTCN的一个很好的用例。

数据处理

我们将数据分成训练集和测试集。我们保留最后28个条目进行测试。

 train = df[:-28]
 test = df[-28:]

然后,我们创建一个DataFrame,其中包含预测范围的日期,以及外生变量的未来值。

提供外生变量的未来值是有意义的,因为未来的美国假期日期是提前知道的,并且文章的发布也是可以有计划的。

 future_df = test.drop(['y'], axis=1)

建模

我们在这个项目中使用了N-HiTS(基于mlp), BiTCN(基于cnn)和PatchTST(基于transformer)。

N-HiTS和BiTCN都支持外生特征建模,但PatchTST不支持。

这个实验的步长被设置为28,因为这覆盖了我们测试集的整个长度。

 horizon = len(test)

 models = [
     NHITS(
         h=horizon,
         input_size = 5*horizon,
         futr_exog_list=['published', 'is_holiday'],
         hist_exog_list=['published', 'is_holiday'],
         scaler_type='robust'),
     BiTCN(
         h=horizon,
         input_size=5*horizon,
         futr_exog_list=['published', 'is_holiday'],
         hist_exog_list=['published', 'is_holiday'],
         scaler_type='robust'),
     PatchTST(
         h=horizon,
         input_size=2*horizon,
         encoder_layers=3,
         hidden_size=128,
         linear_hidden_size=128,
         patch_len=4,
         stride=1,
         revin=True,
         max_steps=1000
     )
 ]

然后,我们简单地在训练集上拟合我们的模型。

 nf = NeuralForecast(models=models, freq='D')
 nf.fit(df=train)

使用外生特征的未来值来生成预测。

 preds_df = nf.predict(futr_df=future_df)

评估模型

首先将预测值和实际值连接到一个DataFrame中。

 test_df = pd.merge(test, preds_df, 'left', 'ds')

根据实际值绘制预测图,结果如下图所示。

在上图中,我们可以看到所有模型似乎都过度预测了实际流量。让用MAE和sMAPE来看看模型的实际对比

 from utilsforecast.losses import mae, smape
 from utilsforecast.evaluation import evaluate

 evaluation = evaluate(
     test_df,
     metrics=[mae, smape],
     models=["NHITS", "BiTCN", "PatchTST"],
     target_col="y",
 )

 evaluation = evaluation.drop(['unique_id'], axis=1)
 evaluation = evaluation.set_index('metric')

 evaluation.style.highlight_min(color='blue', axis=1)

可以看到BiTCN实现了最好的性能,因为该模型的MAE和sMAPE是最低的。

虽然这个实验本身并不是BiTCN的稳健基准,但是可以证明它在具有外生特征的预测环境中取得了最佳结果。

总结

BiTCN模型利用两个时间卷积网络对协变量的过去值和未来值进行编码,以实现有效的多变量时间序列预测。

在我们的小实验中,BiTCN取得了最好的性能,卷积神经网络在时间序列领域的成功应用很有趣,因为大多数模型都是基于mlp或基于transformer的。

BiTCN:Parameter-efficient deep probabilistic forecasting

https://avoid.overfit.cn/post/ea66d229a5c041a6bd27af74205bdaee

作者:Marco Peixeiro

目录
相关文章
|
14天前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
44 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其应用
【9月更文挑战第24天】本文将深入探讨深度学习中的一种重要模型——卷积神经网络(CNN)。我们将通过简单的代码示例,了解CNN的工作原理和应用场景。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息。
29 1
|
13天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【9月更文挑战第19天】在人工智能的浩瀚星海中,卷积神经网络(CNN)如同一颗璀璨的星辰,照亮了图像处理的天空。本文将深入CNN的核心,揭示其在图像识别领域的强大力量。通过浅显易懂的语言和直观的比喻,我们将一同探索CNN的奥秘,并见证它如何在现实世界中大放异彩。
|
13天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
65 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
13天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
60 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
13天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
43 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
9天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
22 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1天前
|
机器学习/深度学习 人工智能 算法
深入理解卷积神经网络:从理论到实践
【9月更文挑战第31天】在深度学习的众多模型之中,卷积神经网络(CNN)以其在图像处理领域的出色表现而闻名。本文将通过浅显易懂的语言和直观的比喻,带领读者了解CNN的核心原理和结构,并通过一个简化的代码示例,展示如何实现一个简单的CNN模型。我们将从CNN的基本组成出发,逐步深入到其在现实世界中的应用,最后探讨其未来的可能性。文章旨在为初学者提供一个清晰的CNN入门指南,同时为有经验的开发者提供一些深入思考的视角。
|
1天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【9月更文挑战第31天】本文旨在通过浅显易懂的语言和直观的比喻,为初学者揭开深度学习中卷积神经网络(CNN)的神秘面纱。我们将从CNN的基本原理出发,逐步深入到其在图像识别领域的实际应用,并通过一个简单的代码示例,展示如何利用CNN进行图像分类。无论你是编程新手还是深度学习的初学者,这篇文章都将为你打开一扇通往人工智能世界的大门。
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)入门与实践
【8月更文挑战第62天】本文以浅显易懂的方式介绍了深度学习领域中的核心技术之一——卷积神经网络(CNN)。文章通过生动的比喻和直观的图示,逐步揭示了CNN的工作原理和应用场景。同时,结合具体的代码示例,引导读者从零开始构建一个简单的CNN模型,实现对图像数据的分类任务。无论你是深度学习的初学者还是希望巩固理解的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。
下一篇
无影云桌面