ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

长时间序列预测Transformer模型演进:从Informer到Autoformer与FEDformer

2026/9/4 4:00:27 拓冰建站 浏览量
长时间序列预测Transformer模型演进:从Informer到Autoformer与FEDformer 简介本资源是面向时间序列预测与分类任务研究者及工程师的Transformer模型代码合集聚焦长时间序列建模难题覆盖Autoformer、Informer、TimesNet、DLinear等15种主流算法适用于电力负荷预测、交通流量分析、气象建模、医疗病情趋势判断等多领域场景。压缩包共1378个文件含137个核心Python训练/推理脚本、228个Shell运行脚本、774份PDF论文与技术文档辅以CSV数据集、Numpy预处理结果及可视化PNG图表整体体积182.2MB结构清晰便于按模型或数据集快速定位。已有3448人学习下载提供开箱即用的完整实验流程从ETT、Traffic、Electricity等标准数据集加载、模型复现、超参配置到结果评估与绘图所有代码均经实测可运行并附带README说明与典型日志参考显著降低算法复现门槛与调试成本。1. 从序列到洞察为什么我们需要专门的长时间序列Transformer如果你在过去几年里接触过时间序列预测尤其是涉及电力负荷、交通流量、金融数据这类动辄成千上万时间步的序列你大概率会有一个直观的感受传统的循环神经网络RNN、长短期记忆网络LSTM甚至门控循环单元GRU在“长”这个字面前越来越力不从心。模型训练慢、梯度消失或爆炸、对超长依赖关系捕捉能力弱这些都是老生常谈的问题了。所以当Transformer模型在自然语言处理领域大杀四方以其强大的并行计算能力和全局依赖建模能力惊艳众人时很多研究者自然地将目光投向了时间序列领域期待它能成为解决长序列预测难题的“银弹”。最初的尝试简单粗暴直接把时间序列数据当成一个“句子”每个时间点就是一个“词”然后套用原始的Transformer架构。结果呢效果往往不尽如人意甚至可能还不如精心调参的LSTM。这里面的核心矛盾在于时间序列数据和自然语言数据存在本质差异。自然语言的词是离散的、有明确语义单元的而时间序列是连续的、数值型的其“语义”隐藏在局部和全局的模式、趋势、周期性当中。更重要的是原始Transformer的自注意力机制计算复杂度是序列长度的平方O(n²)这对于动辄需要预测成百上千个未来点比如预测未来96、192甚至336小时的场景来说计算开销是灾难性的。因此专门为长时间序列预测设计的Transformer变体应运而生。它们不是对原始模型的简单移植而是针对时间序列数据的特性进行了深度改造。这些改造主要围绕几个核心痛点展开如何高效地建模长程依赖如何显式地捕捉时间序列中固有的周期性和趋势如何降低自注意力的计算复杂度使其能处理更长的序列我们今天要讨论的Autoformer、FEDformer根据常见拼写我推测“PEDformer”可能是指FEDformer一种基于频域分解的Transformer、Informer等就是这一领域具有代表性的成果。它们各自从不同的角度切入提出了创新的机制共同推动了长时间序列预测技术的发展。对于算法工程师、数据科学家以及任何需要处理海量时序数据的从业者来说理解这些模型的原理、差异和适用场景不再是“锦上添花”而是“雪中送炭”的必备技能。2. 核心挑战拆解长时间序列预测的“三座大山”在深入各个模型之前我们必须先厘清它们共同要面对的挑战。理解这些挑战才能明白后续每个模型设计中的“妙招”究竟妙在何处。2.1 计算复杂度之困平方级开销的枷锁原始Transformer的自注意力机制是其灵魂也是其最大的负担。对于长度为L的序列计算所有两两之间的注意力权重需要生成一个L×L的矩阵其计算和内存复杂度均为O(L²)。在NLP中句子长度通常有限如512或1024尚可接受。但在时间序列预测中输入的历史序列长度Look-back window和需要预测的未来序列长度Prediction horizon都可能很长。例如在ETTh1电力变压器温度数据集的常见实验中输入长度可达720即30天的每小时数据预测长度可达720。此时O(L²)的开销是难以承受的它直接限制了模型能够处理的历史信息量也拖慢了训练和推理速度。2.2 长期依赖建模之难如何让模型“看得远”也“记得牢”时间序列中的长期依赖至关重要。本周的用电高峰可能与上周、甚至上个月同期的模式相关某个产品的销量可能受到一年前营销活动的影响。RNN系列模型通过循环结构传递信息但信息在长路径传递中极易衰减或扭曲。原始Transformer的自注意力理论上可以建立任意两个时间点之间的直接连接但受限于计算复杂度在实际实现中往往需要对序列长度进行截断或使用稀疏注意力这又可能丢失重要的长期信息。因此如何设计一种机制既能高效计算又能稳固地捕获跨越数百甚至数千时间步的依赖关系是核心难题。2.3 时序模式分解之需趋势、周期性与残差的分离这是时间序列分析与自然语言处理的一个根本性区别。一个典型的时间序列如销售额、温度通常可以分解为几个可解释的组成部分长期趋势Trend、季节性/周期性Seasonality和残差/不规则波动Residual。一个优秀的预测模型应该有能力显式或隐式地对这些成分进行建模。传统方法如STL分解是显式的但模型是分离的。我们期望深度学习模型能自动学习这种分解并针对不同成分的特性采用不同的处理策略。例如趋势项变化缓慢可能不需要细粒度的时间点交互季节性项具有固定的周期模式可以设计特殊的注意力机制来强化周期内的关联。2.4 信息蒸馏与冗余处理序列中的“水分”在哪里长时间序列中包含着大量冗余信息。相邻时间点的数值往往高度相关连续一段平稳序列所携带的信息可能用一个代表性点或一组系数就能概括。直接处理每个原始点不仅是计算上的浪费也可能让模型陷入局部细节而忽略全局模式。因此如何对长序列进行高效地“信息蒸馏”提取出关键的特征表示同时压缩序列长度是提升效率的关键思路。这类似于为长序列创建一个“摘要”或“索引”让模型基于这个摘要进行高效的推理。下表总结了这些核心挑战及模型设计的应对方向挑战问题描述模型设计应对方向计算复杂度自注意力O(L²)开销无法承受长序列。提出稀疏注意力、低秩近似、频域变换、分块策略等目标是将复杂度降至O(L log L)或线性O(L)。长期依赖建模需要捕获跨越极长时间步的关联。设计全局注意力或高效稀疏注意力确保即使序列很长关键时间点间的连接也不会被切断。时序模式分解需要分别处理趋势、周期性和残差。在模型内部嵌入分解结构如Autoformer的序列分解块或通过傅里叶/小波变换在频域分离成分如FEDformer。信息冗余原始序列点包含大量局部冗余。采用自相关机制发现周期依赖、使用卷积或池化进行下采样、学习序列的稀疏表示。3. 算法全景图15个代表性模型的核心思想与代码实现要点基于上述挑战研究者们提出了多种创新架构。下面我将选取其中最具代表性、影响最广泛的几个模型进行深入剖析并阐述其代码实现的关键。请注意由于涉及模型较多此处无法逐一展开每个模型的全部细节但会聚焦于其最核心的创新点和代码逻辑。3.1 Informer开启高效长序列预测的先河Informer模型是Transformer在长时间序列预测领域的一个里程碑式工作。它直面了计算复杂度、内存占用和长序列信息蒸馏三大问题。核心创新点ProbSparse Self-attention概率稀疏自注意力这是Informer的灵魂。其核心思想是传统的自注意力权重分布往往是长尾的只有少数几个“关键”的查询Query对注意力分布有重要贡献。ProbSparse注意力通过一种近似方法快速识别出这些重要的Query只计算它们与所有键Key的注意力而忽略其他“平凡”的Query。这使注意力计算复杂度从O(L²)降至O(L log L)。Self-attention Distilling自注意力蒸馏为了进一步压缩序列长度、突出主要特征并减少冗余Informer在编码器堆叠时在每一层后加入了一个蒸馏操作。通常采用一维卷积步长1和最大池化的组合对序列的维度进行压缩。例如输入长度L经过一层编码器蒸馏后长度可能变为L/2。这样深层编码器处理的是越来越“精炼”的序列表示。Generative Style Decoder生成式解码器传统的Transformer解码器采用动态解码每一步预测依赖上一步的输出速度慢。Informer的解码器采用一次前向传播就生成整个预测序列的方式。它输入一个由两部分组成的序列前半部分是已知的历史序列的一部分start token后半部分是全0的占位符placeholder。模型通过掩码注意力让占位符部分只能关注到已知部分及之前的占位符从而并行地生成所有未来预测值。代码实现关键ProbSparse Attention实现需要实现其核心的Query Sparsity Measurement。通常通过随机采样一部分Key来计算每个Query的稀疏度得分基于KL散度选出得分最高的Top-u个Query进行完整计算。# 伪代码示意 ProbSparse 注意力核心步骤 def prob_sparse_attention(Q, K, V): # Q, K, V: [batch_size, n_heads, seq_len, d_model] # 1. 测量查询稀疏度 M measure_query_sparsity(Q, K) # M: [batch_size, n_heads, seq_len] # 2. 选择Top-u个活跃查询 top_u_indices torch.topk(M, u, dim-1).indices # u c * log(L) # 3. 仅对选中的查询计算注意力 Q_selected Q.gather(indextop_u_indices, dim2) attn_output scaled_dot_product_attention(Q_selected, K, V) # 4. 将输出映射回原始序列位置其他位置输出可为0或均值 final_output scatter_output(attn_output, top_u_indices, original_seq_len) return final_output蒸馏层实现通常是一个Conv1d层后接ELU激活和MaxPool1d。self.distill nn.Sequential( nn.Conv1d(in_channelsd_model, out_channelsd_model, kernel_size3, padding1), nn.ELU(), nn.MaxPool1d(kernel_size3, stride2, padding1) # 长度减半 )解码器输入构造需要正确拼接label_start和zeros并设置对应的注意力掩码。实操心得在复现Informer时ProbSparse注意力的效果对超参数u选择的Query数量非常敏感。如果u设得太小可能会丢失重要信息设得太大则效率提升有限。通常需要根据具体数据集和序列长度进行调优。另外其蒸馏操作虽然压缩了序列但也可能损失一些高频细节信息对于波动非常剧烈的序列需要谨慎使用。3.2 Autoformer将序列分解内化为模型架构Autoformer的核心理念是将经典的时间序列分解思想深度集成到Transformer架构中。它认为分解出趋势和季节性成分分别建模是更符合时间序列本质的做法。核心创新点序列分解块Series Decomposition Block这是Autoformer的基础模块。它可以将任意输入序列X分解为趋势项Trend和季节性项Seasonal。在模型中这个块通过移动平均Moving Average来实现。具体来说趋势项通过对序列进行滑动平均滤波得到平滑掉短期波动季节性项则是原始序列减去趋势项后的结果。# 序列分解块伪代码 class SeriesDecomposition(nn.Module): def forward(self, x): # x: [Batch, Seq_len, Channel] trend moving_average(x, kernel_size) # 使用AvgPool1d实现 seasonal x - trend return trend, seasonal自相关机制Auto-Correlation Mechanism这是用来替代传统自注意力的新机制专门用于捕捉基于周期的依赖关系。其核心思想是时间序列中的季节性模式会导致序列与自身延迟lag后的序列存在高相关性。自相关机制通过计算序列的自相关系数类似于时间序列分析中的ACF找出哪些延迟lag是重要的然后基于这些延迟进行信息聚合。步骤1计算自相关系数对查询Q和键K做快速傅里叶变换FFT利用卷积定理高效计算所有可能延迟下的相关性。步骤2选择Top-k延迟根据自相关系数选出最相关的k个延迟lag。步骤3时延聚合根据选出的延迟将值V在时间轴上滚动roll对齐然后进行加权聚合。这个过程实现了基于周期的信息传播例如模型可以学会将“上周同期”的信息聚合到当前点。代码实现关键移动平均的实现可以使用AvgPool1dkernel_size是重要的超参数控制了趋势提取的平滑程度。自相关机制的核心在于高效计算自相关系数和执行时延聚合。# 自相关机制核心步骤伪代码 def auto_correlation_attention(Q, K, V): # 1. FFT计算自相关 Q_fft torch.fft.rfft(Q, dim-1) K_fft torch.fft.rfft(K, dim-1) # 计算互功率谱然后IFFT得到自相关序列R S Q_fft * torch.conj(K_fft) R torch.fft.irfft(S, dim-1) # R: [..., seq_len] # 2. 选择Top-k延迟lag top_k_lags torch.topk(R, k, dim-1).indices # 3. 时延聚合 V_roll [] for lag in top_k_lags: # 将V沿着时间轴滚动lag步 rolled_V torch.roll(V, shiftslag, dims2) V_roll.append(rolled_V) V_roll torch.stack(V_roll, dim-1) # 根据自相关系数R对滚动后的V进行加权求和 weights F.softmax(R.gather(indextop_k_lags, dim-1), dim-1) output torch.sum(V_roll * weights.unsqueeze(-2), dim-1) return output模型整体流程编码器和解码器都内嵌了分解块和自相关机制。编码器逐步提取季节性特征和粗略趋势。解码器采用一种“渐进式分解”的结构逐步从预测结果中分离出趋势和季节性并与编码器特征交互反复优化预测。注意事项Autoformer的自相关机制假设序列存在明显的周期性。对于周期性不明显或周期多变的数据其效果可能会打折扣。移动平均的kernel_size选择也很关键太小则趋势提取不干净太大则可能过度平滑损失有用信息。在实际代码中需要处理好序列边界滚动时的填充padding问题。3.3 FEDformer在频域中驯服长序列FEDformer另辟蹊径将主战场从时域转移到了频域。其出发点是在频域中时间序列的全局特征和周期性可以更紧凑地表示并且一些在时域复杂的操作如卷积在频域会变得简单。核心创新点频域增强的注意力Frequency Enhanced AttentionFEDformer提出了一种混合的注意力机制同时在时域和频域进行操作。具体来说它将查询Q、键K、值V通过傅里叶变换FFT或小波变换Wavelet Transform转换到频域在频域选择一个固定的、可学习的低频分量基底如选择前几个低频的傅里叶系数对这些基底进行注意力计算。由于选择的基底数量远小于序列长度注意力计算复杂度大大降低。频域分解与混合专家MoEFEDformer利用傅里叶变换将序列分解为不同频率的分量。它可以配置多个“专家”每个专家负责处理一个特定频带如低频、中频、高频的信息然后通过一个门控网络Gating Network聚合这些专家的输出。这类似于对序列进行了自适应频域分解和建模。Wavelet Transform的引入除了标准的FFTFEDformer还探索了小波变换。小波变换能同时提供时间和频率的局部信息而FFT只提供全局频率信息对于非平稳时间序列可能更有优势。代码实现关键傅里叶/小波变换层需要集成torch.fft或pywt小波变换库来实现变换和逆变换。频域注意力实现关键在于如何选择频域基底。一种常见做法是随机选择固定数量的傅里叶模式Fourier modes。class FrequencyEnhancedAttention(nn.Module): def __init__(self, d_model, n_heads, num_freq_modes): super().__init__() self.num_freq_modes num_freq_modes # 选择的低频模式数量 # ... 初始化投影层等 def forward(self, Q, K, V): # 1. 转换到频域 Q_freq torch.fft.rfft(Q, dim-2) # 沿时间维度做FFT K_freq torch.fft.rfft(K, dim-2) V_freq torch.fft.rfft(V, dim-2) # 2. 选择低频模式例如前num_freq_modes个 # 注意rfft输出的频率分量是共轭对称的只需取前半部分 selected_modes slice(0, self.num_freq_modes) Q_freq_low Q_freq[..., selected_modes, :] K_freq_low K_freq[..., selected_modes, :] V_freq_low V_freq[..., selected_modes, :] # 3. 在频域进行注意力计算维度已大幅缩减 attn_output_freq scaled_dot_product_attention(Q_freq_low, K_freq_low, V_freq_low) # 4. 将未选中的高频模式置零或保留原值然后逆变换回时域 full_freq_output torch.zeros_like(Q_freq) full_freq_output[..., selected_modes, :] attn_output_freq output torch.fft.irfft(full_freq_output, dim-2, nQ.size(-2)) return output混合专家MoE集成需要实现一个门控网络根据输入动态决定每个专家的权重。踩坑记录在频域进行操作时一个常见的陷阱是混叠Aliasing和边界效应。FFT假设序列是周期性的如果序列首尾不连续变换后会引入高频噪声。通常需要在序列两端进行适当的填充如镜像填充来缓解。另外选择多少低频模式是一个权衡模式太少会丢失信息太多则效率提升有限。小波变换虽然更灵活但需要选择合适的小波基并且计算开销通常比FFT大。3.4 其他重要模型速览除了上述三个“明星”模型这个领域还有许多其他有价值的创新。了解它们有助于我们形成更全面的技术视野。Pyraformer受图像金字塔启发构建了一个时间序列的金字塔结构。通过不同尺度的卷积构建多分辨率表示并在不同尺度间进行注意力计算从而同时捕获短期和长期依赖。其复杂度是线性的。Non-stationary Transformer专门针对非平稳时间序列设计。它提出了一种“去平稳化”模块用于稳定序列的统计特性如均值和方差使Transformer能更好地学习。预测时再进行“平稳化”还原。PatchTST将时间序列划分为不重叠的“片段”Patch每个片段作为一个基本单元输入Transformer。这大大缩短了输入序列的长度降低了计算成本同时片段本身能捕获局部模式。它证明了即使使用最简单的标准Transformer只要输入表示得当即Patch化也能在长序列预测上取得优异效果。TimesNet将一维时间序列转换到二维空间进行分析。它通过多周期识别将一维序列沿着多个周期长度进行折叠形成多个二维张量类似“时钟图”然后使用二维卷积网络来捕捉周期内和周期间的变化。这是一种全新的视角。DLinear一篇非常简洁但效果惊人的工作。它指出对于许多时间序列预测问题一个简单的线性层在充分分解趋势季节性后其性能可以媲美甚至超越复杂的Transformer模型。这引发了关于Transformer在时间序列预测中必要性的深刻反思。iTransformer对Transformer架构进行了“反转”处理。它将变量维度作为序列长度时间点维度作为特征维度。这意味着自注意力机制作用于不同变量之间以此来建模多元时间序列变量间的复杂依赖关系而时间维度则用简单的多层感知机MLP处理。在一些多元预测数据集上表现突出。Crossformer专注于多元时间序列设计了维度分段注意力Dimensional Segment Attention和两阶段注意力Two-Stage Attention来分别捕获变量内的时间依赖和变量间的交叉依赖。MICN引入了多尺度等变卷积和交互式学习强调局部特征的提取和多尺度信息的融合。SCINet基于样本卷积和交互网络通过下采样和交互操作来学习多尺度表示。MTGNN专注于图神经网络与时间序列的结合用于建模具有图结构关系的多元序列如交通网络传感器。StemGNN同样结合了图神经网络和频谱方法从频谱角度学习变量间的图结构并进行预测。TiDE一个简单的MLP-based模型强调通过残差连接和特征投影实现高效的长序列预测。LightTS顾名思义追求轻量化和高效率通过精心设计的轻量级模块实现快速预测。4. 代码汇总与实战指南如何选择、复现与调优面对这么多模型初学者很容易感到迷茫。本节将提供一个实战路线图帮助你高效地利用这些代码资源。4.1 代码资源定位与结构解析通常这些模型的代码会在GitHub上以开源项目形式发布。一个典型的项目结构如下long-term-forecasting/ ├── data/ │ ├── data_loader.py # 数据加载与预处理 │ └── dataset.py # 数据集定义 ├── models/ │ ├── informer.py │ ├── autoformer.py │ ├── fedformer.py │ ├── patchtst.py │ └── ... (其他模型) ├── experiments/ │ └── exp_basic.py # 基础实验类包含训练、验证、测试循环 ├── utils/ │ ├── tools.py # 工具函数指标计算、早期停止等 │ └── timefeatures.py # 时间特征编码 ├── main.py # 主入口脚本解析参数启动实验 └── requirements.txt # 依赖包列表关键文件解读data_loader.py这是第一个需要攻克的关卡。它决定了数据如何被切割成训练/验证/测试集如何构造输入序列X和输出标签Y。常见的切割方式是按时间顺序前70%训练中间10%验证最后20%测试。seq_len历史长度和label_len解码器已知长度、pred_len预测长度是这里最重要的参数。exp_basic.py定义了训练流程。你需要关注学习率调度器如ReduceLROnPlateau、损失函数通常是MSE或MAE、优化器Adam或AdamW的设置。梯度裁剪对于训练Transformer类模型通常很重要可以防止梯度爆炸。各个model.py这是核心。阅读时重点关注模型的__init__方法了解结构和forward方法理解数据流。特别注意那些核心创新模块的实现。4.2 模型选择策略没有银弹只有合适选择哪个模型取决于你的数据特性和任务需求。下面是一个决策参考数据/任务特征推荐模型理由数据具有强周期性如电力、交通Autoformer,FEDformerAutoformer的自相关机制显式建模周期依赖FEDformer的频域方法天然适合捕捉周期性。数据周期性弱或非平稳如股票价格、某些商业指标Non-stationary Transformer,PatchTST,DLinearNon-stationary Transformer专门处理非平稳性PatchTST和DLinear更通用对周期假设依赖小。预测长度极长500点Informer,Pyraformer,PatchTST这些模型在计算效率上优化明显专为超长序列设计。追求极简部署与速度DLinear,LightTS,TiDE结构简单参数少推理速度快适合资源受限或对延迟要求高的场景。多元序列且变量间关系重要如气象、多指标系统iTransformer,Crossformer,MTGNN,StemGNN这些模型专门设计了变量间关系的建模机制。希望尝试新视角TimesNet将时序转为二维分析思路新颖在某些数据集上效果拔群。一个实用的建议是从DLinear或PatchTST开始基准测试。它们实现简单速度快能提供一个强大的基线。如果效果不满足再根据数据特点转向更复杂的模型如周期性强的用Autoformer需要高效长程建模的用Informer。4.3 复现与调试核心步骤环境搭建严格按照requirements.txt安装依赖特别注意PyTorch和CUDA版本的匹配。这是避免无数奇怪错误的第一步。数据准备理解你的数据格式。大多数开源代码支持.csv文件要求第一列是日期时间后面各列是特征。确保数据已经处理了缺失值如向前填充并进行了标准化如Z-Score标准化。标准化必须按训练集统计量进行并应用到验证集和测试集这是常见的错误点。参数配置重点关注main.py或配置文件中的以下参数seq_len,label_len,pred_len模型输入输出长度的定义需根据业务理解设置。features预测模式。M表示多变量预测多变量MS表示多变量预测单变量S表示单变量预测单变量。d_model隐层维度通常越大能力越强但也更容易过拟合。e_layers,d_layers编码器和解码器层数。不是越深越好对于时间序列2-3层往往足够。learning_rate,batch_size需要调优。可以从1e-4, 32开始尝试。训练监控使用TensorBoard或WandB记录训练和验证损失。观察验证损失是否平稳下降是否出现过拟合训练损失降验证损失升。如果出现过拟合可以尝试增加Dropout率、使用权重衰减、或获取更多数据。结果分析不要只看最终的MSE或MAE指标。一定要可视化预测曲线将预测结果和真实值画在同一张图上观察模型在哪里预测得好在哪里预测得差是拐点抓不住还是趋势预测反了还是幅度预测不准。这能给你提供比单一数字丰富得多的信息用于指导模型改进。4.4 常见问题与调优技巧问题1训练损失震荡大难以收敛。检查学习率是否过高尝试降低学习率如从1e-3降到1e-4或使用学习率热身Warmup。检查梯度裁剪是否启用尝试设置grad_clip_value如1.0。检查数据标准化是否正确异常值是否处理问题2验证集效果远差于训练集明显过拟合。尝试增加Dropout在注意力层和FFN层后。尝试增强L2权重衰减weight_decay参数。尝试减少模型容量降低d_model或层数。尝试使用更激进的数据增强如添加高斯噪声、随机缩放、随机掩蔽对于时序数据需谨慎可能破坏连续性。问题3模型对长期预测pred_len大效果急剧下降。思考这是长序列预测的固有难题。可以尝试增加seq_len给模型更长的历史上下文。思考是否使用了适合长预测的模型切换到Informer、Autoformer等专为长序列设计的模型。思考尝试多步预测策略从“直接多步预测”改为“递归多步预测”或“多输出多步预测”虽然可能增加误差累积但有时更稳定。问题4预测结果过于平滑捕捉不到尖峰或突变。分析模型可能过度依赖移动平均或低频成分。对于Autoformer尝试减小移动平均的kernel_size。对于FEDformer尝试保留更多高频模式。分析损失函数是否合适MSE倾向于给出平均解容易平滑。可以尝试MAE或Huber Loss它们对异常点更鲁棒。尝试在模型输出后添加一个轻量级的残差修正模块专门学习预测误差的模式。个人经验之谈在时间序列预测中特征工程和领域知识的融入常常比换模型带来的提升更大。例如显式地加入小时、星期、月份、是否为节假日等时间特征对于电力数据加入温度、天气等协变量对于商业数据加入促销活动标志。将这些特征作为额外的通道Channel输入模型能极大提升模型对上下文的理解。许多开源代码的timefeatures.py提供了基础的时间特征编码你可以在此基础上扩展。记住模型是引擎数据和质量是燃料。本文还有配套的精品资源点击获取