尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

多变量时序预测对比实验:AGDO优化CNN-LSTM模型完整指南

多变量时序预测对比实验:AGDO优化CNN-LSTM模型完整指南 多变量时序预测最怕的不是模型选错而是对比实验做得不严谨。基于2025年Nature子刊相关研究热度AGDO算法优化的CNN-LSTM模型成了一个典型的改进方向用群体智能优化算法去搜索CNN-LSTM的超参数和特征组合再和普通CNN-LSTM、TCN、Transformer放在同一套数据上对比。这个思路的吸引力在于它不需要把网络结构推倒重来只靠优化器层面的参数搜索就可能让原有模型在MAE、RMSE、MAPE上再降一截。但这套对比实验能不能成立关键在数据划分、输入格式、统一评价指标和多次重复实验任何一个环节偷懒结果都不太可信。这篇文章会按真实实验顺序拆开讲从数据预处理和滑窗样本构造开始到四个模型的网络设计到AGDO如何介入训练再到多步预测扩展、结果解读、常见报错和选型建议。适合正在做时序预测实验、准备写论文或技术总结的读者。1. 先搞清楚AGDO优化CNN-LSTM到底解决什么问题时序预测模型的常见配置是CNN-LSTMCNN负责提取局部特征LSTM负责捕捉时间依赖。这个结构本身并不新颖很多场景下效果也稳定。但它的痛点在于超参数太多并且非常敏感。卷积核数量、卷积核大小、LSTM隐藏层大小、LSTM层数、学习率、批大小、Dropout比例这些参数相互影响靠手动试错效率很低靠网格搜索又容易组合爆炸。AGDO算法的定位就是替代手工调参和网格搜索。它的全称可以理解为基于动态对立学习的优化算法英文缩写AGDO。核心思想是把一组超参数看成种群里的一个个体通过迭代评估每个个体在验证集上的表现结合对立学习更新搜索方向最终返回一组较优配置。整个过程中CNN-LSTM的网络结构没有被替换被替换的是“怎么找到更合适的参数组合”这件事。所以AGDO-CNN-LSTM中的AGDO不是LSTM、注意力机制那种网络结构模块它更像是训练策略层面的外挂优化器。这个定位很重要因为很多初学者会误以为AGDO是某种新的时序单元甚至试图在PyTorch里找到对应的层。实际上你要写的是一个搜索算法算法的评估对象是CNN-LSTM模型。这个方案适合谁适合那些已经有CNN-LSTM基线想在不做大改结构的前提下进一步提升预测精度的人。也适合特征数量较多、环境变化较快、人工调参效率太低的场景。比如电力负荷预测、交通流量预测、股票因子预测、设备传感器数据预测这类任务往往存在多个外部变量特征重要程度不一超参数对结果影响很大。不过要提前说清楚一个边界AGDO搜索耗时并不低。每评估一组超参数就要完整训练一次CNN-LSTM假设搜索20轮、每轮10个个体就是200次完整训练。如果训练数据很大、网络又深时间成本可能会是几小时甚至更久。实验设计时要把这个成本算进去。2. 数据准备与输入格式设计多变量时序预测的起点无论用什么模型多变量时序预测的第一步都是把原始数据整理成模型能吃的形状。这一步做不好后面模型再强也没有意义。2.1 原始数据长什么样多变量时序预测的输入常见形式是一个二维表时间变量A变量B变量C变量D目标值2025-01-01 00:0012.545.20.31120.72025-01-01 01:0012.144.80.41118.9..................2025-01-31 23:0014.347.10.50156.3变量A、B、C是外部特征变量D可能是日类型标记目标值是我们要预测的量。实际项目中这些列会更多有些是连续数值有些是分类特征有些是时间特征。2.2 数据清洗和特征工程拿到数据后先做这几件事。缺失值处理时序数据最常见的缺失问题是某几个时刻没有记录。常见做法有线性插值和前向填充。我个人更推荐先用线性插值如果缺失段很短或者用前一天同一时刻的值填充效果也还可以。总之不要直接丢行时序数据的连续性是模型学习的重点。时间特征提取把时间列拆成年、月、日、小时、星期几、是否节假日等特征。这些特征对负荷预测、流量预测、销售预测都很重要。比如电力负荷预测里工作日和周末的负荷模式差异很大销售预测里节假日前后的波动往往是最难学的部分。异常值处理先画图看看有没有明显的异常点。如果某个时刻的值突然变成0或者几百倍于正常值需要结合业务判断是真实事件还是记录错误。不要直接用全局分位数截断因为局部波动大的场景全局截断会误伤正常数据。归一化多变量预测必须做。不同变量的量纲差异很大比如温度是0到40负荷是几百到几千如果不做归一化模型会把数值大的变量当作重要变量训练也不稳定。常用方式是MinMaxScaler或者StandardScaler。两类都行但要注意归一化参数必须只用训练集拟合验证集和测试集用同一套参数转换。2.3 滑窗构建样本多变量时序预测不是把整个序列直接丢给模型而是用滑动窗口构造样本。假设每次用过去24小时的数据预测未来1小时输入窗口长度为24步长为1这样一条样本就是X过去24个时刻的所有特征形状(24, 特征数)y未来第1个时刻的目标值形状(1,)代码可以这样写import numpy as np def create_samples(data, target_col, input_steps, output_steps): X, y [], [] for i in range(len(data) - input_steps - output_steps 1): X.append(data.iloc[i : i input_steps].values) y.append(data.iloc[i input_steps : i input_steps output_steps][target_col].values) return np.array(X), np.array(y) # 假设 data 是归一化后的 DataFrametarget_col 是目标列名 input_steps 24 output_steps 1 X, y create_samples(data, target_col, input_steps, output_steps) # 输出 X 的形状(样本数, 24, 特征数) print(X.shape, y.shape)这里有两个容易出错的点。第一构造样本时要保持时间顺序不能随机采样否则未来信息会泄漏到训练集中。第二训练集、验证集、测试集的划分必须按时间顺序切不能用KFold随机划分。比如前70%做训练、中间15%做验证、最后15%做测试这是时间序列预测的基本纪律。2.4 训练集、验证集、测试集怎么切多变量时序预测的一个通用原则测试集必须在时间上位于训练集之后。如果你把第1天到第10天的数据和第11天到第20天的数据混合随机划分模型会“偷看”未来测试指标会虚高真实业务场景中根本不存在这种条件。推荐的切分方式训练集时间序列前 70% 验证集时间序列中间 15% 测试集时间序列最后 15%也有人用滚动预测的方式做验证每训练一段就能预测下一段再滚动往前。这种方式更接近真实应用但训练成本高适合做最终效果验证不适合反复调参。3. 四模型对比实验设计CNN-LSTM、TCN、Transformer、AGDO-CNN-LSTM这一节是最核心的部分。做对比实验不是把四个模型各跑一遍、比一组MAE和RMSE就完了。要确保对比公平需要在数据、特征、评价指标、训练配置上保持统一。3.1 对比实验的公平性控制四模型对比时有几条硬性约束必须遵守。同一份数据四个模型必须使用同样的训练集、验证集、测试集不能各自用自己的滑窗策略或归一化方式。同样的滑窗长度如果CNN-LSTM用24步预测未来1步TCN、Transformer也必须用同样的输入输出结构。否则对比的是输入信息量而不是模型能力。同样的评价指标训练阶段可以用不同损失函数但最终对比必须统一使用MAE、RMSE、MAPE或R²。同样的训练轮数和早停策略比如每个模型最多训练100轮验证集指标连续10轮不下降就早停。不能给某个模型300轮其他模型只跑50轮。# 一个简单的早停回调示例适用于 PyTorch / TensorFlow / Keras from tensorflow.keras.callbacks import EarlyStopping early_stop EarlyStopping( monitorval_loss, patience10, restore_best_weightsTrue ) history model.fit( X_train, y_train, validation_data(X_val, y_val), epochs100, batch_size64, callbacks[early_stop], verbose1 )为什么patience设为10因为这四个模型的验证损失曲线并不是严格的单调下降。如果patience太小比如3可能刚好在局部波动时就停了模型欠拟合如果patience太大比如50训练时间翻倍还容易过拟合。10是一个比较常规的起点实际可以根据验证集变化幅度调整。3.2 评价指标怎么选四模型对比不能只看某一项指标。常见评价指标有四个指标公式含义特点适用场景MAE平均绝对误差对异常值不敏感业务关注绝对偏差时首选RMSE均方根误差对大误差惩罚更重希望避免大偏差时关注MAPE平均绝对百分比误差百分比形式跨量级可比业务汇报时常用但目标值接近0时会失真R²决定系数衡量模型解释了多少方差回归任务通用实际写论文或做技术总结时一般表格里列出MAE、RMSE、MAPE有需要再补R²。单看一组数值还不够最好画出每个模型在测试集上的预测曲线与真实值曲线这样可以直观看到哪里跟得住、哪里滞后、哪里波动过大。3.3 四个模型的网络结构下面给出四个模型的基本搭建思路代码片段以PyTorch为例方便对照。基础CNN-LSTMimport torch import torch.nn as nn class CNNLSTM(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(CNNLSTM, self).__init__() self.conv1 nn.Conv1d(in_channelsinput_size, out_channels64, kernel_size3, padding1) self.relu nn.ReLU() self.lstm nn.LSTM(input_size64, hidden_sizehidden_size, num_layersnum_layers, batch_firstTrue) self.fc nn.Linear(hidden_size, output_size) def forward(self, x): # x shape: (batch, seq_len, input_size) x x.permute(0, 2, 1) # 转为 (batch, input_size, seq_len) x self.conv1(x) x self.relu(x) x x.permute(0, 2, 1) # 转回 (batch, seq_len, 64) out, _ self.lstm(x) out out[:, -1, :] # 取最后一个时间步 out self.fc(out) return out注意这里的permute。Conv1d默认在最后一维做卷积但时间序列数据通常是(batch, seq_len, features)所以要先转成(batch, features, seq_len)卷积完再转回来输入LSTM。这是新手最容易写错的地方报错信息经常是维度不匹配。TCN结构TCN不使用递归单元核心是膨胀因果卷积。它的好处是感受野可控、并行度好训练速度通常比LSTM快。如果选用带残差块的TCN结构会深一些但稳定性更好。# TCN 残差块的核心思路 class TCNBlock(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, dilation): super(TCNBlock, self).__init__() self.conv1 nn.Conv1d(in_channels, out_channels, kernel_size, padding(kernel_size - 1) * dilation, dilationdilation) self.conv2 nn.Conv1d(out_channels, out_channels, kernel_size, padding(kernel_size - 1) * dilation, dilationdilation) self.relu nn.ReLU() def forward(self, x): residual x out self.relu(self.conv1(x)) out self.relu(self.conv2(out)) return out residualTCN的优势是能够用较深的层数覆盖很长的历史窗口不需要像LSTM那样一步一步循环。缺点也很明显对超参数层数、核大小、膨胀系数更敏感网络结构一旦设计不合理拟合能力会不如LSTM。Transformer结构时序Transformer最常用的是编码器部分。输入先做线性映射再加上位置编码然后进入多头自注意力层和前馈层。class TimeSeriesTransformer(nn.Module): def __init__(self, input_size, d_model, nhead, num_layers, output_size): super(TimeSeriesTransformer, self).__init__() self.input_proj nn.Linear(input_size, d_model) self.positional_encoding nn.Parameter(torch.randn(1, 1000, d_model)) encoder_layer nn.TransformerEncoderLayer(d_modeld_model, nheadnhead, batch_firstTrue) self.encoder nn.TransformerEncoder(encoder_layer, num_layersnum_layers) self.fc nn.Linear(d_model, output_size) def forward(self, x): # x shape: (batch, seq_len, input_size) seq_len x.size(1) x self.input_proj(x) self.positional_encoding[:, :seq_len, :] x self.encoder(x) x x[:, -1, :] x self.fc(x) return xTransformer的优势在长序列下比较明显但要注意这里的positional_encoding如果直接设为可学习参数需要保证输入序列长度不超过预设长度。所以在定义时预分配了1000的长度实际序列比它长时要另行调整。AGDO-CNN-LSTMAGDO-CNN-LSTM并不是再新增一个独立的网络模块而是在CNN-LSTM训练过程中用AGDO算法搜索一组更优的配置。比如搜索范围可以包括卷积核数量32、64、128卷积核大小3、5、7LSTM隐藏层节点数32、64、128LSTM层数1、2学习率0.001、0.0005、0.0001批大小32、64、128是否选择某个特征组参与训练AGDO会把每一组超参数看成优化问题里的一个个体通过代数迭代评估每组配置的验证集误差最终返回一组较优配置。实际跑起来时不需要手动逐个试超参算法会引导搜索方向。# 伪代码AGDO 搜索配置 def agdo_search(space, evaluate_fn, max_iter): population init_population(space) for i in range(max_iter): fitness [evaluate_fn(ind) for ind in population] new_population update_by_dynamic_opposite(population, fitness) population selection(new_population, fitness) return best_config(population)这个伪代码展示了AGDO的核心流程初始化种群、评估适应度、基于动态对立学习更新、选择下一代。实际项目里会加上边界约束和早停避免无效搜索浪费算力。3.4 训练配置示例统一训练配置参考如下配置项取值优化器Adam损失函数MSE最大训练轮数100早停patience10初始学习率0.001批大小64滑窗长度24预测步长1训练集比例70%验证集比例15%测试集比例15%为什么统一用MSE做损失函数因为RMSE对应的就是MSE的平方根回归任务里MSE是默认选择。如果业务上对大偏差更敏感可以在后期的损失函数里加入权重机制但对比阶段不要动。4. AGDO算法在CNN-LSTM中的关键作用与参数交互AGDO这个算法很多人第一次听到会觉得陌生。它的基础思想并不复杂在种群迭代过程中不仅保留当前最优解还通过计算对立解让搜索范围更广从而提升找到更优超参数组合的概率。4.1 为什么CNN-LSTM需要外部优化器CNN-LSTM在训练时超参数的敏感度其实很高。比如LSTM隐藏层大小从32改成128验证集RMSE可能下降明显也可能过拟合。卷积核大小从3改成7局部特征提取范围变大但信息可能被过度平滑。学习率从0.001改成0.0001训练更稳但收敛速度变慢。特征选择上如果强行加入噪声特征测试集误差可能被拉高。这些参数交织在一起靠手动调参效率很低。传统做法是网格搜索或随机搜索但网格搜索在参数多时数量爆炸随机搜索运气成分大。AGDO这类群智能优化算法的价值在于把参数搜索看作连续迭代过程在有限算力下争取找到更优组合。4.2 AGDO与CNN-LSTM结合的基本流程整个流程可以分成四步初始化参数确定搜索边界比如LSTM隐藏层大小在16到128之间。种群评估对每一组参数构建一个CNN-LSTM用训练集训练用验证集计算适应度。动态对立学习更新结合当前种群最优位置和对立位置生成新的候选参数。迭代收敛重复评估和更新直到达到最大迭代次数或误差不再改进。这里最耗时的环节是第2步。每评估一组参数就要完整训练一次CNN-LSTM。如果训练集很大、网络很深一次评估可能就要几分钟。假设AGDO迭代20轮每轮10个个体就是200次完整训练。这个成本在实验设计时一定要提前算清楚。4.3 AGDO参数搜索空间参考参数搜索范围说明卷积核数量32 / 64 / 128值越大特征提取能力越强但参数量增加卷积核大小3 / 5 / 7值越大感受野越大LSTM隐藏层大小32 / 64 / 128值越大时序记忆能力越强LSTM层数1 / 22层非线性更强但训练更慢学习率0.001 / 0.0005 / 0.0001影响收敛速度与稳定性批大小32 / 64 / 128影响梯度稳定性和显存占用Dropout0.0 / 0.2 / 0.5防止过拟合数据量少时尤其重要注意AGDO搜索得到的是“在你的数据、训练配置、搜索边界下较优的一组配置”不是“所有场景下的最优配置”。换一个数据集搜索结果很可能要重新跑。4.4 AGDO与TCN、Transformer对比时的定位差异在四模型对比中AGDO只应用在CNN-LSTM上TCN和Transformer用一组人工设定的合理默认参数。这种设计本质上是“有优化的CNN-LSTM vs 常规配置的TCN vs 常规配置的Transformer”。这会带来两个问题。第一如果AGDO结果更好一部分原因可能是参数被优化了而不是CNN-LSTM结构比TCN或Transformer更优。为了尽量公平可以把TCN和Transformer的关键超参数也做一轮随机搜索或网格搜索取各自最优结果比较。不过训练成本会成倍上涨。第二如果只比较默认参数AGDO-CNN-LSTM的优势会被夸大。论文或技术总结里最好说明AGDO是作为超参数优化器介入与模型结构改进不是同一层面。把定位说清楚结果才经得起推敲。5. 从单步预测扩展到多步预测直接法、递归法和多输出法前面讨论的都是输入过去24步、预测未来1步。但很多业务场景需要预测未来6小时、24小时甚至更长时间。多步预测有几种常见实现方式各有优缺点。5.1 直接法直接法就是为每个预测步长单独训练一个模型。预测未来3步就训练3个模型模型1输入过去24步输出未来第1步模型2输入过去24步输出未来第2步模型3输入过去24步输出未来第3步优点是实现简单各个步长之间互不影响误差不会累积。缺点是训练成本翻倍而且没有利用步长之间的相关性。5.2 递归法递归法先用模型预测未来第1步再把预测值作为输入的一部分预测第2步循环往复。优点是只需要训练一个模型缺点是误差会累积步长越大偏差越明显。如果模型对第1步的预测有系统性偏差这个偏差会在后续递归中被放大。5.3 多输出法多输出法直接让模型输出一个向量例如未来24小时的所有预测值。实现上就是把最后一层的输出维度从1改成24。优点是训练一个模型就能得到完整预测序列也保留了步长之间的相关性。缺点是当输出步长很大时模型拟合压力增加可能出现后期预测被“平均化”的问题也就是预测曲线越往后越平。5.4 三种方式怎么选方式优点缺点适合场景直接法无误差累积实现简单训练成本高步长间独立预测步长较短比如1到3步递归法只训练一个模型误差累积对中长期精度要求不高的场景多输出法一次性输出全部步长长步长可能欠拟合预测步长固定且不太长实际项目中我通常先用多输出法跑一版因为它实现简单、训练快。后续如果发现长步长预测曲线太平坦再切到直接法或混合策略。AGDO在逐步长扩展时可以搜索输出维度、是否用序列到序列结构、是否引入注意力机制等配置。6. 实验结果解读不要让指标好看就急着下结论跑完四模型对比后拿到MAE、RMSE、MAPE这些数字很容易陷入“哪个模型数字最小哪个模型就最好”的思维。真实项目里不能这样下结论。6.1 看指标也要看曲线一组数字只能反映整体误差水平无法告诉你模型在哪些时段失效。测试集上的预测曲线和真实值曲线要并排画出来重点看三个位置高峰时段预测值是否低估或滞后。负荷预测里晚高峰经常是误差最大的时段。突变时段温度骤变、节假日切换等节点模型是否跟得上。平稳时段平稳段预测是否抖动过大还是被过度平滑。如果整体指标不错但高峰时段明显滞后说明模型对极端模式的捕捉能力不足可能需要增加特征、调整滑窗长度或者在损失函数里加入峰值惩罚项。6.2 看误差分布不要只看平均指标MAE小不代表所有样本误差都小。可以做一张误差分布直方图看看误差是否集中在某个区间还是存在明显的长尾。如果有少量样本误差特别大可能对应异常输入、数据质量或模型对某些模式学习不足。6.3 判断是否真的提升要有多次实验支撑神经网络的训练有随机性。同样的数据、同样的参数模型初始化不同跑出来的结果也会不同。不要拿一次训练的结果就说AGDO-CNN-LSTM比TCN好。常规做法是每个模型重复跑3到5次取平均值和标准差。如果AGDO-CNN-LSTM的平均RMSE低于其他模型但标准差很大那结论也不够稳。# 多次实验取均值示例 import numpy as np results { cnn_lstm: [0.082, 0.085, 0.079], tcn: [0.088, 0.091, 0.086], transformer: [0.105, 0.099, 0.112], agdo_cnn_lstm: [0.071, 0.068, 0.073], } for name, scores in results.items(): print(f{name}: mean{np.mean(scores):.4f}, std{np.std(scores):.4f})这种重复实验的稳定性说明结论更接近模型本身的差异而不是某一次随机种子带来的运气。6.4 注意过拟合和泛化能力训练集指标很好测试集指标很差是典型过拟合。过拟合的常见原因有三个数据量太少、模型参数过多、正则化不足。在数据量有限时AGDO搜索到的大网络参数不一定是好选择。判断标准很简单训练集MAE远低于验证集和测试集验证集损失曲线下降后开始反弹测试集误差对随机种子敏感换个种子结果波动大出现这些情况优先减少网络参数量、增加Dropout、缩小训练轮数而不是继续扩大搜索范围。7. 常见报错与排查顺序从数据到模型层层定位四模型对比实验最容易出现的问题按出现频率从高到低排一下。7.1 维度不匹配报错信息通常类似Expected 3D input, got 2D这种情况绝大多数是滑窗样本构造不对或者进入LSTM前少了时间步维度。先打印X_train.shape和y_train.shape确认是否能对得上模型定义里的输入要求。7.2 归一化泄漏训练时用包含测试集统计量的归一化器导致测试集信息间接进入训练。这是隐蔽错误不报错但会让指标虚高。排查方法是检查归一化器的fit过程是否只作用在训练集上。7.3 数据划分随机化使用train_test_split默认随机划分导致时序泄露。排查方法是绘制训练集和测试集的时间覆盖范围确认测试集在时间上完全位于训练集之后。7.4 AGDO搜索太慢每组参数都要完整训练一次CNN-LSTM搜索200次可能耗时数小时。排查方法先缩小搜索空间减少候选值。降低最大训练轮数比如从100改成30。使用小批量数据预搜索比如只取训练集前20%做快速评估。确认CPU核数和GPU显存是否够用AGDO评估过程是否可以并行。7.5 Transformer显存溢出输入序列长度较长时Transformer的注意力矩阵是序列长度平方级别。比如序列长度1000注意力矩阵就是1000×1000。解决方式减小滑窗长度。缩小batch size。使用梯度累积。考虑换用线性注意力或稀疏注意力但会增加实现成本。7.6 输出结果全是均值预测曲线几乎是一条直线或者波动很小。这种现象常见于数据量不足、模型容量不足或损失函数对峰值不敏感。排查顺序先看训练集拟合情况如果训练集也是平的说明模型容量不够如果训练集拟合很好但测试集是平的说明泛化能力不足需要加正则或换模型。7.7 不同模型间指标不可比有时候CNN-LSTM的输入长度是24Transformer的输入长度是48最后比较RMSE就没意义。所有模型必须用相同的数据、输入长度、输出长度、评价指标。对比前先列一张实验配置表避免隐性不一致。8. 完整实验流程与项目文件组织建议一个完整的四模型对比项目如果从零开始建议按以下阶段推进。每个阶段有明确的验收标准不要赶时间跳过。8.1 阶段一数据理解与预处理任务清单查看数据表的列名、行数、时间范围检查缺失值和重复值画出每个变量随时间的变化曲线确定目标列和外部特征列检查是否存在未来数据比如用当天的温度预报值预测当天的负荷可以但用当天实际温度值预测当天负荷在测试阶段要注意合理性验收标准能准确说出每列特征的含义、缺失情况、数值范围、时间跨度以及哪些特征可能对目标有直接影响。8.2 阶段二基线模型跑通先不要上AGDO不要上复杂的Transformer。先用最简单的CNN-LSTM或线性回归跑通全流程。目的是验证数据加载、样本构造、模型训练、指标计算链路没有bug。验收标准能输出训练集、验证集、测试集的MAE/RMSE能画出预测曲线。8.3 阶段三跑三个常规模型在基线跑通之后分别实现CNN-LSTM、TCN、Transformer三个模型。每个模型先用手动设定的默认参数保证收敛。记录训练时间、参数量、验证集指标。验收标准三个模型都能稳定训练指标在同一套评价函数下可比。8.4 阶段四接入AGDO把AGDO作为超参数搜索工具评估对象是CNN-LSTM。搜索结束后用最优参数重新初始化模型在完整训练集上训练在测试集上评估。验收标准能输出AGDO每次迭代的适应度变化曲线以及搜索到的最优参数组合。8.5 阶段五结果汇总与可视化最后把四组结果放进同一张表格画出真实值和预测值的对比曲线、误差分布图、AGDO收敛曲线。import matplotlib.pyplot as plt plt.figure(figsize(12, 5)) plt.plot(y_test, labelTrue, alpha0.7) plt.plot(pred_agdo, labelAGDO-CNN-LSTM, alpha0.7) plt.plot(pred_tcn, labelTCN, alpha0.5) plt.plot(pred_transformer, labelTransformer, alpha0.5) plt.legend() plt.title(Test Set Prediction Comparison) plt.show()图表要有标题、坐标轴标签、图例方便后续写技术总结时直接复用。8.6 项目文件组织建议把实验拆成多个目录不要四个模型的逻辑全都堆在一个文件里project/ ├── data/ │ ├── raw/ # 原始数据 │ ├── processed/ # 清洗和滑窗后的数据 │ └── scalers/ # 保存的归一化器 ├── models/ │ ├── cnn_lstm.py │ ├── tcn.py │ ├── transformer.py │ └── agdo_search.py ├── experiments/ │ ├── config.yaml # 统一配置 │ ├── train_baseline.py │ ├── train_agdo.py │ └── evaluate_all.py ├── results/ │ ├── metrics.csv │ ├── figures/ │ └── logs/ └── README.md这种组织方式的好处有三个模型结构改动不会影响训练脚本实验配置独立于代码调整参数不用改代码日志和结果分开存放方便回溯哪一组结果对应哪组配置。9. 实际业务落地中的边界与坑点不要照搬实验配置AGDO-CNN-LSTM在论文或实验中表现不错但落到实际业务系统里要额外考虑几个问题。9.1 训练成本和推理成本不一样AGDO搜索阶段非常耗时因为要反复训练模型。但搜索完成后真正部署的是单个CNN-LSTM模型推理速度取决于网络规模和输入长度。如果模型为了追求精度把LSTM隐藏层调到128、卷积核数量调到128推理速度可能会变
返回列表