本期项目是什么?

本期推文一句话概括:做了一个集成了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(取哪些列作为输入特征)。代码里给出了四种案例的完整配置示例,直接照搬就行。

======================== 第二步:配置任务类型 ========================
    根据预测需求,设置以下三个核心参数:n_in、n_out、valuess

    ---- 案例1:单特征输入 + 单步预测 ----
      用前12个时刻的负荷值,预测下1个时刻的负荷值
      n_in = 12
      n_out = 1
      valuess = dataset.values[:, -1:]     # 仅取最后一列(目标列)

    ---- 案例2:单特征输入 + 多步预测 ----
      用前48个时刻的负荷值,预测未来12个时刻的负荷值
      n_in = 48
      n_out = 12
      valuess = dataset.values[:, -1:]     # 仅取最后一列(目标列

    ---- 案例3:多特征输入 + 单步预测 ----
      用前8个时刻的全部特征,预测下1个时刻的负荷值
      n_in = 8
      n_out = 1
      valuess = dataset.values[:, 1:]      # 去除第1列(

    ---- 案例4:多特征输入 + 多步预测 ----
      用前7天(168小时)的全部特征,预测未来1天(24小时)的负荷值
      n_in = 24 * 7    # = 168
      n_out = 24 * 1   # = 24
      valuess = dataset.values[:, 1:]      # 去除第1列(时间列),取剩余所有特

    注意:目标列(待预测变量)必须放在 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. 绘图输出

代码收录了几种常见类型的数据:

├── 电力负荷预测数据1.csv           # 示例数据
├── 电力负荷预测数据2.csv
├── 电价预测.csv           # 示例数据
├── 风电场功率预测.csv           # 示例数据
├── 孟加拉国天气时间序列数据.csv           # 示例数据

自动生成四类图表:

  • 预测对比图:真实值 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种模型在同一套规范下运行,数据处理方式一致,评估标准一致,输出格式一致。无论你是想快速验证某个模型在你的数据上的效果,还是想批量跑多个模型做横向对比,改一个变量名就够了。

代码获取

https://mbd.pub/o/bread/YZWcmJZxZw==

或者点击阅读原文跳转。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐