DeepTime:时间序列预测中的元学习模型

news2024/11/18 5:33:32

DeepTime,是一个结合使用元学习的深度时间指数模型。通过使用元学习公式来预测未来,以应对时间序列中的常见问题(协变量偏移和条件分布偏移——非平稳)。该模型是时间序列预测的元学习公式协同作用的一个很好的例子。

DeepTime架构

DeepTime组件

DeepTime中有三种类型的层:

  • 岭回归
  • 多层感知机(MLP)
  • 随机傅里叶特征

让我们看看这些层在做什么:

岭回归

多层感知机(MLP)

这些是在神经网络(nn)中使用的线性回归公式。然后使用了一个ReLU函数激活。这些层非常适合将时间指数映射到该时间指数的时间序列值。公式如下:

随机的傅里叶层

随机傅里叶允许mlp学习高频模式。尽管随机傅里叶层需要为每个任务和数据集找到不同的超参数(只是为了不过度拟合或不足拟合),但作者通过将各种傅里叶基函数与各种尺度参数相结合来限制这种计算。

DeepTIME架构

在每个任务中,选择一个时间序列,然后将其分为主干窗口(绿色)和预测窗口(蓝色)两部分。然后,然后他们通过两个彼此共享信息并与元参数关联的元模型。 在上图描述的架构上训练模型后,计算损失函数并尝试将其最小化。

其他时间序列预测模型的区别

DeepTIME是一个时间指数模型,就像Prophet,高斯过程等,而最近比较突出的模型如N-HiTS, Autoformer, DeepAR, Informer等都是历史价值模型。

当我们说时间序列的时间指数模型时,确切的意思是预测绝对随时间变化(它考虑了当前的时间指数特征)。另一方面,历史价值模型使用以前的事件来预测未来。这个公式能让你更清楚。:)

它包含了元学习公式,这意味着这个模型可以学会如何学习。由于它是一个时间指数模型,可以在元学习中表现出更好的样本效率。

它采用直接多步估计(DMS)的方法(DMS模型一次直接预测几个数据点)。另外通过多步迭代(IMS),它只预测下一个值,然后使用它来预测下一个数据点,这与ARIMA、DeepAR等相同。

元学习给时间序列预测带来了什么?

  • 更好的任务泛化
  • 符合附近时间步长遵循局部平稳分布的假设。
  • 还包含了相似的时间点将具有相似的特征的假设。

模型如何预测

在每一次训练时,将数据分为两个窗口(通过使用第一个窗口预测第二个窗口)。这里为了简单起见使用PyTorch Lightning简化训练过程。

 importnumpyasnp
 importgin
 importpytorch_lightningaspl
 
 frommodelsimportget_model
 importrandom
 
 importtorch
 importtorch.nn.functionalasF
 fromtorchimportoptim
 
 importmath
 
 fromutilsimportCheckpoint, default_device, to_tensor
 @gin.configurable
 classDeepTimeTrainer(pl.LightningModule):
 
     def__init__(self,
                  lr,
                  lambda_lr,
                  weight_decay,
                  warmup_epochs,
                  random_seed,
                  T_max,
                  eta_min,
                  dim_size,
                  datetime_feats,
                  ):
         gin.parse_config_file('/home/reza/Projects/PL_DeepTime/DeepTime/config/config.gin')
         super(DeepTimeTrainer, self).__init__()
         self.lr=lr
         self.lambda_lr=lambda_lr
         self.weight_decay=weight_decay
         self.warmup_epochs=warmup_epochs
         self.random_seed=random_seed
         self.lr=lr
         self.lambda_lr=lambda_lr
         self.weight_decay=weight_decay
         self.T_max=T_max
         self.warmup_epochs=warmup_epochs
         self.eta_min=eta_min
         self.model=get_model(
             model_type='deeptime',
             dim_size=dim_size,
             datetime_feats=datetime_feats
         )
 
     defon_fit_start(self):
         torch.manual_seed(self.random_seed)
         np.random.seed(self.random_seed)
         random.seed(self.random_seed)
 
     deftraining_step(self, batch, batch_idx):
         x, y, x_time, y_time=map(to_tensor, batch)
         forecast=self.model(x, x_time, y_time)
 
         ifisinstance(forecast, tuple):
             # for models which require reconstruction + forecast loss
             loss=F.mse_loss(forecast[0], x) + \
                    F.mse_loss(forecast[1], y)
         else:
             loss=F.mse_loss(forecast, y)
 
         self.log('train_loss', loss, prog_bar=True, on_epoch=True)
 
         return {'loss': loss, 'train_loss': loss, }
 
     deftraining_epoch_end(self, outputs):
         avg_train_loss=torch.stack([x["train_loss"] forxinoutputs]).mean()
 
         self.log('avg_train_loss', avg_train_loss, on_epoch=True, sync_dist=True)
 
     defvalidation_step(self, batch, batch_idx):
 
         x, y, x_time, y_time=map(to_tensor, batch)
         forecast=self.model(x, x_time, y_time)
 
         ifisinstance(forecast, tuple):
             # for models which require reconstruction + forecast loss
             loss=F.mse_loss(forecast[0], x) + \
                    F.mse_loss(forecast[1], y)
         else:
             loss=F.mse_loss(forecast, y)
 
         self.log('val_loss', loss, prog_bar=True, on_epoch=True)
 
         return {'val_loss': loss}
 
     defvalidation_epoch_end(self, outputs):
         returnoutputs
 
     deftest_step(self, batch, batch_idx):
         x, y, x_time, y_time=map(to_tensor, batch)
         forecast=self.model(x, x_time, y_time)
 
         ifisinstance(forecast, tuple):
             # for models which require reconstruction + forecast loss
             loss=F.mse_loss(forecast[0], x) + \
                    F.mse_loss(forecast[1], y)
         else:
             loss=F.mse_loss(forecast, y)
 
         self.log('test_loss', loss, prog_bar=True, on_epoch=True)
 
         return {'test_loss': loss}
 
     deftest_epoch_end(self, outputs):
         returnoutputs
 
     @gin.configurable
     defconfigure_optimizers(self):
         group1= []  # lambda
         group2= []  # no decay
         group3= []  # decay
         no_decay_list= ('bias', 'norm',)
         forparam_name, paraminself.model.named_parameters():
             if'_lambda'inparam_name:
                 group1.append(param)
             elifany([modinparam_nameformodinno_decay_list]):
                 group2.append(param)
             else:
                 group3.append(param)
         optimizer=optim.Adam([
             {'params': group1, 'weight_decay': 0, 'lr': self.lambda_lr, 'scheduler': 'cosine_annealing'},
             {'params': group2, 'weight_decay': 0, 'scheduler': 'cosine_annealing_with_linear_warmup'},
             {'params': group3, 'scheduler': 'cosine_annealing_with_linear_warmup'}
         ], lr=self.lr, weight_decay=self.weight_decay)
 
         scheduler_fns= []
         forparam_groupinoptimizer.param_groups:
             scheduler=param_group['scheduler']
             ifscheduler=='none':
                 fn=lambdaT_cur: 1
             elifscheduler=='cosine_annealing':
                 lr=eta_max=param_group['lr']
                 fn=lambdaT_cur: (self.eta_min+0.5* (eta_max-self.eta_min) * (
                         1.0+math.cos(
                     (T_cur-self.warmup_epochs) / (self.T_max-self.warmup_epochs) *math.pi))) /lr
             elifscheduler=='cosine_annealing_with_linear_warmup':
                 lr=eta_max=param_group['lr']
                 fn=lambdaT_cur: T_cur/self.warmup_epochsifT_cur<self.warmup_epochselse (self.eta_min+0.5* (
                         eta_max-self.eta_min) * (1.0+math.cos(
                     (T_cur-self.warmup_epochs) / (self.T_max-self.warmup_epochs) *math.pi))) /lr
             else:
                 raiseValueError(f'No such scheduler, {scheduler}')
             scheduler_fns.append(fn)
         scheduler=optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=scheduler_fns)
 
         return {'optimizer': optimizer, 'lr_scheduler': scheduler}
 
     defforward(self, batch, z_0=None):
         z_0=None
         Y=batch['Y'].to(default_device)
         sample_mask=batch['sample_mask'].to(default_device)
         available_mask=batch['available_mask'].to(default_device)
 
         # Forecasting
         forecasting_mask=available_mask.clone()
         ifself.n_time_out>0:
             forecasting_mask[:, 0, -self.n_time_out:] =0
 
         Y, Y_hat, z=self.model(Y=Y, mask=forecasting_mask, idxs=None, z_0=z_0)
 
         ifself.n_time_out>0:
             Y=Y[:, :, -self.n_time_out:]
             Y_hat=Y_hat[:, :, -self.n_time_out:]
             sample_mask=sample_mask[:, :, -self.n_time_out:]
 
         returnY, Y_hat, sample_mask, z

作者在合成数据集和真实世界数据集上进行了广泛的实验,表明DeepTime具有极具竞争力的性能,在基于MSE的多元预测基准的24个实验中,有20个获得了最先进的结果。

有兴趣的可以看看源代码:https://avoid.overfit.cn/post/5736b84982b847f991def19a5af4c9a0

作者:Reza Yazdanfar

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

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

相关文章

Win系统速览桌面功能失效 - 解决方案

Win系统速览桌面功能失效 - 解决方案问题解决方案步骤1&#xff1a;确保显卡驱动正常运行步骤2&#xff1a;检查任务栏设置步骤3&#xff1a;调整视觉效果问题 Win10系统支持用户鼠标悬停在任务栏右下角时速览桌面。但可能会因驱动和视觉效果设置等原因导致此功能失效。甚至任…

Linux基础IO+文件fd

1&#xff1a;文件理解文件内容属性&#xff0c;因此空文件在磁盘上也占用空间。文件用路径名文件名作为标识文件的唯一性。对文件的操作&#xff0c;就是对文件的内容属性的操作。在linux中&#xff0c;如果没有指定文件路径&#xff0c;默认在当前路径下执行操作。总结&#…

react配置环境变量

前端项目开发一般会区分三个环境&#xff1a; 本地环境&#xff08;及开发环境&#xff09;— development&#xff0c;测试环境 — test&#xff0c;生产环境 — production。 本地环境就是自己开发调试用的&#xff0c;一般是node起一个本地的服务&#xff0c;用webpack做接…

使用Python实现高效摸鱼,批量识别银行卡号码并且自动写入Excel表格

每当有新员工入职&#xff0c;人事小姐姐都要收集大量的工资卡信息&#xff0c;并且生成Excel文档&#xff0c;看到小姐姐这么辛苦&#xff0c;我就忍不住要去帮她了… 于是我用1行代码就实现了自动识别银行卡信息并且自动生成Excel文件&#xff0c;小姐姐当场就亮眼汪汪的看着…

如何制定一个好计划?运用SMART原则

很多人面对目标总是给自己找各种借口&#xff0c;为自己找理由&#xff0c;如没时间、做不到、没人脉、在潜意识里告诉自己还没准备好。人的天性就是逃避困难、贪图享乐&#xff0c;而保证执行力就是跟惰性抗争的过程。 这个世界没有好做不好的工作&#xff0c;只有&#xff0c…

Java Springboot+VUE前后端分离网上手机商城平台系统设计和实现以及论文报告

Java SpringbootVUE前后端分离网上手机商城平台系统设计和实现以及论文报告 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收…

闭区间连续函数的性质+习题课(函数与极限总复习)——“高等数学”

各位CSDN的uu们你们好呀&#xff0c;今天我们的内容依然是关于连续函数的概念和性质及相关内容&#xff0c;之前的博客我们学习到了函数的连续性和函数的间断点&#xff0c;那今天&#xff0c;我们便来看看闭区间上连续函数的性质&#xff0c;好的&#xff0c;接下来就让我们进…

Webpack麻烦你不要靠的那么近,我怕Vite误会

某天&#xff0c;实施人员&#xff0c;让我修复了一个小问题&#xff0c;并需要快速的发布到正式环境上&#xff0c;我三下五除二修改了问题&#xff1b;开始了打包发布&#xff0c;以前并没有怎么注意到启动的问题&#xff0c;然而这次比较急&#xff0c;想在用户看到之前发布…

Java之初入JDBC-连接数据库

之前我们学完了Mysql 现在我们要学习怎么用JAVA来操作Mysql数据库&#xff08;JDBC不止能操作Mysql还能操作如Redis等数据库&#xff09; 概述 JDBC原理图 大致我们java语言开发者&#xff0c;指定一个接口 这个接口-包含了对数据库基本操作 然后不同数据库的开发厂商&#x…

HTML中引入CSS样式的第二种方式:样式块

<!-- 第二种方式&#xff1a;在head标签中使用style块&#xff0c;这种方式被称为样式块方式。 语法格式&#xff1a; <head> <style type"text/css"> 选择器 { …

Ragnar-lothbrok靶机总结

Ragnar-lothbrok靶机渗透总结 靶机下载地址: https://download.vulnhub.com/ragnarlothbrok/Ragnar-lothbrok.ova 打开靶机,使用nmap扫描出靶机的ip和所有开放的端口 可以看到靶机开放了21端口,80端口,443端口,3306端口 一般开放21端口,我们可以先尝试ftp的匿名登录 可以看到…

MySQL详解(一)——基础 1.0

MySQL基础 1. 数据库概述 1.1 什么是数据库 数据库是持久化数据的一种介质&#xff0c;可以理解成用来存储和管理数据的仓库&#xff01; 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。持久化的大多数时候是将内存中的数据存储在数据库中&…

CompletableFuture实现异步编排

为什么需要异步执行&#xff1f; 场景&#xff1a;电商系统中获取一个完整的商品信息可能分为以下几步&#xff1a;①获取商品基本信息 ②获取商品图片信息 ③获取商品促销活动信息 ④获取商品各种类的基本信息 等操作&#xff0c;如果使用串行方式去执行这些操作&#xff0c;假…

使用Python包组织代码

使用Python包(package)组织代码Python 通过包(package)的方式来组织代码&#xff0c;包是一种特殊的模块(module)。Python 的包有两种形式&#xff0c;分别是Regular packages 和 namespace packages。所谓 Regular packages 就是指含有__init__.py的目录&#xff0c;这样的包被…

Jeston TX1TX2 A100 Ubuntu_1804_ROS 系统清理系统缓冲日志

大家好&#xff0c;我是虎哥&#xff0c;我自己的系统&#xff0c;运行一段时间后&#xff0c;出现了存储空间不足&#xff0c;详细查了一下&#xff0c;发现ROS本身就占用了大量的日志空间&#xff0c;这个当然在编程阶段&#xff0c;通过少加打印的方式来优化&#xff0c;但是…

黑群晖安装记录

老姐公司黑群晖坏了。临危受命&#xff0c;尝试拯救硬盘文件。 看起来黑群晖启动了&#xff0c;但是在管理软件找不到黑群晖IP&#xff0c;尝试了各种方法都不行&#xff0c;放弃老群晖&#xff0c;直接拯救硬盘数据&#xff0c;看官网有HDD迁移模式&#xff0c;直接把硬盘插到…

【GD32F427开发板试用】8. 脉搏监控仪

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…

动态内存开辟必看,一篇就能学会贯通

目录 为什么存在动态内存分配 动态内存函数的介绍 1.malloc函数和free函数 2.calloc函数 3.realloc函数 常见的动态内存错误 经典的笔试题 柔性数组 今天来介绍一下动态内存&#xff0c;让我们直入主题&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 为…

【Cocos新手入门】cocos creator 的研发思路和工具操作说明

本篇文章主要讲解cocos creator 的研发思路和工具操作说明 作者&#xff1a;任聪聪 日期&#xff1a;2023年1月29日 研发思路 关于cocos creator 工具说明 首先cocos creator 是一个编辑游戏界面的窗口&#xff0c;省去了我们日常开发游戏时频繁修改参数调整动画、场景的工作…

Siam R-CNN: 通过重检测进行视觉跟踪

Siam R-CNN: 通过重检测进行视觉跟踪Siam R-CNN: Visual Tracking by Re-DetectionContributionsMethodSiam RCNNVideo Hard Example MiningTracklet Dynamic Programming Algorithm实验总结更多Ai资讯&#xff1a;公主号AiCharm Siam R-CNN: Visual Tracking by Re-Detectio…