轻量化的长时间序列预测模型

news2025/1/15 9:20:39


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

概述

SparseTSF模型

交叉周期稀疏预测

归一化

损失函数

代码解读

实验

实验结果分析

总结


本文所有资源均可在该地址处获取。

准确的预测可以帮助决策者进行前瞻性规划。通常,为了实现精确的预测,需要依赖强大而复杂的深度学习模型,例如递归神经网络(RNNs)、时间卷积网络(TCNs)和Transformer模型。

近年来,长期时间序列预测(LTSF)引起了越来越多的关注,它要求模型能够提供更长的预测视野以支持高级规划。然而,更长的预测视野也带来了更大的不确定性,这要求模型能够从更长的历史窗口中提取更广泛的时间依赖性。

因此,模型变得更加复杂,以捕捉这些长期的时间依赖性。例如,基于Transformer的模型通常有数百万甚至数千万个参数,这限制了它们在计算资源受限的场景中的实用性。本文解读的文章是《SparseTSF: Modeling Long-term Time Series Forecasting with 1k Parameters》,这篇文章已被ICML 2024接受为Oral文章,SparseTSF是一种新型轻量级长期时间序列预测模型,使用不到1k参数,通过交叉周期稀疏预测技术,在保持低计算资源需求的同时,达到SOTA性能。

概述

准确进行长期时间序列预测的基础在于数据的固有周期性和趋势。例如,家庭电力消耗的长期预测,因为这类数据中存在清晰日常和每周的模式。文章提出了一种新的设计轻量级LTSF模型的视角,即通过分解和转换原始序列的周期性和趋势,将周期模式转换为子序列间的动态,而趋势模式则重新解释为子序列内的特征。

SparseTSF模型采用了交叉周期稀疏预测技术,通过下采样原始序列来专注于跨周期趋势预测,有效地提取周期特征,同时最小化模型的复杂性和参数数量。SparseTSF模型使用不到1k个参数,如下图,与现有模型相比,在参数规模上小了一到四个数量级,并且实现了接近SOTA的效果。

SparseTSF模型

LTSF的目标是使用历史观测窗口LL长度的多变量时间序列数据来预测未来HH长度的时间序列。这可以形式化为:

xˉt+1:t+H=f(xt−L+1:t)xˉt+1:t+H​=f(xt−L+1:t​)

其中,xt−L+1:t∈RL×Cxt−L+1:t​∈RL×C和 xˉt+1:t+H∈RH×Cxˉt+1:t+H​∈RH×C。这里,CC 是不同特征或通道的数量。

在处理多变量时间序列数据时,我们通常使用通道独立策略,即通过关注数据集中的单个单变量时间序列来简化预测过程。这种方法为每个单变量序列找到一个共享的函数,减少了考虑通道间关系的复杂性。

SparseTSF模型基于交叉周期稀疏预测技术,这一技术是SparseTSF的核心,通过下采样原始序列结合通道独立策略来专注于跨周期趋势预测,有效地提取周期特征,同时最小化模型的复杂性和参数数量。

交叉周期稀疏预测

假设时间序列xt−L+1:t(i)xt−L+1:t(i)​具有已知的周期性ww,首先将原始序列下采样成 ww 个子序列,每个子序列的长度为 n=⌊Lw⌋n=⌊wL​⌋。然后,对这些子序列进行预测。预测后,将 ww 个子序列上采样回完整的预测序列,每个子序列的长度为 m=⌊Hw⌋m=⌊wH​⌋。

交叉周期稀疏预测通过以下步骤简化预测任务:

  • 下采样:将具有固定周期性的数据序列下采样成子序列。例如,如果数据具有日周期性,可以将每天的数据下采样成一个数据点,形成一个新的子序列。具体操作为,将原始序列重塑为 n×wn×w 的矩阵,然后转置。
  • 稀疏滑动预测:对每个下采样的子序列进行趋势预测。这一步骤将原始的时间序列预测任务转化为跨周期趋势预测任务。具体操作为,在矩阵的最后一个维度上应用线性层,得到 w×mw×m 的矩阵。
  • 上采样:将预测出的子序列结果上采样回原始序列的长度,以得到完整的预测序列。具体操作为,转置 w×mw×m 矩阵并重塑为长度为 HH 的完整预测序列。

但由于每个周期只利用一个数据点进行预测,忽略了其余数据点,导致预测过程中信息丢失,进而准确率下降,同时预测过程会受到下采样时的可能出现的极值影响,导致预测结果出现大幅的偏移。

为了解决信息丢失和异常值影响放大的问题,文章还提出了在执行稀疏预测之前对原始序列进行滑动聚合的方法。每个聚合的数据点包含其周围周期内的其他点的信息,这有助于解决信息丢失问题。此外,由于聚合值是周围点的加权平均值,它减轻了异常值的影响。

由上图所示,SparseTSF可以被看作是一个稀疏连接的线性层,在各个时段执行滑动预测。按照通道独立策略,将原始数据的batchsize××时间序列××特征(即输出变量)维度调整为batchsize××特征××时间序列维度,这样滑动聚合就可直接通过应用一维卷积来实现,稀疏预测过程则直接简单使用线性层或MLP实现。

归一化

为了解决训练和测试数据集之间的分布偏移问题,文章采用了简单的归一化策略。具体来说,在模型输入前减去序列的均值,并在模型输出后加回。这个过程可以减少模型对数据分布变化的敏感性。

损失函数

SparseTSF模型采用均方误差(MSE)作为损失函数,以衡量预测值和实际值之间的差异。损失函数定义为:

L=1C∑i=1C∥yt+1:t+H(i)−xˉt+1:t+H(i)∥2L=C1​i=1∑C​∥∥∥∥​yt+1:t+H(i)​−xˉt+1:t+H(i)​∥∥∥∥​2

代码解读

SparseTSF模型的核心代码如下:

import torch
import torch.nn as nn
from layers.Embed import PositionalEmbedding

class Model(nn.Module):
    def __init__(self, configs):
        super(Model, self).__init__()

        # 从 configs 中获取参数
        self.seq_len = configs.seq_len # 模型的序列长度
        self.pred_len = configs.pred_len  # 预测长度
        self.enc_in = configs.enc_in  # 编码输入维度
        self.period_len = configs.period_len  # 周期长度
        self.d_model = configs.d_model  # 模型维度
        self.model_type = configs.model_type # 模型类型
        assert self.model_type in ['linear', 'mlp']

        # 计算下采样后的序列长度(seg_num_x)和预测序列长度(seg_num_y)
        self.seg_num_x = self.seq_len // self.period_len
        self.seg_num_y = self.pred_len // self.period_len

        # 初始化一个一维卷积层,用于滑动聚合
        self.conv1d = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=1 + 2 * (self.period_len // 2),
                                stride=1, padding=self.period_len // 2, padding_mode="zeros", bias=False)

        # 根据 model_type 初始化线性层或多层感知机
        if self.model_type == 'linear':
            self.linear = nn.Linear(self.seg_num_x, self.seg_num_y, bias=False)
        elif self.model_type == 'mlp':
            self.mlp = nn.Sequential(
                nn.Linear(self.seg_num_x, self.d_model),
                nn.ReLU(),
                nn.Linear(self.d_model, self.seg_num_y)
            )


    # 定义前向传播函数 forward
    def forward(self, x):
        batch_size = x.shape[0]
        # 归一化     b,s,c -> b,c,s
        seq_mean = torch.mean(x, dim=1).unsqueeze(1)
        x = (x - seq_mean).permute(0, 2, 1)

        # 应用一维卷积层进行滑动聚合,然后将结果与原始数据相加
        x = self.conv1d(x.reshape(-1, 1, self.seq_len)).reshape(-1, self.enc_in, self.seq_len) + x

        # 对数据进行下采样: b,c,s -> bc,n,w -> bc,w,n
        x = x.reshape(-1, self.seg_num_x, self.period_len).permute(0, 2, 1)

        # 根据模型类型,使用线性层或多层感知机进行稀疏预测
        if self.model_type == 'linear':
            y = self.linear(x)  # bc,w,m
        elif self.model_type == 'mlp':
            y = self.mlp(x)

        # 对预测结果进行上采样: bc,w,m -> bc,m,w -> b,c,s
        y = y.permute(0, 2, 1).reshape(batch_size, self.enc_in, self.pred_len)

        # 对预测结果进行反归一化处理,将序列均值加回去
        y = y.permute(0, 2, 1) + seq_mean

        return y

实验

我们的实验部署配置如下:
GPU 4090D
Ubuntu 20.04
PyTorch 2.1.0
Python 3.10
Cuda 12.1

为便于讲解和对比实验效果,这里我们选取ETTh1(变压器温度)和Electricity(电力消耗)两个数据集作为示例。在模型训练过程中,对于不同的几个数据集,选取96、192、336、720四个预测时间长度进行测试,并且同时对不同的预测模块线性层和MLP分别进行测试,模型均在8-15个epoch左右进入了earlystop,收敛速度较快。

对于使用线性层的情况,计算测试集的MSE,得到下面的复现结果:

ETTh1Electricity
9619233672096192336720
论文结果0.3590.3970.4040.4170.1380.1460.1640.203
复现结果0.3620.4040.4350.4260.1390.1510.1660.207

与论文中的结果对比,MSE整体增大约2.5%,模型保持了较好的效果。我们随机选择测试集中的数据进行可视化,观察预测结果和GroundTruth之间的差异。下图依次为Electricity数据集测试集中预测长度为96、192、336、720的预测结果。

当预测长度较小时,预测结果几乎完全和GroundTruth重合,但随着预测长度的增加,预测结果出现了相对较大的偏差,特别是在预测长度为720时,模型并没有预测到出现的极值,而是重复相同的周期。

而对于ETTh1这种周期性并不显著的数据集,模型的预测效果则出现了预测结果与实际数据的趋势完全相反的情况,下图依次为预测长度为96、720的预测结果。

不难看出,SparseTSF对于周期性明显的数据,可以很好的捕获其周期性,得到比较平稳的预测,而对于不具有显著周期性的数据,模型难以找到有效的模式来进行准确预测。

SparseTSF模型在设计时,通过按周期降采样的策略,强调了对周期性特征的提取和利用,数据本身的周期性特征在被分解并转换为子序列之后,实际上已经被明确地提取出来,因此模型无需再对这些周期性特征进行建模。这样,模型的重点就可以转移到预测子序列之间的长期趋势变化上。简而言之,模型的核心任务从捕捉周期性转变为分析和预测跨周期的趋势动态。在周期性明显的数据集上,模型能够利用这些趋势特征进行有效预测。但在周期性不明显或复杂的数据集上,模型无法找到稳定的模式,导致预测效果不佳。

对于使用MLP的情况,计算测试集的MSE,得到下面的复现结果:

ETTh1Electricity
9619233672096192336720
论文结果0.3590.3970.4040.4170.1380.1460.1640.203
复现结果0.3720.4120.4440.4990.1340.1480.1650.202

与论文中的结果对比,MSE整体增大约4%,与使用线性层的实验结果相比,Electricity数据集的MSE在不同长度的预测下均略有减小,而ETTh1数据集则有较大幅度的增大。这表明MLP这种更复杂的预测模块有助于学习下采样后的子序列之间的相关关系,并对子序列进行跨周期趋势建模,从而做出更准确的预测结果。

实验结果分析

下表展示了SparseTSF与其他基线模型的性能比较。SparseTSF在所有情况下都排名前两位,以显著较小的参数规模达到或接近最先进的预测水平。SparseTSF的结果的标准差也非常小,表明模型的鲁棒性。

下表展示了SparseTSF与其他主流模型在Electricity数据集上的静态和运行时指标比较,包括模型参数、MACs(乘累加操作数)、最大内存使用量和每个epoch的训练时间。SparseTSF在这些指标上显著优于其他模型。

为分析超参数ww对SparseTSF模型预测性能的影响,论文在ETTh1数据集上,使用不同的ww值进行实验,观察模型性能的变化。下表显示,当ww设置为数据的内在主周期时,SparseTSF模型的性能最佳。当ww与数据的主周期不一致时,性能略有下降。

下图通过可视化模型的权重分布,揭示了两种模型在提取时间序列数据周期特征方面的能力。X轴代表输入序列的时间步长。Y轴代表预测序列的时间步长。颜色代表权重的大小,颜色越深表示权重的绝对值越大。

在图a中,线性模型学习到的权重分布呈现出较为均匀的条纹状模式。这些条纹代表了模型从数据中提取的周期性特征。图b展示了SparseTSF模型学习到的权重分布。与线性模型相比,SparseTSF模型的权重分布呈现出更明显、更密集的等间距条纹。这表明SparseTSF模型在提取周期特征方面更为有效,能够更准确地捕捉时间序列数据中的周期性模式。这是因为SparseTSF的按周期ww降采样后预测的策略,给了模型一种更有效的利用时序数据周期特性的bias。

总结

SparseTSF模型在长期时间序列预测领域具有显著的优势,尤其是在处理具有明显周期性的数据集时。模型通过其创新的交叉周期稀疏预测技术,能够有效地提取时间序列数据中的周期性特征,并以极小的参数量实现了与现有先进模型相媲美的预测性能。

实验结果表明,SparseTSF在短周期预测中与真实数据的拟合度很高,但在长周期预测中出现了一定的偏差,尤其是在预测极值时。对于周期性不明显的数据集,SparseTSF的预测效果不佳,这表明模型在捕捉非周期性模式方面存在局限性。

尽管如此,SparseTSF在资源受限的环境中仍然具有很高的应用价值,因为它在保持较小计算成本的同时,提供了相对准确的预测结果。

我们在附件中提供了数据集和训练好的模型,为便于直观地观察模型的预测效果,我们增加了预测结果的可视化部分,并且修改了代码为可以一键运行,读者也可以使用自己的数据集进行训练和测试。

​​

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

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

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

相关文章

【Vue3】从零开始创建一个VUE项目

【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接: 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】&…

win10中使用ffmpeg的filter滤镜

1 给视频加文字水印 1.1 添加播放时间 ffmpeg -i input.mp4 -vf "drawtextfontfileC\\:/Windows/fonts/consola.ttf:fontsize30:fontcolorwhite:timecode00\:00\:00\:00:rate25:textTCR\::boxcolor0x000000AA:box1:x20:y20" -y output.mp4 在视频的x20:y20位置添加t…

【AI系统】昇腾 AI 架构介绍

昇腾 AI 架构介绍 昇腾计算的基础软硬件是产业的核⼼,也是 AI 计算能⼒的来源。华为,作为昇腾计算产业⽣态的⼀员,是基础软硬件系统的核⼼贡献者。昇腾计算软硬件包括硬件系统、基础软件和应⽤使能等。 而本书介绍的 AI 系统整体架构&#…

Pareidoscope - 语言结构关联工具

文章目录 关于 Pareidoscope安装使用方法输入格式语料库查询 将语料库转换为 SQLite3 数据库两种语言结构之间的关联简单词素分析关联共现和伴随词素分析相关的更大结构可视化关联结构 关于 Pareidoscope Pareidoscope 是一组 用于确定任意语言结构之间 关联的工具&#xff0c…

安装MySQL 5.7 亲测有效

前言:本文是笔者在安装MySQL5.7时根据另一位博主大大的安装教程基础上做了一些修改而成 首先在这里表示对博主大大的感谢 下面附博主大大地址 下面的步骤言简意赅 跟着做就不会出错 希望各位读者耐下心来 慢慢解决安装中出现的问题~MySQL 5.7 安装教程(全…

眼部按摩仪WT2605音频蓝牙语音芯片方案 单芯片实现语音提示及控制/手机无线音频传输功能

随着科技的快速发展,人们的生活方式也在不断改变,智能化、便捷化的产品逐渐成为市场的主流。眼部按摩仪作为一种结合了现代科技与健康生活理念的产品,受到了广大消费者的青睐。而在众多眼部按摩仪中,采用WT2605音频蓝牙芯片的方案…

RK3568平台开发系列讲解(PWM篇)PWM 子系统框架

🚀返回专栏总目录 文章目录 一、PWM 设备驱动层二、PWM 核心层三、PWM 适配器驱动层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢整个 PWM 子系统可以用下面的框图来描述: 再上图中 PWM 子系统被划分为了三个层次, 分别为用户空间、 内核空间和硬件层, 内核空…

使用ESP32通过Arduino IDE点亮1.8寸TFT显示屏

开发板选择 本次使用开发板模块丝印为ESP32-WROOM-32E 开发板库选择 Arduino IDE上型号选择为ESP32-WROOM-DA Module 显示屏选择 使用显示屏为8针SPI接口显示屏 驱动IC为ST7735S 使用库 使用三个Arduino平台库 分别是 Adafruit_GFXAdafruit_ST7735SPI 代码详解 首…

yolo辅助我们健身锻炼

使用软件辅助健身能够大大提升运动效果并帮助你更轻松地达成健身目标。确保每次锻炼都更加高效且针对性强,精确记录你的训练进度,帮助你更清晰地看到自己的进步,避免无效训练。 借助YOLO11的尖端计算机视觉技术,跟踪和分析锻炼变得异常简单。它可以无缝检测和监控多种锻炼…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第12篇:YOLOv9——可编程梯度信息(PGI)+广义高效层聚合网络(GELAN)】

YOLOv9 1 摘要2 改进点3 网络架构 YOLO系列博文: 【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇:YOLO系列论文、代码和主要优缺点汇总】【第3篇:YOLOv1——YOLO的开山之作】【第4篇:YOLOv2—…

新能源汽车充电插口类型识别-YOLO标记,可识别Type1,ccs2的充电标准

前言: CCS标准定义的Type-2 CCS汽车充电端口,右侧装有直流充电枪的插头。汽车的充电端口设计巧妙地将交流部分(上半部分)与直流部分(下半部分的两个粗大的接口)集于一体。在交流和直流充电过程中,电动汽车…

k8s集成skywalking

如果能科学上网的话,安装应该不难,如果有问题可以给我留言 本篇文章我将给大家介绍“分布式链路追踪”的内容,对于目前大部分采用微服务架构的公司来说,分布式链路追踪都是必备的,无论它是传统微服务体系亦或是新一代…

微信小程序构建npm失败,没有找到可以构建的npm包

方法:打开终端输入 npm init -y npm install 或 yarn install我用 npm install 下载后并没有出现node_modules, 又用 yarn install 下载,成功了 下载好后,在project.config.json文件添加 "showShadowRootInWxmlPanel": true, …

Vue.js中的交互式样式:鼠标悬停与点击选中响应

在现代Web开发中,用户体验是至关重要的。Vue.js作为一个渐进式JavaScript框架,它提供了一种简洁而高效的方式来构建用户界面。本文将介绍如何在Vue.js中实现两种常见的交互效果:鼠标悬停响应和点击选中响应。 一、鼠标悬停响应右边显示 在V…

0017. shell命令--tac

目录 17. shell命令--tac 功能说明 语法格式 选项说明 实践操作 注意事项 17. shell命令--tac 功能说明 Linux 的 tac 命令用于按行反向输出文件内容,与 cat 命令的输出顺序相反。非常有趣,好记。也就是说,当我们使用tac命令查看文件内…

Zero to JupyterHub with Kubernetes上篇 - Kubernetes 离线二进制部署

前言: 纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 k8s二进…

《Vue零基础入门教程》第十四课:列表渲染

往期内容 《Vue零基础入门教程》第六课:基本选项 《Vue零基础入门教程》第八课:模板语法 《Vue零基础入门教程》第九课:插值语法细节 《Vue零基础入门教程》第十课:属性绑定指令 《Vue零基础入门教程》第十一课:事…

1.1 数据结构的基本概念

1.1.1 基本概念和术语 一、数据、数据对象、数据元素和数据项的概念和关系 数据:是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。 数据是计算机程序加工的原料。 数据对象:是具有相同性质的数据元素的集合&…

mmsegmentation自己的数据集

我最大的问题就是没安装官方给定的mask转换格式来转换 这种带白色的不行哦! 黑色的可以,其实mask*50就可以看清楚标记的轮廓之类的。 数据集格式转换按照A,B,C代码直接转换:https://github.com/TommyZihao/Label2Everything/tree/main/lab…

分治算法中的主定理及其应用

引言 学习递归算法的时候,找到了用来计算算法复杂度的主定理。问大语言模型,发现回答的主定理描述有所不同。本文比较了两个不同版本中表述的差异。并给出一些例子用来计算分治递归类算法的复杂度。 主定理的不同版本 版本1 在《算法导论》第三版第四…