正在加载中...

展开本页目录
算法教程BiLSTM-双向 LSTM

BiLSTM-双向 LSTM

No.148 · 在线教程

BiLSTM-双向 LSTM 模块是一个基于 TensorFlow/Keras 的时序建模组件,支持回归与分类两类任务。系统先对输入特征进行编码、缺失值删除与可选缩放,再通过滑动窗口构造时序样本,随后训练多层双向 LSTM 网络,并在测试集上输出预测结果与评价指标。

BiLSTM-双向 LSTM

1. 方法概述

BiLSTM-双向 LSTM 模块是一个基于 TensorFlow/Keras 的时序建模组件,支持回归分类两类任务。系统先对输入特征进行编码、缺失值删除与可选缩放,再通过滑动窗口构造时序样本,随后训练多层双向 LSTM 网络,并在测试集上输出预测结果与评价指标。

需要特别说明的是,该模块不单独选择时间列,而是默认用户传入的数据行已经按时间顺序排列。因此,时序关系由“样本行顺序 + 滑动窗口”共同定义。

设预先按时间顺序整理后的样本为

$$ \mathcal{D}=\{(x_t,y_t)\}_{t=1}^{N},\quad x_t\in\mathbb{R}^{d},\ y_t\in\mathcal{Y} \tag{1} $$

其中 \(x_t\) 表示第 \(t\) 个时点的特征向量,\(y_t\) 表示目标变量;当任务为回归时,\(\mathcal{Y}\subseteq \mathbb{R}\),当任务为分类时,\(\mathcal{Y}\) 为有限类别集合。

2. 数据预处理与序列构造

2.1 特征编码与缺失值处理

若启用 standardminmax 缩放方式,程序会先对非数值特征做 One-Hot 编码。对类别变量 \(x_{tj}\) 的第 \(k\) 个类别,编码后的分量可写为

$$ x_{tj}^{(k)}= \begin{cases} 1,& x_{tj}=\mathrm{cat}_k\\ 0,& \text{otherwise} \end{cases} \tag{2} $$

编码完成后,系统将特征矩阵与目标列拼接,并删除任一字段缺失的样本行。若 scale_method=none,则仅保留数值型特征,非数值特征会被直接丢弃。

2.2 特征缩放与目标缩放

scale_method=standard 时,特征标准化为

$$ x_{tj}^{*}=\frac{x_{tj}-\mu_j}{\sigma_j} \tag{3} $$

scale_method=minmax 时,特征按区间缩放为

$$ x_{tj}^{*}=\frac{x_{tj}-\min(x_j)}{\max(x_j)-\min(x_j)} \tag{4} $$

在回归任务中,若勾选 scale_target=True,则目标列还会做标准化处理:

$$ y_t^{*}=\frac{y_t-\mu_y}{\sigma_y} \tag{5} $$

在最终评价阶段,系统会将预测值与测试目标值逆变换回原始量纲后,再计算 RMSE、MAE 与 \(R^2\)。

2.3 滑动窗口序列样本

设窗口长度为 \(L\),预测步长为 \(H\)。对任意可用起点 \(i\),输入序列张量定义为

$$ \mathbf{X}_i= \begin{bmatrix} x_i^{*}\\ x_{i+1}^{*}\\ \vdots\\ x_{i+L-1}^{*} \end{bmatrix} \in\mathbb{R}^{L\times d'} \tag{6} $$

其中 \(d'\) 为编码和缩放后的特征维度。对应的监督目标取为

$$ z_i=y_{i+L+H-1} \tag{7} $$

因此,可构造的有效序列样本总数为

$$ M=N'-L-H+1 \tag{8} $$

其中 \(N'\) 表示删除缺失值后的样本量。程序要求 \(M\ge 10\),否则会认为有效序列样本过少而终止训练。

2.4 按时间顺序划分训练集与测试集

系统不打乱序列样本,而是使用前段样本训练、后段样本测试。若测试比例为 \(\rho\in(0,1)\),则

$$ M_{\text{train}}=\left\lfloor (1-\rho)M \right\rfloor,\qquad M_{\text{test}}=M-M_{\text{train}} \tag{9} $$

该划分方式保持了时序因果顺序。当前实现中,测试集同时被作为 validation_data 传入训练过程,用于可选的早停监控。

3. BiLSTM 网络结构

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{10} $$

其中 \(i_t,f_t,o_t\) 分别为输入门、遗忘门与输出门,\(c_t\) 为记忆单元状态,\(h_t\) 为隐藏状态。

3.2 双向传播

BiLSTM 同时在正向与反向上编码序列。其反向递推可表示为

$$ \overleftarrow{h}_t=\mathrm{LSTM}_b(x_t,\overleftarrow{h}_{t+1}) \tag{11} $$

正向与反向隐藏状态拼接后,得到双向表示:

$$ h_t^{\mathrm{bi}}= \begin{bmatrix} \overrightarrow{h}_t\\ \overleftarrow{h}_t \end{bmatrix} \tag{12} $$

3.3 多层堆叠与 Dropout

若网络包含 \(K\) 层双向 LSTM,则第 \(\ell\) 层输出可抽象表示为

$$ H^{(\ell)}=\mathrm{Dropout}\!\left(\mathrm{BiLSTM}^{(\ell)}\!\left(H^{(\ell-1)}\right)\right),\qquad \ell=1,2,\ldots,K \tag{13} $$

其中 \(H^{(0)}=\mathbf{X}_i\)。在代码实现中,前 \(K-1\) 层设置 return_sequences=True,最后一层输出最终序列表示 \(r_i\),即

$$ r_i=H_{L}^{(K)} \tag{14} $$

该表示随后送入输出层完成回归或分类。

4. 输出层与训练目标

4.1 回归模式

当任务为回归时,输出层为线性层:

$$ \hat z_i=w^\top r_i+b \tag{15} $$

模型训练损失采用均方误差:

$$ \mathcal{L}_{\mathrm{reg}}=\frac{1}{M_{\text{train}}}\sum_{i=1}^{M_{\text{train}}}(z_i-\hat z_i)^2 \tag{16} $$

4.2 二分类模式

若训练集类别数不超过 2,则输出层使用 Sigmoid 激活:

$$ p_i=\sigma(w^\top r_i+b) \tag{17} $$

对应的二元交叉熵损失为

$$ \mathcal{L}_{\mathrm{bin}}=-\frac{1}{M_{\text{train}}}\sum_{i=1}^{M_{\text{train}}}\left[z_i\ln p_i+(1-z_i)\ln(1-p_i)\right] \tag{18} $$

4.3 多分类模式

若训练集类别数大于 2,则输出层采用 Softmax:

$$ P(y_i=c\mid \mathbf{X}_i)=\frac{\exp(w_c^\top r_i+b_c)}{\sum_{k=1}^{C}\exp(w_k^\top r_i+b_k)} \tag{19} $$

对应的稀疏交叉熵损失为

$$ \mathcal{L}_{\mathrm{multi}}=-\frac{1}{M_{\text{train}}}\sum_{i=1}^{M_{\text{train}}}\ln P(y_i=z_i\mid \mathbf{X}_i) \tag{20} $$

当前实现统一使用 Adam 优化器,学习率由 learning_rate 指定。

5. 评价指标与输出结果解释

5.1 回归指标

回归任务输出 rmsemaer2。其定义分别为

$$ \mathrm{RMSE}=\sqrt{\frac{1}{M_{\text{test}}}\sum_{i=1}^{M_{\text{test}}}(y_i-\hat y_i)^2} \tag{21} $$

$$ \mathrm{MAE}=\frac{1}{M_{\text{test}}}\sum_{i=1}^{M_{\text{test}}}|y_i-\hat y_i| \tag{22} $$

$$ R^2=1-\frac{\sum_{i=1}^{M_{\text{test}}}(y_i-\hat y_i)^2}{\sum_{i=1}^{M_{\text{test}}}(y_i-\bar y)^2} \tag{23} $$

5.2 分类指标

分类任务输出 accuracyf1_macrof1_weighted。准确率定义为

$$ \mathrm{Accuracy}=\frac{1}{M_{\text{test}}}\sum_{i=1}^{M_{\text{test}}}\mathbf{1}(\hat y_i=y_i) \tag{24} $$

对第 \(c\) 类,其 F1 值为

$$ F1_c=\frac{2P_cR_c}{P_c+R_c} \tag{25} $$

其中 \(P_c\) 与 \(R_c\) 分别表示该类的精确率和召回率。宏平均 F1 与加权 F1 分别为

$$ F1_{\mathrm{macro}}=\frac{1}{C}\sum_{c=1}^{C}F1_c \tag{26} $$

$$ F1_{\mathrm{weighted}}=\sum_{c=1}^{C}\frac{n_c}{\sum_{k=1}^{C}n_k}F1_c \tag{27} $$

其中 \(n_c\) 表示测试集中第 \(c\) 类样本数。

5.3 输出结果说明

程序会导出以下结果对象:

  • 原始数据:原始输入表;
  • 处理后数据:编码、缩放并删除缺失后的特征与目标;
  • 模型指标:回归或分类评价指标;
  • 训练历史:训练集与验证集损失变化;
  • 预测结果:测试样本索引、真实值与预测值;
  • 混淆矩阵:仅分类任务输出;
  • 类别映射:分类任务且存在标签编码映射时输出;
  • 参数:模型与训练参数;
  • 图表索引:导出图表路径。

对应图表包括:

  • loss_curve:训练损失与验证损失曲线;
  • pred_vs_true:回归任务真实值与预测值对比;
  • residual_hist:回归残差直方图;
  • confusion_matrix:分类混淆矩阵热力图。

6. 算法流程

按照当前项目实现,BiLSTM-双向 LSTM 模块的计算流程如下:

  1. 读取 Excel/CSV 数据,并由用户选择目标列与特征列;
  2. 根据缩放方式执行 One-Hot 编码或仅保留数值特征;
  3. 删除含缺失值的样本行,并按用户给定顺序保留样本;
  4. 对特征执行 standardminmaxnone 缩放;回归任务可对目标做标准化;
  5. 根据 window_sizehorizon 构造监督序列样本;
  6. 按时间顺序切分训练集和测试集;
  7. 构建多层 BiLSTM 网络,并在每层后附加 Dropout;
  8. 使用 Adam 优化器训练模型,并可基于验证损失执行早停;
  9. 在测试集上输出预测结果、评价指标、训练历史、图表与 Excel 文件。

7. 关键参数说明

表 1 关键参数及含义

参数 含义 当前实现
task 任务类型 classificationregression
feature_cols 输入特征列 至少选择 1 列,且不能包含目标列
target_column 目标列 必选
window_size 序列窗口长度 \(L\) 界面范围 2 至 200,默认 12
horizon 预测步长 \(H\) 界面范围 1 至 50,默认 1
units 每层 LSTM 隐藏单元数 界面范围 8 至 512,默认 64
num_layers 双向 LSTM 层数 界面范围 1 至 4,默认 1
dropout Dropout 比例 界面范围 0.0 至 0.8,默认 0.1
learning_rate Adam 学习率 界面范围 0.0001 至 0.1,默认 0.001
epochs 训练轮数 界面范围 5 至 500,默认 50
batch_size 批大小 界面范围 4 至 1024,默认 32
test_size 测试集比例 界面范围 0.1 至 0.5,默认 0.2
random_state 随机种子 界面范围 0 至 9999,默认 42
scale_method 特征缩放方式 standardminmaxnone
scale_target 是否缩放回归目标 仅回归任务有效,默认启用
shuffle_train 训练时是否打乱样本 默认 False
early_stopping 是否启用早停 默认 True
patience 早停容忍轮数 默认 10

8. 论文写作模板

8.1 方法描述模板

可在论文“方法部分”中写为:

“本文采用 BiLSTM 模型对时序样本进行建模。首先,对原始特征进行编码、缺失值清洗与缩放处理;其次,以长度为 \(L\) 的滑动窗口构造输入序列,并将第 \(H\) 个未来时点的目标值作为监督信号;随后,构建由 \(K\) 层双向 LSTM 组成的网络,在每层后加入 Dropout 以降低过拟合风险,并采用 Adam 优化器最小化回归或分类损失函数;最后,在测试集上输出预测结果,并使用回归任务中的 RMSE、MAE、\(R^2\) 或分类任务中的 Accuracy、Macro-F1、Weighted-F1 对模型性能进行评价。该方法能够同时捕捉序列的前向与后向依赖信息,适用于具有明显顺序结构的数据建模任务。”

8.2 结果解释模板

结果部分可写为:BiLSTM 在测试集上的预测结果表明,双向时序依赖建模有助于提升序列表示能力。若回归任务中的 \(R^2\) 较高或分类任务中的 F1 指标较优,可说明模型对时序模式具有较强拟合能力;若训练与测试表现差异较大,则应讨论过拟合风险。

8.3 表格标题模板

表题可写为:BiLSTM 模型预测结果与性能指标汇总表。

8.4 图表题注模板

图注可写为:BiLSTM 模型真实值与预测值对比曲线或分类结果混淆矩阵。

8.5 表格示例

建议列名:时间点、真实值、预测值、残差、RMSE、MAE、\(R^2\) 或 Accuracy、Macro-F1、Weighted-F1。

9. 实现说明与注意事项

  • 该模块适用于行顺序已经按时间排列好的序列数据;若原始数据未按时间排序,应在导入前先完成排序。
  • 当前实现既支持回归也支持分类,因此论文写作时需要根据实际任务选择相应的输出层、损失函数与评价指标,不能混写。
  • scale_method=none 时,程序只保留数值型特征,非数值特征会被直接丢弃;若需要保留类别变量,应使用 standardminmax 以触发 One-Hot 编码。
  • 回归任务若启用 scale_target,模型训练基于标准化后的目标值进行,但评价指标会在逆变换回原始量纲后计算。
  • 当前实现将测试集同时作为 validation_data 参与早停监控,这对工程使用是可行的,但若用于严格论文实验,建议在外部另行划分独立验证集与最终测试集。
  • 该模块输出的 预测结果 表使用原始样本行索引标记测试目标位置,而不是单独的时间列;若论文中需要时间轴图示,应在原始数据中保留对应时间字段并自行对齐。
  • 真实实现主链路位于 core/bilstm_calculator.pyui/results_widget.py。前者负责窗口构造、模型训练、指标汇总、图表生成和 Excel 导出;后者负责结果页 tab 展示、图表目录读取以及 repro_*.py 自动导出。
  • 实际 results/ 目录下会生成结果文件夹,结果页会同时写出 repro_<safe_app>_<timestamp>.pyrepro_inputs/<safe_app>_results_<timestamp>_repro.xlsx。这意味着论文附录中的复现实验可以直接引用相对路径输入,而不是依赖上传时的原始绝对路径。
  • 当前实现实际导出的工作表包括 原始数据处理后数据模型指标训练历史预测结果混淆矩阵类别映射参数图表索引。其中 类别映射 只在字符串标签分类任务下出现,写论文时不应把它当成所有实验都固定存在的表。
  • 图表文件在结果目录中固定按 loss_curve.pngpred_vs_true.pngresidual_hist.png 命名,图表索引 工作表保存的是这些图的 path。若论文图片来自程序导出结果,建议直接核对该表和磁盘文件而不是手工重命名后再引用。
  • 若要逐项对应程序界面,可直接查看 ui/results_widget.py 的结果页 tab:概要、指标、预测结果、训练历史、图表。这也是论文中组织“结果展示顺序”的一个合理参照。

10. 论文写作建议

论文中建议把该模型写成“BiLSTM 时序建模网络”,并明确是否是回归还是分类任务。结果部分通常可组织为:参数表、测试集指标表、预测对比图和训练损失曲线。若启用了双向结构,正文应强调其能同时利用窗口内前向和后向依赖,而不是简单写成普通 LSTM。

11. 单篇终审补充

11.1 图题与表题对齐建议

  • 原始数据 表可写为:表X BiLSTM 原始输入数据。
  • 处理后数据 表可写为:表X BiLSTM 编码与缩放后的特征数据。
  • 模型指标 表可写为:表X BiLSTM 测试集性能指标汇总。
  • 训练历史 表可写为:表X BiLSTM 训练过程损失历史。
  • 预测结果 表可写为:表X BiLSTM 测试集预测结果明细。
  • 混淆矩阵 表可写为:表X BiLSTM 分类混淆矩阵。
  • 类别映射 表可写为:表X BiLSTM 类别编码映射关系。
  • 参数 表可写为:表X BiLSTM 参数设置与训练配置。
  • 图表索引 表可写为:表X BiLSTM 图表索引与文件路径。
  • loss_curve.png 建议写为:图X BiLSTM 训练损失曲线。
  • pred_vs_true.png 建议写为:图X BiLSTM 真实值与预测值对比图。
  • residual_hist.png 建议写为:图X BiLSTM 残差分布图。

11.2 终审说明

  • 当前导出结构同时覆盖回归和分类两类任务,但 混淆矩阵类别映射 并非所有实验都必然存在,正文不能把它们写成固定输出。
  • 结果页与 Excel 主要围绕测试集结果展开,并没有单独导出训练集预测或验证集预测,因此正文不要把该模块写成“三套预测表齐全”的实验结构。
  • 训练历史 才是适合支撑训练过程描述的主表;模型指标 是最终性能摘要,两者在论文中应分别承担“过程”和“结果”的角色。
  • 当前实现把测试集同时作为早停监控数据。若论文要强调严格泛化评估,应单独说明这是工程实现口径,而不是标准学术数据切分。

11.3 全量强化补充

本次全量强化不再把 pytest_test_bilstm_ui_flow_offscreen0_bilstm_ui_flow 中堆积的大量历史 repro 文件当作单一主结果,而是明确将其识别为“UI 回归目录 + 多轮复现实物池”。在这个目录内,可直接核验的主工作簿为 bilstm_ui_flow.xlsx,实际工作表为 原始数据处理后数据模型指标训练历史预测结果混淆矩阵参数图表索引

当前绑定的真实目录为 具体的算法3/深度学习与时序网络/BiLSTM-双向 LSTM/results/pytest_test_bilstm_ui_flow_offscreen0_bilstm_ui_flow。因此这篇文档的主证据不是算法根目录下某个单独手工结果文件,而是这个 UI 回归导出目录中的 bilstm_ui_flow.xlsx 与同层 repro_* 再生产物集合。

该目录下同时存在大量 BiLSTM-双向_LSTM_results_*_repro.xlsxrepro_BiLSTM-双向_LSTM_*.py 以及对应 *_repro_plots/ 图目录,说明它是一次次结果页导出后累积下来的复现产物集合,而不是单次静态实验目录。本篇文档应把 bilstm_ui_flow.xlsx 视为主 UI 流程工作簿,把这些 *_repro.xlsx*_repro_plots/ 视为复现再生产物。

当前复现脚本口径为 INPUT_FILE = 'repro_inputs/window1_rnn_input.csv',并显式写入 epochs = 5random_state = 123target_column = 'y'。因此这篇文档当前绑定的是“相对路径 repro_inputs + UI 导出复现”链路,而不是 benchmark 问题链路;正文若说明工程可复现性,应明确引用这一口径。

12. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/深度学习与时序网络/BiLSTM-双向 LSTM/results/pytest_test_bilstm_ui_flow_offscreen0_bilstm_ui_flow
  • 正文应围绕 原始数据处理后数据模型指标训练历史预测结果混淆矩阵参数图表索引 来写。
  • 图证应对应 loss_curve.pngpred_vs_true.pngresidual_hist.png,并把主 UI 工作簿和大量 repro 再生产物区分开。
  • 复现脚本应按 repro_BiLSTM-双向_LSTM_*.py + repro_inputs/window1_rnn_input.csv 的口径说明。