痛快!一个切换搞定100种时间序列预测算法
本期项目是什么?
本期推文一句话概括:做了一个集成了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==
或者点击阅读原文跳转。
更多推荐




所有评论(0)