本期项目是什么?
一句话概括:一个集成了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种模型在同一套规范下运行,数据处理方式一致,评估标准一致,输出格式一致。无论你是想快速验证某个模型在你的数据上的效果,还是想批量跑多个模型做横向对比,改一个变量名就够了。
如果你正在做时序预测相关的研究或项目,希望这个工具能帮你省下大量重复造轮子的时间。
代码获取