尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MathorCup数模竞赛实战:时间序列预测中ARIMA与LSTM的融合策略

MathorCup数模竞赛实战:时间序列预测中ARIMA与LSTM的融合策略 1. 从赛题到方案一次完整的数模竞赛实战复盘又到了一年一度的MathorCup数模竞赛季看着今年新出的题目不禁让我回想起去年带队参加C题的经历。当时我们团队在拿到题目后从最初的茫然到最终的豁然开朗整个过程充满了挑战与收获。今天我就以去年C题为例抛开那些官方的、模板化的解题报告从一个一线参赛者和指导者的角度和大家聊聊我们是如何一步步拆解问题、构建模型、编写代码并最终形成一份有竞争力的技术文档的。这篇文章不是简单的代码堆砌而是想分享我们在实战中踩过的坑、做过的关键决策以及那些在标准答案里不会写的“野路子”。无论你是今年正在备赛的选手还是对数模竞赛感兴趣的新手希望这篇复盘能给你带来一些不一样的思路。MathorCup的C题通常偏向数据分析、预测或优化类对编程和建模能力要求较高。我们当时遇到的题目核心是围绕一个具有明显时间序列特征的数据集要求进行未来趋势预测和关键因素分析。这直接指向了时间序列分析这个经典领域。在工具选择上Python以其丰富的数据科学生态Pandas, NumPy, Scikit-learn和强大的深度学习库TensorFlow/PyTorch成为不二之选。而模型层面传统的统计模型如ARIMA和现代的深度学习模型如LSTM之间的权衡与结合就成了我们方案设计的核心博弈点。接下来我将按照我们实际解决问题的流程分步拆解每个环节的思考与操作。2. 赛题理解与数据预处理一切分析的基石很多人拿到题目后会迫不及待地开始找模型、跑代码这是大忌。我们花了将近半天时间反复阅读题目描述并围绕提供的数据集做了彻底的“体检”。2.1 题目需求拆解不止于表面要求题目描述往往包含显性需求和隐性需求。显性需求如“预测未来N期的指标值”、“分析各因素的影响程度”这些是必须完成的硬性任务。而隐性需求则藏在评价标准里比如“模型的创新性”、“结果的稳健性”。我们当时的C题除了要求给出点预测还特别强调了要提供预测区间置信区间这说明评委希望看到我们对预测不确定性的量化能力而不仅仅是扔出一个数字。这一点直接影响了我们后续的模型选择——单纯使用LSTM进行点预测是不够的必须结合能够估计预测区间的技术比如在ARIMA模型中这是天然属性而对于LSTM我们则需要采用Bootstrap或蒙特卡洛Dropout等方法进行补充。另一个关键拆解点是数据维度。题目给的数据包含多个相关的时间序列变量。我们需要判断这是一个多变量预测问题用所有变量预测目标变量还是一个复杂的多步、多变量预测问题这决定了我们是构建多个单变量模型还是一个统一的多变量模型。经过讨论我们认为变量间存在较强的相关性且题目暗示了因素分析因此决定采用多变量建模思路为后续使用LSTM等能处理序列依赖和变量交互的模型埋下伏笔。2.2 数据探索性分析用眼睛“看”数据在写任何模型代码之前我们先用Pandas和Matplotlib/Seaborn对数据进行了全面的探索性分析。这一步至关重要它能帮你发现数据的特性、问题并初步形成建模直觉。首先是处理缺失值和异常值。竞赛数据通常“很脏”。我们发现了少量随机缺失采用前后时间点的线性插值进行填充因为时间序列数据具有连续性。对于异常值我们并没有武断地删除而是先画出了每个变量的时间序列折线图。果然我们发现某个变量在特定时间点出现了骤升但结合背景知识可能是某个特殊事件导致我们将其标记为“特殊点”而非“异常点”在后续建模中通过引入虚拟变量Dummy Variable来捕捉这个效应而不是简单地剔除它这反而成了我们模型的一个亮点。其次是分析序列的平稳性。这是决定能否使用ARIMA类模型的关键。我们使用statsmodels库中的adfuller函数Augmented Dickey-Fuller test对目标序列进行了单位根检验。结果p值远大于0.05表明原序列是非平稳的。接着我们绘制了自相关图ACF和偏自相关图PACF。ACF图拖尾PACF图在滞后1阶后截尾这强烈暗示序列存在趋势可能需要差分处理。我们进行了一阶差分后再次检验序列变得平稳了。这个过程不仅为ARIMA模型定阶p,d,q提供了依据也让我们对数据的本质有了更深理解它有一个确定的趋势成分。最后是分析变量间的相关性。我们计算了皮尔逊相关系数矩阵并用热力图可视化。发现有两个解释变量与目标变量的同期相关性很高但更重要的是我们通过交叉相关分析发现某个解释变量对目标变量的影响存在约3期的滞后。这个发现直接影响了特征工程我们不仅使用变量的当期值还手工构建了其滞后1-3期作为新特征这显著提升了后续模型的性能。注意很多团队会忽略滞后效应的分析直接使用同期数据建模这会损失大量信息。我们的经验是对于时间序列特征工程的核心之一就是构建合理的滞后特征和滑动窗口统计特征如过去7天的均值、方差。3. 模型选型、构建与对比ARIMA与LSTM的攻防战面对时间序列预测ARIMA和LSTM是两座绕不开的大山。我们的策略不是二选一而是让它们“打一架”再考虑是否让它们“组队”。3.1 ARIMA模型稳扎稳打的“老将”我们首先构建了ARIMA模型因为它原理清晰、可解释性强且能提供预测区间。模型定阶与参数估计基于之前ADF检验的结果我们确定差分阶数d1。通过观察平稳序列的ACF和PACF图初步判断p和q的可能取值在0到3之间。为了更精确我们采用了网格搜索Grid Search配合AICAkaike Information Criterion准则来寻找最优参数。我们写了一个循环遍历(p,d,q)从(0,1,0)到(3,1,3)的所有组合用statsmodels.tsa.arima.model.ARIMA注意新API拟合模型并记录AIC值。最终选择AIC最小的组合作为我们的最优ARIMA模型。模型诊断拟合完模型不是终点必须进行诊断检验核心是检验残差是否为白噪声。我们使用Ljung-Box检验acorr_ljungbox函数检验残差序列是否存在自相关。原假设是残差是白噪声。如果p值大于显著性水平如0.05则接受原假设认为模型拟合充分。我们的模型通过了检验。同时我们还绘制了残差的ACF/PACF图以及QQ图直观上看残差没有明显模式且近似正态分布说明模型是合适的。预测与区间估计使用拟合好的模型进行未来多步预测非常简单直接调用forecast或get_forecast方法即可。后者能直接返回包含预测区间默认为95%置信区间的结果。我们将预测结果与测试集的实际值进行对比计算了均方根误差RMSE和平均绝对百分比误差MAPE。3.2 LSTM模型能力强大的“新星”接着我们构建了LSTM模型以捕捉数据中可能存在的更复杂的非线性关系和时间依赖。数据准备这是LSTM建模最繁琐但也最关键的一步。我们需要将时间序列数据转化为监督学习问题即构造“样本-标签”对。我们定义了一个时间窗口长度look_back10意味着用过去10个时间步的所有特征包括目标变量自身的历史值和其他特征变量来预测下一个时间步的目标值。我们使用sklearn.preprocessing.MinMaxScaler将所有特征缩放至[0,1]区间这对LSTM的收敛至关重要。网络结构设计我们并没有设计非常复杂的网络因为竞赛数据量通常有限复杂模型容易过拟合。我们的结构如下输入层接收形状为(batch_size, look_back, n_features)的输入。第一层LSTM50个神经元设置return_sequencesTrue输出完整的序列以便接入下一层LSTM。第二层LSTM30个神经元设置return_sequencesFalse只输出最后一个时间步的隐藏状态。Dropout层丢弃率为0.2用于防止过拟合。全连接输出层1个神经元单变量输出使用线性激活函数。我们使用Adam优化器和均方误差MSE作为损失函数。训练技巧我们将数据按时间顺序划分为训练集和验证集注意不能随机打乱。使用EarlyStopping回调函数监控验证集损失如果连续5个epoch没有下降就停止训练并恢复最佳权重这有效避免了过拟合。我们还使用了ReduceLROnPlateau回调函数当验证损失停滞时自动降低学习率。预测与不确定性量化LSTM本身不直接提供预测区间。我们采用了蒙特卡洛DropoutMC Dropout技术。在预测时我们保持Dropout层处于激活状态对同一个输入进行多次例如100次前向传播。由于Dropout的随机性每次会得到略有不同的预测值。这100次预测的均值可以作为最终的点预测其标准差可以用来构建预测区间例如均值 ± 1.96 * 标准差。这种方法为我们的深度学习模型提供了类似置信区间的输出满足了题目的隐性需求。3.3 模型对比与融合策略两个模型都跑通后我们将其在同一个测试集上的表现进行了量化对比。模型RMSEMAPE是否提供预测区间训练速度可解释性ARIMA较低较低是快强LSTM最低最低需额外处理(MC Dropout)慢弱从表格看LSTM在预测精度上略胜一筹但ARIMA在速度、可解释性和原生预测区间上占优。我们进一步分析了预测误差的分布发现ARIMA在序列平稳期预测很准但在趋势突变点表现较差LSTM则能更好地捕捉这些非线性变化但在序列开头因为历史信息不足预测波动较大。基于此我们并没有简单地说“LSTM更好”而是提出了一种加权融合策略。我们使用测试集上各模型预测误差的倒数作为权重对两个模型的预测结果进行加权平均。具体来说误差小的模型权重更大。融合后的模型在测试集上的RMSE和MAPE比任何一个单一模型都要低。在最终论文中我们详细阐述了这个融合过程的合理性并将其作为我们模型的一个创新点。4. 代码实现与工程化管理从Jupyter Notebook到可复现的工程在数模竞赛中清晰的代码和可复现的结果与模型本身同等重要。我们早期把所有代码都写在一个Jupyter Notebook里很快就变得混乱不堪。中期我们果断进行了重构。4.1 模块化设计我们将代码按功能拆分成多个Python脚本文件data_preprocessing.py: 包含数据加载、清洗、缺失值处理、特征工程如滞后特征生成的所有函数。eda.py: 包含绘制各种分析图表时序图、ACF/PACF、热力图等的函数。arima_model.py: 包含ARIMA模型的网格搜索、拟合、诊断和预测函数。lstm_model.py: 包含数据缩放、窗口序列生成、LSTM模型构建、训练和预测函数。utils.py: 存放计算RMSE、MAPE、绘制预测对比图等工具函数。main.py: 主程序按顺序调用上述模块控制整个流程。这样的结构让代码清晰易懂也便于分工协作。更重要的是它保证了可复现性。我们使用argparse库让main.py可以接收命令行参数比如指定数据路径、模型参数等。4.2 环境管理与依赖记录我们使用conda创建了一个独立的Python环境并详细记录了所有包的版本。conda create -n mathorcup_c python3.8 conda activate mathorcup_c pip install pandas numpy matplotlib seaborn statsmodels scikit-learn tensorflow我们将所有安装命令和关键的包版本号通过pip freeze requirements.txt生成写入了竞赛论文的附录和代码仓库的README中确保评审老师或其他任何人能一键复现我们的环境。4.3 结果可视化与输出我们不仅输出了最终的预测数值表格还制作了丰富的图表来支撑我们的分析预测对比图将ARIMA、LSTM、融合模型以及真实值画在同一张图上清晰展示性能差异。残差分析图展示ARIMA模型残差的分布、自相关情况证明模型拟合充分。特征重要性图对于LSTM模型我们虽然难以像树模型那样直接解释但通过计算在扰动某个输入特征时预测输出的变化幅度一种简单的灵敏度分析我们近似地评估了各个特征的重要性并进行了可视化。预测区间展示图将融合模型的点预测和95%预测区间由ARIMA的置信区间和LSTM的MC Dropout区间综合得到一同绘制出来直观展示预测的不确定性。所有这些图的生成代码都封装在函数中确保风格统一字体、大小、颜色并导出为高分辨率的.png或.pdf文件方便插入论文。5. 技术文档撰写将工作转化为说服力的艺术数模竞赛的论文是展示你所有工作的唯一窗口。代码再好模型再妙如果表达不清也难获高分。我们的文档结构在标准摘要、问题重述、模型假设等之外特别注重以下几点。5.1 摘要浓缩的精华决胜的关键摘要可能是评委阅读最仔细的部分。我们采用“总-分-总”的结构总述用两三句话概括解决了什么问题用了什么核心方法明确点出ARIMA、LSTM及融合模型得到了什么关键结论。分述简要说明针对每个子问题如预测、因素分析所构建的具体模型、采用的算法和主要结果给出关键指标如RMSE的具体数值。总结强调模型的创新点如多模型融合、不确定性量化和主要优势如精度高、稳健性好。 我们反复修改摘要确保没有废话每个句子都传递有效信息并且完全覆盖题目要求的所有问题。5.2 模型建立与求解部分逻辑大于罗列这部分最容易写成流水账。我们避免直接堆砌公式和代码而是强调建模的逻辑链条。问题分析图我们画了一个简单的流程图展示从原始数据到最终答案的步骤数据预处理 - 探索分析 - 模型选型ARIMA/LSTM- 模型训练与评估 - 模型融合 - 结果输出。一图胜千言。公式与文字结合在介绍ARIMA模型时我们给出了ARIMA(p,d,q)的一般形式公式但紧接着就用文字解释p,d,q的物理意义以及我们是如何通过ACF/PACF图和AIC准则来确定它们的。对于LSTM我们省略了复杂的细胞状态公式而是用图示和文字描述其“记忆门”、“遗忘门”是如何工作的重点说明它为何适合处理我们的序列数据。表格展示结果将模型对比结果RMSE, MAPE、特征重要性排序等用表格清晰呈现。表格设计简洁单位明确。突出决策依据为什么选择look_back10我们展示了不同look_back值下LSTM验证集损失的变化曲线表明10是一个收益拐点。为什么使用加权融合我们列出了单独模型和融合模型在测试集上的误差用数据证明融合的有效性。每一个关键选择我们都尽量提供证据而不是“我们认为”。5.3 模型检验与灵敏度分析体现严谨性这是拉开差距的部分。很多论文只给出最终结果我们则专门设立一节来“拷问”自己的模型。稳健性检验我们改变了训练集/测试集的划分比例例如从7:3变为8:2观察模型性能RMSE是否发生剧烈波动。结果变化在可接受范围内说明模型是稳健的。参数灵敏度分析对于LSTM我们微调了神经元数量如从50/30变为60/40、Dropout率0.2变为0.3观察性能变化。我们发现模型对Dropout率相对敏感但对神经元数量在一定范围内不敏感这增强了我们模型参数选择的信心。假设讨论我们明确列出了模型建立过程中的所有假设如“数据缺失是随机的”、“未来一段时间内外部环境无剧烈变化”并讨论了如果这些假设不成立会对模型产生什么影响以及可能的应对策略。5.4 代码附录与可复现性说明我们将核心代码的片段如数据窗口生成函数、模型融合的代码以整洁的格式放入附录。更重要的是我们提供了一个清晰的指南说明如何在新的机器上复现我们的所有结果1) 如何安装依赖环境2) 如何下载数据并放置到指定路径3) 如何运行main.py来生成所有图表和结果。这体现了我们工作的完整性和专业性。回过头看这次MathorCup之旅赢在细节。最大的体会是数模竞赛不是比谁用的模型最高深而是比谁对问题的理解更透彻谁的解决方案更完整、更严谨、更具说服力。从扎实的数据探索到理性的模型对比与融合再到工程化的代码管理和层层递进的论文写作每一个环节都容不得马虎。对于正在备赛的你我的建议是尽早形成团队默契明确分工不要畏惧经典模型把它的原理和适用条件吃透勇于尝试新方法但一定要有对比和评估最后像对待一个真正的科研项目一样去管理你的代码和文档。那些熬夜调试参数、争论模型细节的日子最终都会凝结成获奖证书上的一行字以及你简历上实实在在的一笔。
返回列表