TimesNet:时间序列预测的最新模型

news2025/4/25 3:18:11

2020年发布的N-BEATS、2022年发布的N-HiTS和2023年3月发布的PatchTST开始。N-BEATS和N-HiTS依赖于多层感知器架构,而PatchTST利用了Transformer架构。

2023年4月发表了一个新的模型,它在时间序列分析的多个任务中实现了最先进的结果,如预测、imputation、分类和异常检测:TimesNet。

TimesNet由Wu、Hu、Liu等人在他们的论文《TimesNet: Temporal 2D-Variation Modeling For General Time Series Analysis》中提出。

与以前的模型不同,它使用基于cnn的架构来跨不同的任务获得最先进的结果,使其成为时间序列分析的基础模型的绝佳候选。

在本文中,我们将探讨TimesNet的架构和内部工作原理。然后将该模型应用于预测任务,与N-BEATS和N-HiTS进行对比。

TimesNet

TimesNet背后的动机来自于许多现实生活中的时间序列表现出多周期性的认识。这意味着变化发生在不同的时期。

例如,室外温度有日周期和年周期。通常,白天比晚上热,夏天比冬天热。这些多个时期相互重叠和相互作用,使得很难单独分离和建模。

周期内变化是指温度在一天内的变化,周期间变化是指温度每天或每年的变化。所以TimesNet的作者提出在二维空间中重塑序列,以模拟周期内和周期间的变化。

TimesNet的架构

从上图中,我们可以看到TimesNet是多个带有跳过连接的TimesBlock的堆栈。

在每个TimesBlock中,首先通过快速傅立叶变换(FTT)来找到数据中的不同周期。然后被重塑为一个2D向量,并发送到一个Inception块中,在那里它学习并预测该系列的2D表示。然后使用自适应聚合将该深度表示重塑回一维向量。

捕捉多周期性

为了捕获时间序列中多个时期的变化,作者建议将一维序列转换为二维空间,同时模拟周期内和周期间的变化。

在上图中,我们可以看到模型是如何表示二维空间中的变化的。在红色矩形内可以看到周期内的变化,也就是数据在一个周期内的变化。然后蓝色矩形包含周期间变化,这是数据如何从一个时期到另一个时期的变化。

为了更好地理解这一点,假设我们有以周为周期的每日数据。周期间变化是指数据在周一、周二、周三等期间的变化情况。

那么,周期间变化就是数据从第1周的星期一到第2周的星期一,从第1周的星期二到第2周的星期二的变化。换句话说,它是同一阶段的数据在不同时期的变化。

然后,这些变化在二维空间中表示,其中周期间变化是垂直的,周期内变化是水平的。这使得模型能够更好地学习数据变化的表示。

一维矢量表示的是相邻点之间的变化,而二维矢量表示的是相邻点和相邻周期之间的变化,给出了一个更完整的图像。

原理看着很简单,但是还有一个最重要的问题:如何找到周期?

确定周期性

为了识别时间序列中的多个周期,该模型应用了快速傅里叶变换(FTT)。

这是一个数学运算,将信号转换成频率和幅度的函数。

在上图中,作者说明了金融交易税是如何应用的。一旦我们有了每个周期的频率和幅度,幅度最大的就被认为是最相关的。

例如,下面是对eth1数据集执行FTT的结果。

在上图中,快速傅里叶变换能够快速识别数据中的日周期和年周期,因为我们在这些周期中看到更高的振幅峰值。

一旦应用了FTT,用户可以设置一个参数k来选择top-k最重要的周期,这些周期是振幅最大的周期。

然后,TimesNet为每个周期创建2D向量,并将这些向量发送到2D内核以捕获时间变化。

TimesBlock

一旦序列进行了傅里叶变换,并为前k个周期创建了二维张量,数据就被发送到Inception 块,如下图所示。

TimesBlock是最主要的模型组件:Inception模块是2015年发布的计算机视觉模型GoogLeNet的构建块。

Inception模块的主要思想是通过保持数据稀疏来有效地表示数据。这样就可以在技术上增加神经网络的大小,同时保持其计算效率。

这是通过执行各种卷积和池化操作来实现的,然后将所有内容连接起来。在TimesNet的上下文中,这就是Inception模块的样子。

什么作者选择视觉模型来处理时间序列数据。

一个简单的答案是,视觉模型特别擅长解析2D数据,比如图像。另一个好处是可以在TimesNet可以更其他的视觉主干。

自适应聚合

要执行聚合,必须首先将2D表示重塑为1D向量。

使用自适应聚合的原因是不同的周期有不同的振幅,这表明了它们的重要性。

这就是为什么FTT的输出也被发送到softmax层,这样可以使用每个周期的相对重要性进行聚合。

聚合的数据是单个TimesBlock的输出。然后将多个TimesBlock与残差连接叠加创建TimesNet模型。

TimesNet预测

现在让我们将TimesNet模型应用于预测任务,并将其性能与N-BEATS和N-HiTS进行比较。

我们使用了知识共享署名许可下发布的Etth1数据集。这是文献中广泛使用的时间序列预测基准。它跟踪每小时的变压器油温,这反映了设备的状况。

导入库并读取数据,这里我们使用Nixtla提供的NeuralForecast实现。

 import numpy as np
 import pandas as pd
 import matplotlib.pyplot as plt
 
 from neuralforecast.core import NeuralForecast
 from neuralforecast.models import NHITS, NBEATS, TimesNet
 
 from neuralforecast.losses.numpy import mae, mse

读取CSV文件。

 df = pd.read_csv('data/etth1.csv')
 df['ds'] = pd.to_datetime(df['ds'])
 df.head()

在上图中,请注意数据集已经具有NeuralForecast所期望的格式。包需要三列:

  • ds:日期列
  • id列:unique_id
  • y值列

然后,我们先看看数据

 fig, ax = plt.subplots()
 
 ax.plot(df['y'])
 ax.set_xlabel('Time')
 ax.set_ylabel('Oil temperature')
 
 fig.autofmt_xdate()
 plt.tight_layout()

现在我们开始预测,使用96小时的预测长度,这是文献中长期预测的常见长度。

我们还保留了两个96个时间步长的窗口来评估我们的模型。

我们定义一个我们想要用来执行预测任务的模型列表。这里将使用N-BEATS, N-HiTS和TimesNet。

保留所有模型的默认参数,并将最大epoch数限制为50。请注意,默认情况下,TimesNet将选择数据中最重要的前5个轮次。

 horizon = 96
 
 models = [NHITS(h=horizon,
                input_size=2*horizon,
                max_steps=50),
          NBEATS(h=horizon,
                input_size=2*horizon,
                max_steps=50),
          TimesNet(h=horizon,
                  input_size=2*horizon,
                  max_steps=50)]

下一步是用模型列表和数据频率(每小时一次)实例化NeuralForecasts对象。

 nf = NeuralForecast(models=models, freq='H')

然后运行交叉验证,这样就有了数据集的预测值和实际值。可以评估每个模型的性能。

 preds_df = nf.cross_validation(df=df, step_size=horizon, n_windows=2)

我们可以看到实际值,以及来自我们指定的每个模型的预测。这样可以很容易地将预测与实际值相比较。

 fig, ax = plt.subplots()
 
 ax.plot(preds_df['y'], label='actual')
 ax.plot(preds_df['NHITS'], label='N-HITS', ls='--')
 ax.plot(preds_df['NBEATS'], label='N-BEATS', ls=':')
 ax.plot(preds_df['TimesNet'], label='TimesNet', ls='-.')
 
 ax.legend(loc='best')
 ax.set_xlabel('Time steps')
 ax.set_ylabel('Oil temperature')
 
 fig.autofmt_xdate()
 plt.tight_layout()

在上图中,似乎所有的模型都无法预测测试集中观察到的油温下降。但是可以看到N-BEATS和N-HiTS已经捕捉到了一些在TimesNet的预测中没有观察到的周期性模式。

但是最终还需要通过计算MSE和MAE来评估模型,以确定哪个模型是最好的。

 data = {'N-HiTS': [mae(preds_df['NHITS'], preds_df['y']), mse(preds_df['NHITS'], preds_df['y'])],
        'N-BEATS': [mae(preds_df['NBEATS'], preds_df['y']), mse(preds_df['NBEATS'], preds_df['y'])],
        'TimesNet': [mae(preds_df['TimesNet'], preds_df['y']), mse(preds_df['TimesNet'], preds_df['y'])]}
 
 metrics_df = pd.DataFrame(data=data)
 metrics_df.index = ['mae', 'mse']
 
 metrics_df.style.highlight_min(color='lightgreen', axis=1)

从上图可以看出,N-HiTS获得最低的MAE,而N-BEATS获得最低的MSE。MAE的差异为0.002,MSE的差异为0.00025。由于MSE的差异非常小,特别是考虑到误差是平方的,所以我认为N-HiTS是这项任务的首选模型。

总结

本文并不是要证明TimesNet有多好,因为不同的模型可能适应不同的任务,并且我们也没有进行超参数优化,我们介绍TimesNet的主要目的是他的思路,它不仅将cnn的架构引入了时间序列预测,并且还提供了一种周期性判别的新的思路,这些都是值得我们学习的。

一如既往,每个预测问题都需要一个独特的方法和一个特定的模型,所以你可以在你的模型列表中增加一个TimesNet了。

本文代码:

https://avoid.overfit.cn/post/337d0605c21f49c5bb9c65c46d2142cd

作者:Marco Peixeiro

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1087108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pdf怎么压缩?pdf文件缩小的方法在这里

PDF文件由于其跨平台、可打印性强等特点,成为了我们日常工作中经常使用的一种文件格式。然而,这种格式的文件有时候会因为过于庞大而给我们的存储和传输带来困扰,其实,这种情况只需要通过一些工具对PDF文件进行压缩,即…

网站为什么需要https证书以及如何申请

随着互联网的快速发展,网站的安全性问题越来越受到人们的关注。因此,越来越多的网站开始使用https证书,以保护用户的数据安全和隐私。那么,网站为什么需要https证书呢? 首先,https证书可以提供加密保护&…

《RISC-V体系结构编程与实践》的benos_payload程序——mysbi跳转到benos分析

1、benos_payload.bin结构分析 韦东山老师提供的开发文档里已经对程序的结构做了分析,这里不再赘述,下面是讨论mysbi跳转到benos的问题; 2、mysbi跳转到benos的代码 3、跳转产生的疑问 我认为mysbi.bin最后跳转到0x22000地址处执行&#xff0…

如何防止内部员工数据外泄?

首先,数据对于企业的价值和意义无需多说,数据价值的发挥和利用以数据安全为基础。当数据创造价值的同时,也面临着被窃取泄露、滥用、非法利用的风险,进而对个人、组织甚至整个社会、国家的利益产生严重威胁和损害。近年来&#xf…

苹果手机备份软件哪个好用?有哪些免费的第三方备份软件

备份手机数据一直是一个让人头疼的问题,尤其对于iPhone用户来说。尽管iCloud和iTunes提供了方便的备份选项,但是有时候,我们可能需要更多高级功能或者更直观的操作界面。本文将介绍几款好用的苹果手机备份软件。 一、主流苹果备份软件 1.iClo…

ORA-48140: the specified ADR Base directory does not exist?手动创建pfile启动失败

1.描述问题 ORA-48108: invalid value given for the diagnostic_dest init.ora parameterORA-48140: the specified ADR Base directory does not exist [/u01/app/oracle/product/11.2.0/db_1/dbs/<ORACLE_BASE>]ORA-48187: specified directory does not exist Linux-…

【C++程序员必修第一课】C++基础课程-02:快速入门

1 本课主要内容&#xff1a; 简单介绍 VS2019 开发工具基本使用C 开发基本概念、函数、变量、注释、if 判断、for 循环、while 循环等 2 主要知识点&#xff1a; VS主界面介绍 VS 主界面简单介绍&#xff1b;解决方案下面包含项目&#xff0c;项目下面包含有头文件、源文件…

Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别

前言 今天给大家分享一个SpringBoot整合Tess4j库实现图片文字识别的小案例&#xff0c;希望xdm喜欢。 文末有案例代码的Git地址&#xff0c;可以自己下载了去玩玩儿或继续扩展也行。 话不多说&#xff0c;开整吧。 什么是Tess4j库 先简单给没听过的xdm解释下&#xff0c;这里要…

和鲸 ModelWhale 与华为 OceanStor 2910 计算型存储完成兼容性测试

数智化时代&#xff0c;数据总量的爆炸性增长伴随着人工智能、云计算等技术的发展&#xff0c;加速催化了公众对于数据存储与应用的多元化需求。同时&#xff0c;数据也是重要的基础资源和战略资源&#xff0c;需要严格保障其安全性、完整性。搭建国产数据基础设施底座&#xf…

一元交友盲盒在线搭建完整教程 前后端分离 可二开

大家好啊&#xff0c;今天来给大家分享一个最近很火的一元交友盲盒小程序的搭建教程。 系统搭建教程&#xff1a; 需求分析与规划&#xff1a;明确系统的基本功能需求&#xff0c;如用户注册、登录、浏览和匹配其他用户、聊天、付费参与盲盒等。选择合适的平台和框架&#xff…

【Rust基础①】基本类型、所有权与借用、复合类型

文章目录 1 基本类型1.1 数值类型1.1.1 Rust 中的内置的整数类型&#xff1a;1.1.2 浮点类型1.1.3 数学运算1.1.4 位运算1.1.5 序列(Range) 1.2 字符、布尔、单元类型1.3 语句和表达式1.4 函数 2 所有权与借用2.1 栈(Stack)与堆(Heap)2.2 所有权原则2.2.1 转移所有权2.2.2 克隆…

rtsp_topic

1.打开推流服务器 2.接收ros图像 3.ffmpeg命令推流 pushflow.cpp // 1.包含头文件&#xff1b; #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" #include <iostream> #include <csignal> #include <opencv4/opencv2/o…

什么是好的数据库设计?

良好的数据库设计对确保数据的准确性、一致性和完整性至关重要&#xff0c;同时确保数据库高效、可靠且易于使用。设计必须解决快速且轻松地存储和检索数据的问题&#xff0c;同时稳定地处理大量数据。经验丰富的数据库设计师可以创建一个强大、可扩展和安全的数据库架构&#…

3.1 SQL概述

思维导图&#xff1a; 前言&#xff1a; 前言笔记&#xff1a;第3章 关系数据库标准语言SQL - **SQL的定义**&#xff1a; - 关系数据库的标准和通用语言。 - 功能强大&#xff0c;不仅限于查询。 - 功能覆盖&#xff1a;数据库模式创建、数据插入/修改、数据库安全性与…

爱德华、书客、柏曼的护眼台灯谁的护眼能力更好?三款护眼台灯真实测评

为人父母以后最大的感受就是希望孩子能够健康成长&#xff0c;而且现在生活水平也变好了&#xff0c;都想尽可能给孩子最好的&#xff0c;什么学习专用的书桌啊、柜子啊、学习用品等等。但是随着孩子慢慢步入更高的年级&#xff0c;作业也在不断增加&#xff0c;孩子完成作业的…

处理ElementUI组件默认样式多次重复问题

问题截图&#xff1a; 解决办法&#xff1a; 在postcss.config.js文件里添加配置项&#xff1a; module.exports {plugins: {autoprefixer: {},cssnano: {} //添加这行代码}, } 处理结果&#xff1a; github issues&#xff1a; https://github.com/ElemeFE/element/is…

如何使用前端包管理器(如npm、Yarn)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

React js原生 详解 HTML 拖放 API(鼠标拖放功能)

最近碰到了个需求&#xff0c;大概就是要通过可视化拖拽的方式配置一个冰柜&#xff0c;需要把预设好的冰柜内部架子模板一个个拖到冰箱内。一开始的想法是用鼠标事件&#xff08;mousedown、mouseup等&#xff09;那一套去实现&#xff0c;能实现但是过程过于复杂&#xff0c;…

Linux 回顾总结

学习前提&#xff08;环境搭建&#xff09;&#xff1a;RHCSA Linux环境搭建-CSDN博客 目录 一、shell 二、文件 三、用户和组管理 四、权限 五、软件 六、网络 七、磁盘 一、shell Linux的操作界面常称为Shell&#xff0c;Shell是操作系统提供给用户使用的界面&#xf…