做公司网站好处,群团网站建设,怎么给企业做推广,wordpress快速建站教程视频近年来#xff0c;深度学习一直在时间序列预测中追赶着提升树模型#xff0c;其中新的架构已经逐渐为最先进的性能设定了新的标准。
这一切都始于2020年的N-BEATS#xff0c;然后是2022年的NHITS。2023年#xff0c;PatchTST和TSMixer被提出#xff0c;最近的iTransforme…近年来深度学习一直在时间序列预测中追赶着提升树模型其中新的架构已经逐渐为最先进的性能设定了新的标准。
这一切都始于2020年的N-BEATS然后是2022年的NHITS。2023年PatchTST和TSMixer被提出最近的iTransformer进一步提高了深度学习预测模型的性能。
这是2024年4月《SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion》中提出的新模型采用集中策略来学习不同序列之间的交互从而在多变量预测任务中获得最先进的性能。
在本文中我们详细探讨了SOFTS的体系结构并介绍新的STar聚合调度(STAD)模块该模块负责学习时间序列之间的交互。然后我们测试将该模型应用于单变量和多变量预测场景并与其他模型作为对比。
SOFTS介绍
SOFTS是 Series-cOre Fused Time Series的缩写背后的动机来自于长期多元预测对决策至关重要的认识
首先我们一直研究Transformer的模型它们试图通过使用补丁嵌入和通道独立等技术(如PatchTST)来降低Transformer的复杂性。但是由于通道独立性消除了每个序列之间的相互作用因此可能会忽略预测信息。
iTransformer 通过嵌入整个序列部分地解决了这个问题并通过注意机制处理它们。但是基于transformer的模型在计算上是复杂的并且需要更多的时间来训练非常大的数据集。
另一方面有一些基于mlp的模型。这些模型通常很快并产生非常强的结果但当存在许多序列时它们的性能往往会下降。
所以出现了SOFTS研究人员建议使用基于mlp的STAD模块。由于是基于MLP的所以训练速度很快。并且STAD模块它允许学习每个序列之间的关系就像注意力机制一样但计算效率更高。
SOFTS架构 在上图中可以看到每个序列都是单独嵌入的就像在iTransformer 中一样。
然后将嵌入发送到STAD模块。每个序列之间的交互都是集中学习的然后再分配到各个系列并融合在一起。
最后再通过线性层产生预测。
这个体系结构中有很多东西需要分析我们下面更详细地研究每个组件。
1、归一化与嵌入
首先使用归一化来校准输入序列的分布。使用了可逆实例的归一化(RevIn)。它将数据以单位方差的平均值为中心。然后每个系列分别进行嵌入就像在iTransformer 模型。 在上图中我们可以看到嵌入整个序列就像应用补丁嵌入其中补丁长度等于输入序列的长度。
这样嵌入就包含了整个序列在所有时间步长的信息。
然后将嵌入式系列发送到STAD模块。
2、STar Aggregate-Dispatch (STAD)
STAD模块是soft模型与其他预测方法的真正区别。使用集中式策略来查找所有时间序列之间的相互作用。 嵌入的序列首先通过MLP和池化层然后将这个学习到的表示连接起来形成核上图中的黄色块表示。
核构建好了以后就进入了“重复”和“连接”的步骤在这个步骤中核表示被分派给每个系列。 MLP和池化层未捕获的信息还可以通过残差连接添加到核表示中。然后在融合fuse操作的过程中核表示及其对应系列的残差都通过MLP层发送。最后的线性层采用STAD模块的输出来生成每个序列的最终预测。
与其他捕获通道交互的方法(如注意力机制)相比STAD模块的主要优点之一是它降低了复杂性。
因为STAD模块具有线性复杂度而注意力机制具有二次复杂度这意味着STAD在技术上可以更有效地处理具有多个序列的大型数据集。
下面我们来实际使用SOFTS进行单变量和多变量场景的测试。
使用SOFTS预测
这里我们使用 Electricity Transformer dataset 数据集。
这个数据集跟踪了中国某省两个地区的变压器油温。每小时和每15分钟采样一个数据集总共有四个数据集。
我门使用neuralforecast库中的SOFTS实现这是官方认可的库并且这样我们可以直接使用和测试不同预测模型的进行对比。
在撰写本文时SOFTS还没有集成在的neuralforecast版本中所以我们需要使用源代码进行安装。 pip install githttps://github.com/Nixtla/neuralforecast.git然后就是从导入包开始。使用datasetsforecast以所需格式加载数据集以便使用neuralforecast训练模型并使用utilsforecast评估模型的性能。这就是我们使用neuralforecast的原因因为他都是一套的 import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom datasetsforecast.long_horizon import LongHorizonfrom neuralforecast.core import NeuralForecastfrom neuralforecast.losses.pytorch import MAE, MSEfrom neuralforecast.models import SOFTS, PatchTST, TSMixer, iTransformerfrom utilsforecast.losses import mae, msefrom utilsforecast.evaluation import evaluate编写一个函数来帮助加载数据集以及它们的标准测试大小、验证大小和频率。 def load_data(name):if name ettm1:Y_df, *_ LongHorizon.load(directory./, groupETTm1)Y_df Y_df[Y_df[unique_id] OT] # univariate datasetY_df[ds] pd.to_datetime(Y_df[ds])val_size 11520test_size 11520freq 15Telif name ettm2:Y_df, *_ LongHorizon.load(directory./, groupETTm2)Y_df[ds] pd.to_datetime(Y_df[ds]) val_size 11520test_size 11520freq 15Treturn Y_df, val_size, test_size, freq然后就可以对ETTm1数据集进行单变量预测。
1、单变量预测
加载ETTm1数据集将预测范围设置为96个时间步长。
可以测试更多的预测长度但我们这里只使用96。 Y_df, val_size, test_size, freq load_data(ettm1)horizon 96然后初始化不同的模型我们将soft与TSMixer, iTransformer和PatchTST进行比较。
所有模型都使用的默认配置将最大训练步数设置为1000如果三次后验证损失没有改善则停止训练。 models [SOFTS(hhorizon, input_size3*horizon, n_series1, max_steps1000, early_stop_patience_steps3),TSMixer(hhorizon, input_size3*horizon, n_series1, max_steps1000, early_stop_patience_steps3),iTransformer(hhorizon, input_size3*horizon, n_series1, max_steps1000, early_stop_patience_steps3),PatchTST(hhorizon, input_size3*horizon, max_steps1000, early_stop_patience_steps3)]然后初始化NeuralForecast对象训练模型。并使用交叉验证来获得多个预测窗口更好地评估每个模型的性能。 nf NeuralForecast(modelsmodels, freqfreq)nf_preds nf.cross_validation(dfY_df, val_sizeval_size, test_sizetest_size, n_windowsNone)nf_preds nf_preds.reset_index()评估计算了每个模型的平均绝对误差(MAE)和均方误差(MSE)。因为之前的数据是缩放的因此报告的指标也是缩放的。 ettm1_evaluation evaluate(dfnf_preds, metrics[mae, mse], models[SOFTS, TSMixer, iTransformer, PatchTST])从上图可以看出PatchTST的MAE最低而softts、TSMixer和PatchTST的MSE是一样的。在这种特殊情况下PatchTST仍然是总体上最好的模型。
这并不奇怪因为PatchTST在这个数据集中是出了名的好特别是对于单变量任务。下面我们开始测试多变量场景。
2、多变量预测
使用相同的load_data函数我们现在为这个多变量场景使用ETTm2数据集。 Y_df, val_size, test_size, freq load_data(ettm2)horizon 96然后简单地初始化每个模型。我们只使用多变量模型来学习序列之间的相互作用所以不会使用PatchTST因为它应用通道独立性(意味着每个序列被单独处理)。
然后保留了与单变量场景中相同的超参数。只将n_series更改为7因为有7个时间序列相互作用。 models [SOFTS(hhorizon, input_size3*horizon, n_series7, max_steps1000, early_stop_patience_steps3, scaler_typeidentity, valid_lossMAE()),TSMixer(hhorizon, input_size3*horizon, n_series7, max_steps1000, early_stop_patience_steps3, scaler_typeidentity, valid_lossMAE()),iTransformer(hhorizon, input_size3*horizon, n_series7, max_steps1000, early_stop_patience_steps3, scaler_typeidentity, valid_lossMAE())]训练所有的模型并进行预测。 nf NeuralForecast(modelsmodels, freq15min)nf_preds nf.cross_validation(dfY_df, val_sizeval_size, test_sizetest_size, n_windowsNone)nf_preds nf_preds.reset_index()最后使用MAE和MSE来评估每个模型的性能。 ettm2_evaluation evaluate(dfnf_preds, metrics[mae, mse], models[SOFTS, TSMixer, iTransformer])上图中可以看到到当在96的水平上预测时TSMixer large在ETTm2数据集上的表现优于iTransformer和soft。
虽然这与soft论文的结果相矛盾这是因为我们没有进行超参数优化并且使用了96个时间步长的固定范围。
这个实验的结果可能不太令人印象深刻我们只在固定预测范围的单个数据集上进行了测试所以这不是SOFTS性能的稳健基准同时也说明了SOFTS在使用时可能需要更多的时间来进行超参数的优化。
总结
SOFTS是一个很有前途的基于mlp的多元预测模型STAD模块是一种集中式方法用于学习时间序列之间的相互作用其计算强度低于注意力机制。这使得模型能够有效地处理具有许多并发时间序列的大型数据集。
虽然在我们的实验中SOFTS的性能可能看起来有点平淡无奇但请记住这并不代表其性能的稳健基准因为我们只在固定视界的单个数据集上进行了测试。
但是SOFTS的思路还是非常好的比如使用集中式学习时间序列之间的相互作用并且使用低强度的计算来保证数据计算的效率这都是值得我们学习的地方。
并且每个问题都需要其独特的解决方案所以将SOFTS作为特定场景的一个测试选项是一个明智的选择。
SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion
https://avoid.overfit.cn/post/6254097fd18d479ba7fd85efcc49abac