正在加载中...

展开本页目录
算法教程DeepAR-DeepAR

DeepAR-DeepAR

No.151 · 在线教程

DeepAR-DeepAR 模块在当前项目中的真实实现,是一个面向单变量时间序列概率预测的简化版 DeepAR 流程。系统允许用户指定一个目标列 y 和若干数值型协变量列 x,先按时间顺序构造“历史上下文 + 未来预测区间”滑动窗口,再利用 LSTM + Gaussian li…

DeepAR-DeepAR

1. 方法概述

DeepAR-DeepAR 模块在当前项目中的真实实现,是一个面向单变量时间序列概率预测的简化版 DeepAR 流程。系统允许用户指定一个目标列 \(y\) 和若干数值型协变量列 \(x\),先按时间顺序构造“历史上下文 + 未来预测区间”滑动窗口,再利用 LSTM + Gaussian likelihood 学习未来序列的条件分布参数,最后通过采样得到预测均值与分位数区间。该实现保留了 DeepAR 的核心思想,但属于较轻量的工程版本,并未实现论文中更复杂的多序列 embedding、类别特征嵌入或分层概率建模。

设原始时序数据为

$$ \mathcal{D}=\{(t_i,y_i,\mathbf{x}_i)\}_{i=1}^{N},\qquad y_i\in\mathbb{R},\ \mathbf{x}_i\in\mathbb{R}^{d} \tag{1} $$

其中 \(t_i\) 为可选时间列,\(\mathbf{x}_i\) 为协变量向量;当未指定时间列时,程序按原始行顺序将样本视为等间隔时间步。

2. 数据清洗、窗口构造与时间切分

2.1 数据清洗与排序

程序首先检查目标列和协变量列是否存在,并要求它们都可转换为数值型;若设置了时间列,则先按时间升序稳定排序,再删除含缺失值的记录。清洗后的数据记为

$$ \tilde{\mathcal{D}}=\{(\tilde t_i,\tilde y_i,\tilde{\mathbf{x}}_i)\}_{i=1}^{\tilde N} \tag{2} $$

其中 \(\tilde N\) 为有效样本数。代码还显式禁止“协变量列包含目标列或时间列”这类非法配置。

2.2 历史上下文与未来预测窗口

设历史窗口长度为 \(L_c\),未来预测长度为 \(L_p\),滑动步长为 \(s\)。对任一起点 \(r\),构造

$$ \mathbf{y}^{(r)}_{\mathrm{ctx}}= \begin{bmatrix} \tilde y_r,\tilde y_{r+1},\ldots,\tilde y_{r+L_c-1} \end{bmatrix}, \qquad \mathbf{y}^{(r)}_{\mathrm{fut}}= \begin{bmatrix} \tilde y_{r+L_c},\ldots,\tilde y_{r+L_c+L_p-1} \end{bmatrix} \tag{3} $$

以及对应协变量窗口

$$ \mathbf{X}^{(r)}_{\mathrm{ctx}}\in\mathbb{R}^{L_c\times d}, \qquad \mathbf{X}^{(r)}_{\mathrm{fut}}\in\mathbb{R}^{L_p\times d} \tag{4} $$

代码要求

$$ \tilde N\ge L_c+L_p,\qquad L_c\ge 2,\qquad L_p\ge 1,\qquad s\ge 1 \tag{5} $$

可构造窗口总数为

$$ M=\left\lfloor\frac{\tilde N-(L_c+L_p)}{s}\right\rfloor+1 \tag{6} $$

2.3 按原时间轴切分训练集、验证集与测试集

设训练、验证、测试比例分别为 \(r_{\mathrm{tr}},r_{\mathrm{va}},r_{\mathrm{te}}\),并满足

$$ r_{\mathrm{tr}}+r_{\mathrm{va}}+r_{\mathrm{te}}=1 \tag{7} $$

程序先在原始时间轴上确定切分位置

$$ n_{\mathrm{tr}}=\lfloor \tilde N r_{\mathrm{tr}}\rfloor,\qquad n_{\mathrm{va}}=n_{\mathrm{tr}}+\lfloor \tilde N r_{\mathrm{va}}\rfloor \tag{8} $$

若窗口 \(r\) 的预测起点与终点分别为

$$ a_r=r+L_c,\qquad b_r=a_r+L_p \tag{9} $$

则代码按如下规则分配窗口:

$$ \begin{aligned} r\in \mathcal{T}_{\mathrm{train}} &\iff b_r\le n_{\mathrm{tr}}\\ r\in \mathcal{T}_{\mathrm{val}} &\iff a_r\ge n_{\mathrm{tr}}\ \land\ b_r\le n_{\mathrm{va}}\\ r\in \mathcal{T}_{\mathrm{test}} &\iff a_r\ge n_{\mathrm{va}} \end{aligned} \tag{10} $$

跨越边界的窗口会被直接丢弃,因此该模块的切分方式严格遵守时间因果顺序,避免未来信息泄漏。

2.4 标准化

若勾选 standardize,程序仅使用训练窗口的统计量对目标值和协变量做标准化。对任一变量 \(z\),变换为

$$ z^{\ast}=\frac{z-\mu_z}{\sigma_z+\varepsilon} \tag{11} $$

其中 \(\mu_z,\sigma_z\) 由训练集中 y_context + y_futurex_context + x_future 展开后的样本估计,\(\varepsilon=10^{-12}\) 用于数值稳定。预测完成后,目标值和各分位数会再反标准化回原始量纲。

3. DeepAR 核心模型

3.1 LSTM 输入表示

当前实现采用单一 LSTM 主体。在历史上下文阶段,每个时间步的输入由当前观测目标值与当期协变量拼接组成:

$$ \mathbf{u}_t= \begin{bmatrix} y_t\\ \mathbf{x}_t \end{bmatrix} \in\mathbb{R}^{1+d} \tag{12} $$

LSTM 状态更新可抽象写为

$$ (\mathbf{h}_t,\mathbf{c}_t)=\mathrm{LSTM}(\mathbf{u}_t,\mathbf{h}_{t-1},\mathbf{c}_{t-1}) \tag{13} $$

界面可设置 hidden_sizenum_layersdropout;其中 dropout 仅在 num_layers > 1 时真正生效。

3.2 Teacher Forcing 解码

训练阶段,解码器并不是用上一步预测值,而是采用 teacher forcing。对未来第 \(k\) 步,其上一时刻输入定义为

$$ y^{\mathrm{prev}}_{k}= \begin{cases} y_{L_c}, & k=1\\ y_{L_c+k-1}, & k\ge 2 \end{cases} \tag{14} $$

因此未来阶段的解码输入可写为

$$ \mathbf{v}_k= \begin{bmatrix} y^{\mathrm{prev}}_{k}\\ \mathbf{x}^{\mathrm{fut}}_k \end{bmatrix} \tag{15} $$

程序将历史上下文输入与未来 teacher forcing 输入首尾拼接后一次送入 LSTM,再取最后 \(L_p\) 个隐藏状态用于输出未来分布参数。

3.3 高斯分布参数输出

对每个未来时刻的隐藏状态 \(\mathbf{h}_k\),程序分别通过两个线性层输出均值和标准差:

$$ \mu_k=W_{\mu}\mathbf{h}_k+b_{\mu} \tag{16} $$

$$ \sigma_k=\mathrm{softplus}(W_{\sigma}\mathbf{h}_k+b_{\sigma})+\sigma_{\min} \tag{17} $$

其中 \(\sigma_{\min}=10^{-3}\) 为内部默认下界参数 min_sigma,用于避免方差塌缩到 0。

4. 训练目标、采样推断与轻量模式

4.1 Gaussian NLL 训练目标

程序假设未来目标满足条件高斯分布

$$ y_k\mid \mathcal{F}_{k-1}\sim \mathcal{N}(\mu_k,\sigma_k^2) \tag{18} $$

单点负对数似然为

$$ \ell_k=\frac{1}{2}\ln(2\pi)+\ln \sigma_k+\frac{(y_k-\mu_k)^2}{2\sigma_k^2} \tag{19} $$

对一个 batch 的平均训练损失为

$$ \mathcal{L}=\frac{1}{B L_p}\sum_{b=1}^{B}\sum_{k=1}^{L_p}\ell_{b,k} \tag{20} $$

优化器为 Adam,验证阶段同样计算 Gaussian NLL,并以最小验证损失作为早停与最佳模型保存依据。

4.2 采样式推断

测试阶段,程序先用历史上下文得到最终隐状态,再对未来区间逐步采样。第 \(k\) 步采样公式为

$$ \hat y_k^{(m)}=\mu_k+\sigma_k\epsilon_k^{(m)},\qquad \epsilon_k^{(m)}\sim\mathcal{N}(0,1) \tag{21} $$

其中 \(m=1,2,\ldots,S\),num_samples 的默认值为 \(S=200\)。由采样结果得到预测均值和分位数:

$$ \hat y_k^{\mathrm{mean}}=\frac{1}{S}\sum_{m=1}^{S}\hat y_k^{(m)} \tag{22} $$

$$ \hat q_k^{(\alpha)}=\mathrm{Quantile}_{\alpha}\!\left(\{\hat y_k^{(m)}\}_{m=1}^{S}\right),\qquad \alpha\in\{0.05,0.50,0.95\} \tag{23} $$

代码最终导出 y_pred_meany_pred_p05y_pred_p50y_pred_p95

4.3 轻量模式

若设置 skip_training=True,程序不会调用 torch 训练网络,而是直接使用“历史窗口最后一个观测值重复外推”的基线:

$$ \hat y_{r,k}^{\mathrm{lite}}=y_{r,L_c}^{\mathrm{ctx}},\qquad k=1,2,\ldots,L_p \tag{24} $$

此时 \(p05 = p50 = p95 = \hat y^{\mathrm{lite}}\),因此区间宽度为 0。该模式适合在未安装 torch 时验证数据流程,但不能视为 DeepAR 真实训练结果

5. 评价指标与输出结果解释

预测均值与真实值之间的误差指标为

$$ \mathrm{MAE}=\frac{1}{M_{\mathrm{te}}L_p}\sum_{r\in\mathcal{T}_{\mathrm{test}}}\sum_{k=1}^{L_p}\left|y_{r,k}-\hat y_{r,k}^{\mathrm{mean}}\right| \tag{25} $$

$$ \mathrm{RMSE}=\sqrt{\frac{1}{M_{\mathrm{te}}L_p}\sum_{r\in\mathcal{T}_{\mathrm{test}}}\sum_{k=1}^{L_p}\left(y_{r,k}-\hat y_{r,k}^{\mathrm{mean}}\right)^2} \tag{26} $$

$$ \mathrm{MAPE}=\frac{1}{M_{\mathrm{te}}L_p}\sum_{r\in\mathcal{T}_{\mathrm{test}}}\sum_{k=1}^{L_p}\left|\frac{y_{r,k}-\hat y_{r,k}^{\mathrm{mean}}}{\max(|y_{r,k}|,10^{-12})}\right| \tag{27} $$

对概率区间,系统还输出

$$ \mathrm{P90Coverage}=\frac{1}{M_{\mathrm{te}}L_p}\sum_{r,k}\mathbf{1}\!\left(y_{r,k}\in[\hat q_{r,k}^{(0.05)},\hat q_{r,k}^{(0.95)}]\right) \tag{28} $$

$$ \mathrm{P90Width}=\frac{1}{M_{\mathrm{te}}L_p}\sum_{r,k}\left(\hat q_{r,k}^{(0.95)}-\hat q_{r,k}^{(0.05)}\right) \tag{29} $$

程序导出的结果主要包括:

  • Parameters:完整参数字典;
  • RawData:输入数据摘要,当前代码保存的是原表形状与列名,而不是整张原始数据表;
  • Windowing:窗口长度、预测长度、步长、窗口数;
  • Split:时间切分位置与各子集窗口数量;
  • Metricsmaermsemapep90_coveragep90_width
  • Training_Log:逐 epoch 的 train_lossval_loss
  • Predictionswindowsteptimey_truey_pred_meany_pred_p05y_pred_p50y_pred_p95
  • Charts:图表文件路径索引。

此外,系统通常还会生成 training_curve.pngforecast_window0.png,并在结果目录中自动附带一个 repro_*.py 复现实验脚本。

6. 算法流程

按照当前项目实现,DeepAR-DeepAR 的计算流程可归纳为:

  1. 读取 Excel/CSV 数据,并选择时间列、目标列与协变量列;
  2. 检查列合法性与数值类型,按时间排序并删除缺失行;
  3. context_lengthprediction_lengthstride 构造滑动窗口;
  4. 按原始时间轴切分训练集、验证集与测试集,并丢弃跨边界窗口;
  5. 若启用 standardize,则用训练窗口统计量标准化目标与协变量;
  6. 构建 LSTM + Gaussian likelihood 模型,并用 teacher forcing 训练;
  7. 使用验证集 Gaussian NLL 做早停并恢复最佳参数;
  8. 在测试集上通过多次采样得到均值与分位数区间;
  9. 计算误差指标与区间指标,自动导出 Excel、图表和复现脚本。

7. 关键参数说明

表 1 关键参数及含义

参数 含义 当前默认值
time_col 时间列名,可为空 None
target_col 目标列名 用户指定
covariate_cols 协变量列列表 可为空
context_length 历史上下文长度 \(L_c\) 24
prediction_length 未来预测长度 \(L_p\) 12
stride 滑窗步长 1
train_ratio 训练集比例 0.70
val_ratio 验证集比例 0.15
test_ratio 测试集比例 自动补足为 0.15
standardize 是否按训练集统计量标准化 True
hidden_size LSTM 隐藏层维度 64
num_layers LSTM 层数 2
dropout LSTM dropout 比例 0.10
min_sigma 标准差下界稳定项 \(10^{-3}\)
epochs 最大训练轮数 50
batch_size 批大小 64
lr 学习率 \(10^{-3}\)
patience 早停耐心轮数 10
num_samples 测试阶段采样次数 200
device 训练设备 auto
skip_training 是否启用轻量基线模式 False
test_stride 测试窗口抽样步长,0 表示取 prediction_length 0

8. 论文写作模板

8.1 方法描述模板

可在论文“方法部分”中写为:

“本文采用基于 DeepAR 思想的概率时序预测模型对目标序列进行建模。首先,将时间序列整理为长度为 \(L_c\) 的历史上下文窗口和长度为 \(L_p\) 的未来预测窗口,并按原始时间顺序划分训练集、验证集与测试集;其次,利用 LSTM 对历史目标与协变量的联合序列进行编码,在未来阶段采用 teacher forcing 方式递推隐藏状态,并通过线性投影输出各预测步的高斯分布参数 \((\mu_k,\sigma_k)\);随后,以 Gaussian negative log-likelihood 作为优化目标训练模型,并在测试阶段通过多次采样得到预测均值以及 5%、50%、95% 分位数区间;最后,使用 MAE、RMSE、MAPE、区间覆盖率和区间宽度评价模型在点预测与概率预测两个层面的性能。”

8.2 结果解释模板

结果部分可写为:DeepAR 不仅输出点预测均值,还给出预测区间,因此可同时评价精度与不确定性。若区间覆盖率较高且区间宽度适中,则说明模型在不确定性刻画方面较为合理;若区间过宽,则需讨论模型保守预测的问题。

8.3 表格标题模板

表题可写为:DeepAR 概率预测结果与区间评价指标汇总表。

8.4 图表题注模板

图注可写为:DeepAR 模型预测均值及 95% 预测区间示意图。

8.5 表格示例

建议列名:时间点、真实值、预测均值、5% 分位数、50% 分位数、95% 分位数、RMSE、MAPE、覆盖率。

9. 实现说明与注意事项

  • 该模块适用于单变量目标、可附带数值型协变量的时序概率预测任务,尤其适合需要同时输出点预测和区间预测的场景。
  • 当前实现是 PyTorch + LSTM + Gaussian likelihood 的简化版 DeepAR,不包含原论文常见的多时间序列全局 embedding、类别静态特征建模等扩展结构,论文表述时应与真实实现保持一致。
  • 训练功能依赖 torch;若未安装 torch,正常训练会报错。只有在 skip_training=True 时,才能跳过训练并输出基线预测结果。
  • 测试阶段默认并不会评估全部重叠测试窗口,而是以 prediction_length 为步长抽样测试窗口,从而减少高度重叠窗口带来的重复统计。
  • RawData 工作表当前仅保存原始数据摘要;若需要保留完整输入数据,应同时保存原始文件或使用结果目录中的 repro_inputs 副本。
  • context_lengthprediction_length 过大,或时间切分比例设置不合理时,训练集/验证集窗口可能为空;代码会直接报错并要求重新调整参数。

10. 论文写作建议

论文中建议同时报告点预测指标和区间预测指标,不要只给 RMSE/MAE。一个较完整的结果组织方式是:

  1. 高斯分布参数与预测区间说明;
  2. 测试集点预测误差表;
  3. 区间覆盖率与区间宽度表;
  4. 真实值、预测均值和分位数带图。

若论文强调 DeepAR,应说明当前实现是简化版单序列 Gaussian DeepAR,而不是原论文中的完整全局多序列框架。

11. 单篇终审补充

11.1 图题与表题对齐建议

  • Parameters 表可写为:表X DeepAR 参数设置与运行配置。
  • RawData 表可写为:表X DeepAR 原始时间序列数据摘要。
  • Windowing 表可写为:表X DeepAR 滑动窗口构造信息。
  • Split 表可写为:表X DeepAR 训练集、验证集与测试集切分结果。
  • Metrics 表可写为:表X DeepAR 点预测与区间预测评价指标。
  • Training_Log 表可写为:表X DeepAR 训练过程记录。
  • Predictions 表可写为:表X DeepAR 测试样本预测均值与分位数区间结果。
  • Charts 表可写为:表X DeepAR 图表索引与路径清单。
  • forecast_window0.png 建议写为:图X DeepAR 预测均值及区间带示意图。

11.2 终审说明

  • 当前代表性结果目录中的真实工作簿为 DeepAR_results_20260313_225827.xlsx,同目录还存在另一份时间戳相邻的工作簿副本;论文引用输出文件时,建议固定引用一次主运行文件名,避免把相邻自动导出副本误写成不同实验。
  • 当前结果目录可见的实体图文件主要是 forecast_window0.png,因此正文更适合围绕“预测均值与区间带”展开,不应虚构多张训练损失图或额外分解图。
  • RawData 工作表在真实实现中保存的是原始数据摘要,不是全量输入表。若论文附录需要完整原始数据,应引用结果目录下的 repro_inputs/window4_deepar_ui_input.csv 或原始输入文件。
  • 复现脚本真实口径为 repro_DeepAR-DeepAR_*.py,并通过 INPUT_FILE = 'repro_inputs/window4_deepar_ui_input.csv' 读取输入副本;附录中展示复现实验命令时,应保持这一相对路径结构。
  • 当前实现虽然会输出分位数区间,但本质仍是单序列、LSTM 高斯似然的简化版 DeepAR。论文中不能把 WindowingSplitPredictions 这些导出表误解释为原论文多序列全局训练框架的完整证据。

11.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/深度学习与时序网络/DeepAR-DeepAR,本次采用的代表性结果目录为 具体的算法3/深度学习与时序网络/DeepAR-DeepAR/results/DeepAR-DeepAR分析结果_20260313_225827

当前目录中真实存在两份时间相邻的工作簿:

  • DeepAR_results_20260313_225827.xlsx
  • DeepAR_results_20260313_225828.xlsx

两者实测工作表一致,均包含:

  • Parameters
  • RawData
  • Windowing
  • Split
  • Metrics
  • Training_Log
  • Predictions
  • Charts

因此这篇应明确区分:...225827.xlsx 可以视为主结果,...225828.xlsx 是同目录 repro 或近邻再导出的副本,不能把两者当成两轮不同实验分别解读。

当前目录中的真实图文件只有一张:

  • 具体的算法3/深度学习与时序网络/DeepAR-DeepAR/results/DeepAR-DeepAR分析结果_20260313_225827/forecast_window0.png

这说明当前可视化证据聚焦于第一个预测窗口的均值与区间带,并没有同时保存训练损失曲线、全测试集多窗口图或额外分位数拆分图。文档应据此收敛图题口径。

复现实物方面,该目录实际包含:

  • 具体的算法3/深度学习与时序网络/DeepAR-DeepAR/results/DeepAR-DeepAR分析结果_20260313_225827/repro_DeepAR-DeepAR_20260313_225827.py
  • 具体的算法3/深度学习与时序网络/DeepAR-DeepAR/results/DeepAR-DeepAR分析结果_20260313_225827/repro_inputs/window4_deepar_ui_input.csv

脚本中明确写成 INPUT_FILE = 'repro_inputs/window4_deepar_ui_input.csv'OUTPUT_DIR = "."。因此这一轮真实可复现口径已经是“结果目录内部输入副本 + 同目录输出重建”,而不是依赖算法根目录 uploads/ 的外部 CSV。

10. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/深度学习与时序网络/DeepAR-DeepAR/results/DeepAR-DeepAR分析结果_20260313_225827
  • 正文应围绕 ParametersRawDataWindowingSplitMetricsTraining_LogPredictionsCharts 来写。
  • 图证应对应 forecast_window0.png,并把第一个预测窗口的区间带和均值曲线说明清楚。
  • 复现脚本应按 repro_DeepAR-DeepAR_20260313_225827.py + repro_inputs/window4_deepar_ui_input.csv 的口径说明。