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

本文涉及的产品
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
简介: 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

目录
相关文章
|
机器学习/深度学习 弹性计算 文字识别
ECS实例问题之重启后公网ip变化如何解决
ECS(Elastic Compute Service,弹性计算服务)是云计算服务提供商提供的一种基础云服务,允许用户在云端获取和配置虚拟服务器。以下是ECS服务使用中的一些常见问题及其解答的合集:
|
机器学习/深度学习 API Python
100天搞定机器学习 番外:使用FastAPI构建机器学习API
100天搞定机器学习 番外:使用FastAPI构建机器学习API
100天搞定机器学习 番外:使用FastAPI构建机器学习API
|
11月前
|
编解码 人工智能 运维
南加大提出全新通用时间序列基础模型TimeDiT!基于扩散模型创新物理约束机制
 【10月更文挑战第10天】南加大提出TimeDiT模型,创新融合扩散模型与Transformer架构,针对真实世界时间序列数据的复杂性,如多分辨率、缺失值等问题,提供高效解决方案。该模型通过新颖的掩码机制和无微调编辑策略,实现多任务处理及物理知识集成,显著提升预测和异常检测的准确性和鲁棒性。
316 3
|
机器学习/深度学习 数据可视化 数据挖掘
Python时间序列分析库介绍:statsmodels、tslearn、tssearch、tsfresh
时间序列分析在金融和医疗保健等领域至关重要,在这些领域,理解随时间变化的数据模式至关重要。在本文中,我们将介绍四个主要的Python库——statmodels、tslearn、tssearch和tsfresh——每个库都针对时间序列分析的不同方面进行了定制。这些库为从预测到模式识别的任务提供了强大的工具,使它们成为各种应用程序的宝贵资源。
881 3
|
6月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——拦截自定义异常
本文介绍了在实际项目中如何拦截自定义异常。首先,通过定义异常信息枚举类 `BusinessMsgEnum`,统一管理业务异常的代码和消息。接着,创建自定义业务异常类 `BusinessErrorException`,并在其构造方法中传入枚举类以实现异常信息的封装。最后,利用 `GlobalExceptionHandler` 拦截并处理自定义异常,返回标准的 JSON 响应格式。文章还提供了示例代码和测试方法,展示了全局异常处理在 Spring Boot 项目中的应用价值。
229 0
|
机器学习/深度学习 并行计算 PyTorch
从零开始下载torch+cu(无痛版)
这篇文章提供了一个详细的无痛版教程,指导如何从零开始下载并配置支持CUDA的PyTorch GPU版本,包括查看Cuda版本、在官网检索下载包名、下载指定的torch、torchvision、torchaudio库,并在深度学习环境中安装和测试是否成功。
从零开始下载torch+cu(无痛版)
|
6月前
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
227 7
|
4月前
|
数据可视化 数据挖掘 数据安全/隐私保护
Python实现时间序列动量策略:波动率标准化让量化交易收益更平稳
时间序列动量策略(TSMOM)是一种基于资产价格趋势的量化交易方法,通过建立多头或空头头寸捕捉市场惯性。然而,传统TSMOM策略因风险敞口不稳定而面临收益波动问题。波动率调整技术通过动态调节头寸规模,维持恒定风险水平,优化了策略表现。本文系统分析了波动率调整TSMOM的原理、实施步骤及优势,强调其在现代量化投资中的重要地位,并探讨关键参数设定与实际应用考量,为投资者提供更平稳的风险管理体验。
150 4
Python实现时间序列动量策略:波动率标准化让量化交易收益更平稳
|
7月前
|
机器学习/深度学习 人工智能 开发者
DeepSeek安装部署指南,基于阿里云PAI零代码,小白也能轻松搞定!
阿里云PAI平台支持零代码一键部署DeepSeek-V3和DeepSeek-R1大模型,用户可轻松实现从训练到部署再到推理的全流程。通过PAI Model Gallery,开发者只需简单几步即可完成模型部署,享受高效便捷的AI开发体验。具体步骤包括:开通PAI服务、进入控制台选择模型、一键部署并获取调用信息。整个过程简单快捷,极大降低了使用门槛。
1803 43
|
10月前
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
337 4
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结

热门文章

最新文章