LSTM-长短期记忆网络
LSTM-长短期记忆网络 模块在当前项目中的真实实现,是一个基于 TensorFlow/Keras 的通用时序建模组件,支持回归与分类两类任务。系统先对输入特征做编码、缺失值检查与缩放,再通过滑动窗口构造 sequence-to-one 序列样本,随后训练单向 LSTM 网络;…
LSTM-长短期记忆网络
1. 方法概述
LSTM-长短期记忆网络 模块在当前项目中的真实实现,是一个基于 TensorFlow/Keras 的通用时序建模组件,支持回归与分类两类任务。系统先对输入特征做编码、缺失值检查与缩放,再通过滑动窗口构造 sequence-to-one 序列样本,随后训练单向 LSTM 网络;在此基础上,还支持可选的 MultiHeadAttention 头和学习率分段衰减策略。
设按时间顺序排列的样本为
$$ \mathcal{D}=\{(x_t,y_t)\}_{t=1}^{N},\qquad x_t\in\mathbb{R}^{d},\ y_t\in\mathcal{Y} \tag{1} $$
其中 \(x_t\) 为第 \(t\) 个时间步的特征向量,\(y_t\) 为目标变量。该模块默认数据行顺序已经代表时间顺序,并不会单独读取时间列。
2. 数据预处理与序列构造
2.1 特征编码与目标处理
若 scale_method 为 standard 或 minmax,程序会先对特征做 pd.get_dummies() 编码;对任一类别变量 \(x_{tj}\) 的第 \(k\) 个类别,可写为
$$ x_{tj}^{(k)}= \begin{cases} 1,& x_{tj}=\mathrm{cat}_k\\ 0,& \text{otherwise} \end{cases} \tag{2} $$
若 scale_method=none,则程序只保留数值型特征,非数值特征会被直接丢弃。之后系统把特征与目标列拼接,并删除任一字段缺失的样本行。
分类任务中,若目标列不是数值型,会用 LabelEncoder 编码为整数标签:
$$ \phi:\mathcal{Y}\to \{0,1,\ldots,C-1\} \tag{3} $$
其中 \(C\) 为类别数。回归任务中,目标列必须能直接转换为数值,否则代码会报错。
2.2 全量样本缩放
特征缩放发生在构造序列之前,并且当前实现是用全量样本先拟合缩放器,再做训练/验证/测试切分。若采用标准化,则
$$ x_{tj}^{\ast}=\frac{x_{tj}-\mu_j}{\sigma_j} \tag{4} $$
若采用 Min-Max 缩放,则
$$ x_{tj}^{\ast}=\frac{x_{tj}-x_j^{\min}}{x_j^{\max}-x_j^{\min}} \tag{5} $$
回归任务若勾选 scale_target=True,目标列还会做缩放:
$$ y_t^{\ast}=\frac{y_t-\mu_y}{\sigma_y} \tag{6} $$
需要注意,代码中 scale_target 始终使用 StandardScaler,即使特征缩放方式选择了 minmax。因此该模块的目标缩放与特征缩放并不完全对称,而且也存在“先看全量样本再切分”的信息泄漏特征。
2.3 滑动窗口序列样本
设窗口长度为 \(L\),预测步长为 \(H\)。对任意起点 \(i\),输入序列定义为
$$ \mathbf{X}_i= \begin{bmatrix} x_i^{\ast}\\ x_{i+1}^{\ast}\\ \vdots\\ x_{i+L-1}^{\ast} \end{bmatrix} \in\mathbb{R}^{L\times d'} \tag{7} $$
其中 \(d'\) 为编码与筛选后的特征维度。对应监督目标为
$$ z_i=y_{i+L+H-1} \tag{8} $$
可构造的序列样本数为
$$ M=N'-L-H+1 \tag{9} $$
其中 \(N'\) 为删除缺失值后的有效样本量。代码要求 \(M\ge 10\),否则会认为有效序列样本过少。
2.4 时间顺序切分训练集、验证集与测试集
若测试比例为 \(r_{\mathrm{te}}\),则系统先按时间顺序切分出测试集:
$$ M_{\mathrm{train\_full}}=\left\lfloor M(1-r_{\mathrm{te}})\right\rfloor,\qquad M_{\mathrm{test}}=M-M_{\mathrm{train\_full}} \tag{10} $$
若 val_size>0,程序再从训练尾部切出验证集。设验证比例为 \(r_{\mathrm{va}}\),则
$$ M_{\mathrm{train}}=\left\lfloor M_{\mathrm{train\_full}}(1-r_{\mathrm{va}})\right\rfloor,\qquad M_{\mathrm{val}}=M_{\mathrm{train\_full}}-M_{\mathrm{train}} \tag{11} $$
因此,val_size 是相对训练集部分再切一刀,而不是相对全体样本的比例。
3. LSTM 网络结构
3.1 单个 LSTM 单元
对序列中的第 \(t\) 个时间步,LSTM 的门控更新可写为
$$ \begin{aligned} i_t&=\sigma(W_i x_t+U_i h_{t-1}+b_i)\\ f_t&=\sigma(W_f x_t+U_f h_{t-1}+b_f)\\ \tilde c_t&=\tanh(W_c x_t+U_c h_{t-1}+b_c)\\ o_t&=\sigma(W_o x_t+U_o h_{t-1}+b_o)\\ c_t&=f_t\odot c_{t-1}+i_t\odot \tilde c_t\\ h_t&=o_t\odot \tanh(c_t) \end{aligned} \tag{12} $$
其中 \(i_t,f_t,o_t\) 分别表示输入门、遗忘门和输出门。
3.2 无注意力分支
当 use_attention=False 时,程序会堆叠 num_layers 层 LSTM。前 \(K-1\) 层设置 return_sequences=True,最后一层只输出最终隐藏表示。第 \(\ell\) 层可抽象表示为
$$ H^{(\ell)}=\mathrm{Dropout}\!\left(\mathrm{LSTM}^{(\ell)}\!\left(H^{(\ell-1)}\right)\right),\qquad \ell=1,2,\ldots,K \tag{13} $$
其中 \(H^{(0)}=\mathbf{X}_i\)。若任务为回归,则输出层为
$$ \hat z_i=w^\top h_i+b \tag{14} $$
若任务为分类:
$$ \hat p_i= \begin{cases} \sigma(w^\top h_i+b),& C\le 2\\ \mathrm{softmax}(W h_i+b),& C>2 \end{cases} \tag{15} $$
这意味着二分类和多分类在输出层结构上是两套不同实现。
3.3 注意力增强分支
当 use_attention=True 时,所有 LSTM 层都强制 return_sequences=True,随后把序列输出 \(H\in\mathbb{R}^{L\times u}\) 送入 MultiHeadAttention:
$$ A=\mathrm{MHA}(H,H,H) \tag{16} $$
然后分别取注意力上下文的全局平均池化表示与最后一个时间步隐藏状态:
$$ g=\mathrm{GAP}(A),\qquad \ell=H_L \tag{17} $$
两路表征经过全连接变换后相加融合:
$$ r=\mathrm{ReLU}(W_g g+b_g)+\mathrm{ReLU}(W_{\ell}\ell+b_{\ell}) \tag{18} $$
再经过可选 Dropout 和任务对应的输出层完成预测。因而该模块并不是“纯 LSTM”,而是一个可选 LSTM + 多头注意力混合结构。
4. 训练目标与优化策略
4.1 回归损失
回归任务采用均方误差损失:
$$ \mathcal{L}_{\mathrm{reg}}=\frac{1}{M_{\mathrm{train}}}\sum_{i=1}^{M_{\mathrm{train}}}(z_i-\hat z_i)^2 \tag{19} $$
4.2 分类损失
二分类任务采用二元交叉熵:
$$ \mathcal{L}_{\mathrm{bin}}=-\frac{1}{M_{\mathrm{train}}}\sum_{i=1}^{M_{\mathrm{train}}}\left[z_i\ln \hat p_i+(1-z_i)\ln(1-\hat p_i)\right] \tag{20} $$
多分类任务采用稀疏交叉熵:
$$ \mathcal{L}_{\mathrm{multi}}=-\frac{1}{M_{\mathrm{train}}}\sum_{i=1}^{M_{\mathrm{train}}}\ln P(y_i=z_i\mid \mathbf{X}_i) \tag{21} $$
4.3 学习率衰减与早停
若启用 use_lr_schedule=True,代码使用分段式学习率衰减:
$$ \eta_e=\eta_0\cdot \gamma^{\left\lfloor e/P\right\rfloor} \tag{22} $$
其中 \(\eta_0\) 为初始学习率,\(\gamma\) 为 lr_drop_factor,\(P\) 为 lr_drop_period。若启用早停,则监控量为
$$ \text{monitor}= \begin{cases} \mathrm{val\_loss},& \text{存在验证集}\\ \mathrm{loss},& \text{无验证集} \end{cases} \tag{23} $$
并在连续 patience 轮未改进时停止训练,且恢复最佳权重。
5. 评价指标与输出结果解释
5.1 回归指标
回归任务输出 rmse、mae 和 r2:
$$ \mathrm{RMSE}=\sqrt{\frac{1}{M_{\mathrm{test}}}\sum_{i=1}^{M_{\mathrm{test}}}(y_i-\hat y_i)^2} \tag{24} $$
$$ \mathrm{MAE}=\frac{1}{M_{\mathrm{test}}}\sum_{i=1}^{M_{\mathrm{test}}}|y_i-\hat y_i| \tag{25} $$
$$ R^2=1-\frac{\sum_{i=1}^{M_{\mathrm{test}}}(y_i-\hat y_i)^2}{\sum_{i=1}^{M_{\mathrm{test}}}(y_i-\bar y)^2} \tag{26} $$
5.2 分类指标
分类任务输出 accuracy、f1_macro 与 f1_weighted。准确率定义为
$$ \mathrm{Accuracy}=\frac{1}{M_{\mathrm{test}}}\sum_{i=1}^{M_{\mathrm{test}}}\mathbf{1}(\hat y_i=y_i) \tag{27} $$
宏平均 F1 与加权 F1 分别为
$$ F1_{\mathrm{macro}}=\frac{1}{C}\sum_{c=1}^{C}F1_c \tag{28} $$
$$ F1_{\mathrm{weighted}}=\sum_{c=1}^{C}\frac{n_c}{\sum_{k=1}^{C}n_k}F1_c \tag{29} $$
5.3 输出结果说明
当前模块导出的 Excel 工作表包括:
原始数据:原始输入表;处理后数据:缩放后的特征矩阵与原始目标列;模型指标:train/validation/test多数据集指标表;训练历史:逐 epoch 的损失记录;预测结果:测试集预测;训练集预测:训练集预测;验证集预测:验证集预测,只有在val_size>0时存在;混淆矩阵:仅分类任务有效;类别映射:分类任务且实际使用LabelEncoder时输出;参数:模型与训练参数;图表索引:图表路径。
图表方面,回归任务会尝试生成:
loss_curve.png:训练损失曲线;pred_vs_true.png:测试集真实值与预测值对比;pred_comparison.png:训练/验证/测试三段预测对比;residual_hist.png:残差直方图;rmse_comparison.png:训练/验证/测试 RMSE 对比图。
分类任务则主要生成:
loss_curve.png:训练损失曲线;confusion_matrix.png:混淆矩阵热力图。
6. 算法流程
按照当前项目实现,LSTM-长短期记忆网络 的计算流程如下:
- 读取 Excel/CSV 数据,并由用户选择任务类型、目标列与特征列;
- 按缩放方式决定是保留纯数值特征,还是先做 One-Hot 编码;
- 删除目标列或特征列中含缺失值的样本行,并检查常数列、类别数等合法性;
- 在全量样本上拟合特征缩放器;回归任务可同步标准化目标列;
- 依据
window_size和horizon构造 sequence-to-one 滑动窗口; - 按时间顺序切分测试集,再从训练尾部切出验证集;
- 构建普通 LSTM 或 LSTM+多头注意力模型;
- 使用 Adam 优化器训练,并可选早停与学习率分段衰减;
- 计算训练/验证/测试指标,导出预测结果、图表、Excel 和复现脚本。
7. 关键参数说明
表 1 关键参数及含义
| 参数 | 含义 | 当前默认值 |
|---|---|---|
task |
任务类型 | regression |
target_column |
目标列 | 用户指定 |
feature_cols |
特征列列表 | 用户勾选 |
window_size |
窗口长度 \(L\) | 12 |
horizon |
预测步长 \(H\) | 1 |
units |
LSTM 隐藏单元数 | 64 |
num_layers |
LSTM 层数 | 1 |
use_attention |
是否启用注意力增强 | False |
attention_heads |
注意力头数 | 2 |
attention_key_dim |
注意力 key 维度 | 16 |
attention_dropout |
注意力 dropout | 0.0 |
dropout |
LSTM/融合层 dropout | 0.1 |
learning_rate |
学习率 | 0.001 |
use_lr_schedule |
是否启用学习率衰减 | False |
lr_drop_factor |
学习率衰减因子 | 0.9 |
lr_drop_period |
学习率衰减周期 | 10 |
epochs |
训练轮数 | 50 |
batch_size |
批大小 | 32 |
test_size |
测试集比例 | 0.2 |
val_size |
验证集比例(相对训练集) | 0.2 |
random_state |
随机种子 | 42 |
scale_method |
特征缩放方式 | standard |
scale_target |
是否标准化回归目标 | True |
shuffle_train |
训练时是否打乱样本 | False |
early_stopping |
是否启用早停 | True |
patience |
早停容忍轮数 | 10 |
8. 论文写作模板
8.1 方法描述模板
可在论文“方法部分”中写为:
“本文采用基于长短期记忆网络(LSTM)的时序建模方法对目标变量进行预测。首先,对原始样本进行特征编码、缺失值清洗与缩放处理,并按照滑动窗口方式构造长度为 \(L\) 的输入序列以及步长为 \(H\) 的监督目标;其次,构建由单层或多层 LSTM 组成的序列模型,在需要时进一步引入多头注意力机制以增强对关键时间步信息的聚合能力;随后,针对回归任务采用均方误差损失,针对分类任务采用二元或多类交叉熵损失,并通过 Adam 优化器完成参数学习;最后,在测试集上使用 RMSE、MAE、\(R^2\) 或 Accuracy、Macro-F1、Weighted-F1 等指标评价模型性能。”
8.2 结果解释模板
结果部分可写为:LSTM 能够较好捕捉时间序列中的长期依赖关系,若加入注意力机制后指标进一步改善,则说明关键时间步信息对预测结果具有额外贡献。正文中可结合误差曲线讨论模型对峰值与转折点的拟合能力。
8.3 表格标题模板
表题可写为:LSTM 时序模型预测结果与性能指标汇总表。
8.4 图表题注模板
图注可写为:LSTM 模型真实值与预测值对比曲线。
8.5 表格示例
建议列名:时间点、真实值、预测值、残差、RMSE、MAE、\(R^2\) 或分类评价指标。
9. 实现说明与注意事项
- 该模块适用于行顺序已经代表时间顺序的数据;若原始数据未按时间排列,需要先在外部排序。
- 与
BiLSTM模块不同,这里是单向 LSTM;若启用use_attention,则模型实际上变成了“LSTM + MultiHeadAttention”的混合结构,论文中不应简单写成纯 LSTM。 - 特征和目标的缩放都发生在全量样本上再切分训练/验证/测试,因此存在一定信息泄漏;严格论文实验若要更规范,建议改成只用训练集统计量拟合缩放器。
scale_target=True时,目标列始终使用标准化而不是 Min-Max 缩放,这一点与scale_method=minmax并不一致。- 当前模块没有
torch/sklearn后备训练路径,训练依赖tensorflow;环境缺失时会直接报错。 - 分类任务若目标列本身是数值型标签,则不会再走
LabelEncoder;若是字符串标签,结果导出中会额外给出类别映射。 处理后数据工作表保存的是经过编码/缩放后的逐行特征表,不是最终送入 LSTM 的三维序列张量;论文复现实验时不能把它误当成序列样本表。- 真实实现主链路位于
core/lstm_calculator.py与ui/results_widget.py。前者负责训练、预测、分类/回归指标、图表生成和 xlsx 导出;后者负责结果页 tab、图表显示、repro_*.py自动导出和repro_inputs/复制。 - 实际
results/目录下会生成按时间戳区分的结果文件夹,并包含repro_<safe_app>_<timestamp>.py、repro_inputs/和<safe_app>_results_<timestamp>_repro.xlsx。如果论文要给出可复现实验附件,这一套目录结构可以直接沿用。 - 当前实现实际导出的工作表包括
原始数据、处理后数据、模型指标、训练历史、预测结果、训练集预测、验证集预测、混淆矩阵、类别映射、参数、图表索引。其中训练集预测与验证集预测是这个模块区别于简化时序模型文档的关键表,不应遗漏。 - 图表输出实际包括
loss_curve.png、pred_vs_true.png、residual_hist.png、rmse_comparison.png,这些文件会被汇总进图表索引。因此论文中的图题、附录图表清单和程序结果目录可以做到一一对应。 - 若要从界面流程映射到论文章节,可以直接参考
ui/results_widget.py中的结果页 tab:概要、指标、训练集预测、测试集预测、验证集预测、训练历史、图表。它比单纯罗列公式更接近用户真实看到的结果组织方式。
10. 论文写作建议
论文中建议将该模块写成“单向 LSTM 序列建模方法”,并在方法部分注明是否启用了注意力增强。结果部分建议至少包括:参数设置表、测试集指标表、预测结果图和训练损失曲线。若开启 use_attention,正文不宜再把模型简化描述成“纯 LSTM”。
11. 单篇终审补充
11.1 图题与表题对齐建议
原始数据表可写为:表X LSTM 原始输入数据。处理后数据表可写为:表X LSTM 编码与缩放后的特征数据。模型指标表可写为:表X LSTM 测试集性能指标汇总。训练历史表可写为:表X LSTM 训练过程损失历史。预测结果表可写为:表X LSTM 测试集预测结果明细。训练集预测表可写为:表X LSTM 训练集预测结果。验证集预测表可写为:表X LSTM 验证集预测结果。混淆矩阵表可写为:表X LSTM 分类混淆矩阵。类别映射表可写为:表X LSTM 类别编码映射关系。参数表可写为:表X LSTM 参数设置与训练配置。图表索引表可写为:表X LSTM 图表索引与文件路径。loss_curve.png建议写为:图X LSTM 训练损失曲线。pred_vs_true.png建议写为:图X LSTM 真实值与预测值对比图。residual_hist.png建议写为:图X LSTM 残差分布图。rmse_comparison.png建议写为:图X LSTM 不同数据划分 RMSE 对比图。
11.2 终审说明
- 与 BiLSTM 不同,这个模块真实导出了
训练集预测和验证集预测,因此论文可以写训练/验证/测试三套预测结果对比,但前提是实验确实完成了这两部分导出。 - 若启用了
use_attention,模型实质是 LSTM 加注意力增强结构,正文不应再把它简写成“标准单向 LSTM”。 处理后数据不是三维序列张量,而是逐行处理后的表格;论文复现实验时应把它理解为建模前的数据底表,而不是网络直接输入张量。- 当前训练严格依赖 TensorFlow,不存在 sklearn 后备分支;因此若环境缺失 TensorFlow,实验应视为未运行,而不是“换后端但同算法”。
11.3 全量强化补充
本次全量强化对 具体的算法3/深度学习与时序网络/LSTM-长短期记忆网络/results/pytest_test_lstm_ui_flow_offscreen0_lstm_ui_flow 做了真实核查。该目录中的主 UI 工作簿为 lstm_ui_flow.xlsx,实际工作表为 原始数据、处理后数据、模型指标、训练历史、预测结果、训练集预测、验证集预测、混淆矩阵、参数、图表索引。
与 BiLSTM 类似,这个目录内还累积了大量 LSTM-长短期记忆网络_results_*_repro.xlsx 与 repro_LSTM-长短期记忆网络_*.py,说明它是“主 UI 工作簿 + 多轮导出 repro 结果池”的结构,而不是单次静态结果目录。因此正文若引用主实验,应固定引用 lstm_ui_flow.xlsx;若要引用复现实验,则需单独说明对应时间戳的 *_repro.xlsx 和 *_repro_plots/。
当前复现脚本口径为 INPUT_FILE = 'repro_inputs/window1_rnn_input.csv',并显式写入 epochs = 5、random_state = 123、target_column = 'y'。因此这篇文档绑定的是“相对路径输入副本 + UI 导出复现”链路,而不是 benchmark 链路;论文中若写可复现性,应把 repro_inputs/window1_rnn_input.csv 作为输入证据一并说明。
12. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/深度学习与时序网络/LSTM-长短期记忆网络/results/pytest_test_lstm_ui_flow_offscreen0_lstm_ui_flow。 - 正文应围绕
原始数据、处理后数据、模型指标、训练历史、预测结果、训练集预测、验证集预测、混淆矩阵、参数、图表索引来写。 - 图证应对应
loss_curve.png、pred_vs_true.png、residual_hist.png、rmse_comparison.png,并把训练/验证/测试三套导出和复现池区分开。 - 复现脚本应按
repro_LSTM-长短期记忆网络_*.py + repro_inputs/window1_rnn_input.csv的口径说明。