100种模型实现时间序列预测!Pytorch框架,一行代码随意切换!

0 阅读9分钟

本期项目是什么?

一句话概括:一个集成了100种时序预测模型的Python框架,覆盖从传统机器学习到最新深度学习的主流方法,模型主要以Pytorch框架来搭建,只需修改一个变量即可一键切换模型,自动完成训练、预测、评估、绘图、概率预测全流程,且可以一键切换四种案例任务:

  • 案例1 — 单特征输入 + 单步预测

  • 案例2 — 单特征输入 + 多步预测

  • 案例3 — 多特征输入 + 单步预测

  • 案例4 — 多特征输入 + 多步预测

不需要你懂每个模型怎么搭,不需要你自己写训练循环,不需要你手动画图算指标。你要做的就是:

flag = 
'LSTM'
          
# 想用哪个模型,改这里就行

改成 'Transformer''XGBOOST''Mamba',或者其他任意97种,直接运行,完事。


支持哪些模型

100种模型,我总结分类了一下:

| 类别 | 数量 | 包含模型 | | --- | --- | --- | | 基础RNN系列 | 9 | LSTM、BiLSTM、GRU、BiGRU、RNN 及其Attention变体 | | CNN+RNN组合 | 8 | CNN_LSTM、CNN_BiLSTM、CNN_GRU、CNN_BiGRU 及其Attention变体 | | TCN系列 | 5 | TCN、TCN_RNN、TCN_LSTM、TCN_GRU、TCN_BiGRU | | BiTCN系列 | 3 | BiTCN_BiGRU、BiTCN_GRU、BiTCN_LSTM | | Transformer | 1 | Transformer | | KAN系列 | 4 | BiLSTM_KAN、GRU_KAN、LSTM_KAN、Transformer_KAN | | TensorFlow模型 | 4 | Seq2Seq、WaveNet、BERT、Informer | | 传统机器学习 | 17 | BP、CART、随机森林、GBDT、XGBoost、SVR、RBF、ELM、KNN、AdaBoost、ExtraTrees、LightGBM、CatBoost、Ridge、Lasso、ElasticNet等 | | 简洁高效网络 | 4 | CNN_1D、DLinear、NLinear、SegRNN | | 高级RNN变体 | 4 | ResLSTM、DA-RNN、TPA-LSTM、BiLSTM_CNN | | 顶会Transformer变体 | 10 | PatchTST、iTransformer、Autoformer、Crossformer、TimesNet、FEDformer、Non-stationary Transformer、Pyraformer、ETSformer、TimeXer | | 顶会高效/轻量模型 | 7 | TSMixer、TiDE、FreTS、FITS、SparseTSF、ModernTCN、Koopa | | 注意力增强模型 | 6 | SE_LSTM、CBAM_LSTM、ECA_LSTM、MultiHead_LSTM、CrossAttention_LSTM、CBAM_CNN_BiLSTM | | 组合模型 | 12 | CNN_Transformer、LSTM_Transformer、TCN_Transformer、BiTCN_Transformer、Transformer_GRU、TCN_Attention_GRU、CNN_SE_BiLSTM、ECA_CNN_Transformer等 | | Mamba/SSM系列 | 5 | Mamba、Mamba_LSTM、Mamba_Attention、Mamba_Transformer、BiLSTM_Mamba | | SCINet | 1 | SCINet |

从最基础的LSTM,到2024年顶会的TimesNet、PatchTST、Mamba,再到传统的XGBoost、随机森林,全部收录。


支持哪些预测任务

四种任务类型,以负荷预测任务为例,全部100个模型通用:

| 任务类型 | 输入 | 输出 | 典型场景 | | --- | --- | --- | --- | | 案例1 | 单特征 | 单步预测 | 用历史负荷预测下一时刻负荷 | | 案例2 | 单特征 | 多步预测 | 用历史负荷预测未来一段时间负荷 | | 案例3 | 多特征 | 单步预测 | 用温度+湿度+历史负荷预测下一时刻负荷 | | 案例4 | 多特征 | 多步预测 | 用多维特征预测未来多个时刻负荷 |

切换方式很简单,只需要修改三个参数:n_in(输入窗口长度)、n_out(预测步长)、valuess(取哪些列作为输入特征)。代码里给出了四种案例的完整配置示例,直接照搬就行。


代码核心功能一览

1. 一键切换模型

修改 flag 变量即可,所有模型共享同一套数据处理、训练、评估、绘图流程,无需改动其他任何代码。

flag = 
'SegRNN'
     
# 在此切换模型名称

epochs = 
80
              
# 训练轮数(深度学习模型有效,sklearn 模型忽略此参数)

batch_size = 
8
           
# Mini-batch 大小

learning_rate = 
1e-4
     
# 学习率

fit_or_not = 
1
           
# 1=重新训练并保存模型, 0=加载已保存模型直接预测

2. 一键更改模型参数

代码可以十分方便的一键更改每个模型参数,都在主函数写好了接口:

def many_model(flag, fit_or_not, epochs, batch, learning_rate,               vp_train, vp_val, vp_test, vt_train, vt_val, vt_test,               m_out, n_out, n_in, or_dim, task_tag=""):

    
"""    根据 flag 选择对应模型并执行训练/预测。    如需调整某个模型的超参数,在下方对应的 elif 分支中直接修改即可。    Parameters    ----------    flag : str          模型名称标识    fit_or_not : int    1=重新训练并保存模型, 0=加载已保存模型直接预测    epochs : int        训练轮数(仅深度学习有效)    batch : int         Mini-batch 大小    learning_rate : float  学习率    vp_train/vp_val/vp_test : ndarray  归一化后的输入特征(训练/验证/测试)    vt_train/vt_val/vt_test : ndarray  归一化后的目标值(训练/验证/测试)    m_out : MinMaxScaler  输出反归一化器    n_out : int         预测步长    n_in : int          输入时间窗口长度    or_dim : int        输入特征维度    task_tag : str      任务类型标签,用于结果文件夹命名    Returns    -------    model_obj : modelss             模型管理对象(含 predict_interval 等方法)    xunlian_predicted_data : ndarray  训练集预测结果(已反归一化)    ceshi_predicted_data : ndarray    测试集预测结果(已反归一化)    """

    model_obj = modelss(fit_or_not, 
True
, epochs, batch, learning_rate,

                        vp_train, vp_val, vp_test, vt_train, vt_val, vt_test,

                        m_out, n_out, n_in, or_dim, task_tag=task_tag)


    xunlian_predicted_data = []

    ceshi_predicted_data = []


    
# ======================== 基础 RNN / LSTM / GRU ========================

    
if
 flag == 
'CrossAttention_LSTM'
:

        hidden_size, nhead, dro = 
128
, 
4
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_CrossAttention_LSTM(hidden_size, nhead, dro)

    
elif
 flag == 
'MultiHead_LSTM'
:

        hidden_size, nhead, dro = 
128
, 
4
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_MultiHead_LSTM(hidden_size, nhead, dro)

    
elif
 flag == 
'CBAM_CNN_BiLSTM'
:

        filters, kernel_size, hidden_size, dro = 
64
, 
3
, 
128
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_CBAM_CNN_BiLSTM(filters, kernel_size, hidden_size, dro)


    
# ======================== 组合模型 ========================

    
elif
 flag == 
'CNN_Transformer'
:

        filters, kernel_size, d_model, nhead, num_layers, dro = 
64
, 
3
, 
64
, 
4
, 
2
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_CNN_Transformer(filters, kernel_size, d_model, nhead, num_layers, dro)

    
elif
 flag == 
'LSTM_Transformer'
:

        hidden_size, d_model, nhead, num_layers, dro = 
64
, 
64
, 
4
, 
2
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_LSTM_Transformer(hidden_size, d_model, nhead, num_layers, dro)

    
elif
 flag == 
'TCN_Transformer'
:

        nb_filters, kernel_size, d_model, nhead, num_layers, dro = 
64
, 
2
, 
64
, 
4
, 
2
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_TCN_Transformer(nb_filters, kernel_size, d_model, nhead, num_layers, dro)

    
elif
 flag == 
'TCN_BiLSTM_Attention'
:

        nb_filters, kernel_size, hidden_size, dro = 
64
, 
2
, 
64
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_TCN_BiLSTM_Attention(nb_filters, kernel_size, hidden_size, dro)

    
elif
 flag == 
'BiTCN_Transformer'
:

        nb_filters, kernel_size, d_model, nhead, num_layers, dro = 
64
, 
2
, 
64
, 
4
, 
2
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_BiTCN_Transformer(nb_filters, kernel_size, d_model, nhead, num_layers, dro)

    
elif
 flag == 
'CNN_GRU_KAN'
:

        filters, kernel_size, gru_hidden, dro = 
64
, 
3
, 
64
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_CNN_GRU_KAN(filters, kernel_size, gru_hidden, dro)

    
elif
 flag == 
'Transformer_GRU'
:

        d_model, nhead, num_layers, gru_hidden, dro = 
64
, 
4
, 
2
, 
64
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_Transformer_GRU(d_model, nhead, num_layers, gru_hidden, dro)

    
elif
 flag == 
'TCN_Attention_GRU'
:

        nb_filters, kernel_size, d_model, nhead, gru_hidden, dro = 
64
, 
2
, 
64
, 
4
, 
64
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_TCN_Attention_GRU(nb_filters, kernel_size, d_model, nhead, gru_hidden, dro)

    
elif
 flag == 
'CNN_SE_BiLSTM'
:

        filters, kernel_size, hidden_size, dro = 
64
, 
3
, 
128
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_CNN_SE_BiLSTM(filters, kernel_size, hidden_size, dro)

    
elif
 flag == 
'ECA_CNN_Transformer'
:

        filters, kernel_size, d_model, nhead, num_layers, dro = 
64
, 
3
, 
64
, 
4
, 
2
, 
0.2

        xunlian_predicted_data, ceshi_predicted_data = model_obj.run_ECA_CNN_Transformer(filters, kernel_size, d_model, nhead, num_layers, dro)

..........

3. 防数据泄漏的数据划分

数据按时间顺序划分为训练集、验证集、测试集,相邻段之间插入间隔(gap = 输入窗口 + 预测步长 - 1),确保任何一段构造出的样本与其他段在原始数据上完全不重叠。归一化器(MinMaxScaler)仅在训练集上fit,验证集和测试集只做transform。

4. 验证集 + 早停机制

深度学习模型在训练过程中使用独立验证集监控,配合早停(Early Stopping)防止过拟合,训练结束后自动恢复到验证集上表现最好的模型权重。

5. 概率区间预测

除了点预测,还支持概率区间预测,给出预测的置信区间:

  • 含Dropout的深度学习模型:自动使用MC Dropout方法

  • 不含Dropout的模型及传统机器学习:自动使用残差Bootstrap方法

无需修改模型结构,训练完成后自动计算,支持自定义置信度(90%、95%、99%等)。

# ===第五步:概率区间预测(可选)===

use_interval = 
1
         
# 1=开启概率区间预测, 0=仅进行点预测

confidence_level = 
0.90
  
# 置信度水平: 0.90(90%), 0.95(95%), 0.99(99%)

mc_samples = 
100
         
# MC Dropout 采样次数(越大越稳定,建议 50~200)

# 区间预测方法说明:

# - 含 Dropout 层的深度学习模型:自动使用 MC Dropout 方法

# - 不含 Dropout 层的深度学习模型及传统机器学习模型:自动使用残差 Bootstrap 方法

# - 两种方法均无需修改模型结构,训练完成后自动计算

6. SCI级别绘图输出

自动生成三类图表,直接可用于论文:

  • 预测对比图:真实值 vs 预测值,带误差填充区域和指标标注

  • 散点图:预测值与真实值的相关性,含拟合线和R²

  • 残差分析图:残差柱状图 + 误差分布直方图(含正态拟合曲线)

  • 区间预测图(开启概率预测时):预测值 + 置信区间带

所有图表同时保存PNG(300dpi)和PDF(600dpi)矢量格式。

预测图片展示环节:

总之,任何一个模型都可以支持四种任务(单特征输入 + 单步预测、单特征输入 + 多步预测、多特征输入 + 单步预测、多特征输入 + 多步预测)并相应的分析图。

6. 完整评估指标

自动计算并打印:MSE、RMSE、MAE、MAPE、R²,区间预测还额外输出PICP、PINAW等指标。


项目结构

├── MAIN.py    # 主入口文件,在这里配置数据、选模型、调参数
├── model.py                       # 模型管理类,100个模型的训练/预测逻辑
├── Shared_def.py                  # 数据划分、评估指标、绘图函数
├── Handwritten_network/           # 模型实现
│   ├── new_models.py              # 49个新增PyTorch模型架构
│   ├── pytorch_models.py          # 基础PyTorch模型(RNN/CNN/TCN等)
│   ├── Transformer.py             # Transformer实现
│   ├── ekan.py                    # KAN系列模型
│   ├── defothermodels.py          # TensorFlow模型训练入口
│   └── tfts/                      # TensorFlow时序模型库
├── 电力负荷预测数据1.csv           # 示例数据
├── 电力负荷预测数据2.csv           # 示例数据
├── 电价预测.csv           # 示例数据
├── 风电场功率预测.csv           # 示例数据
├── 孟加拉国天气时间序列数据.csv           # 示例数据
├── Save_models/                   # 训练好的模型自动保存在这里
└── 预测结果保存/                   # 预测结果和图表自动保存在这里

项目代码简单易懂,非常适合新手体质!


怎么用?

第一步:准备你的数据(CSV或Excel),确保目标列(负荷、功率、风速、温度、电价等 这些就是目标列)放在最后一列。

第二步:打开 MAIN.py,修改数据读取路径和任务配置(n_in、n_out、valuess)。

第三步:修改 flag 为你想用的模型名称。

第四步:运行。

全自动流程:训练日志 → 评估指标表格 → 预测图/散点图/残差图 → 全部自动保存

想换个模型对比?把 flag 改一下,再运行一次就行。


环境依赖

  • Python 3.9+

  • PyTorch(绝大多数模型)

  • TensorFlow(仅Seq2Seq/WaveNet/BERT/Informer需要)

  • scikit-learn、XGBoost(传统机器学习模型)

  • LightGBM、CatBoost(可选,按需安装)

  • NumPy、Pandas、Matplotlib、PrettyTable


写在最后

这个框架的核心价值在于统一和便捷——100种模型在同一套规范下运行,数据处理方式一致,评估标准一致,输出格式一致。无论你是想快速验证某个模型在你的数据上的效果,还是想批量跑多个模型做横向对比,改一个变量名就够了。

如果你正在做时序预测相关的研究或项目,希望这个工具能帮你省下大量重复造轮子的时间。

代码获取