Auto TS时间序列预测:超越LSTM与ARIMA的建模与调参指南
发布时间:2026/10/9 11:23:12 锦皓数字建站

简介2022年第十届泰迪杯B题电力负荷预测完整方案基于AutoTS自动化时间序列框架以Python实现数据清洗、建模与预测。相较于LSTM、ARIMA等传统模型AutoTS在拟合精度与预测准确度上表现更优适合备战泰迪杯等数据挖掘竞赛、从事电力负荷预测或时间序列分析的研究者参考。资源共25个文件含13个CSV数据与预测结果文件、8个IPYNB分步建模与分析笔记、3个PY执行脚本及1个XLS汇总表压缩包仅2.31MB目录按题目结构组织便于检索复用。已有1442人浏览学习。包内覆盖第一大问与第二大问各小问的完整处理流程包括AutoTS模型调用、参数调优、未来三个月每日负荷预测结果以及大工业、普通工业、商业等分类用电的有功功率预测输出。可直接对照代码修改数据路径与参数快速复现赛题方案也可迁移至其他电力负荷或时间序列预测任务中。1. 泰迪杯 B 题的 Auto TS 方案为什么它能同时赢过 LSTM 与 ARIMA2022 年第十届泰迪杯 B 题这类赛题望文生义就知其敏感给一份历史序列让你预测未来一段时间的走势。过往多数参赛队伍的第一反应是上 LSTM第二反应是拉 ARIMA 做差分两条路各有各的坑。LSTM 对数据量和调参极度敏感小样本序列上经常学到噪声ARIMA 则被阶数选择困住p、d、q 三参数全靠 ACF/PACF 图硬猜猜错一步整体报废。而标题里这个 Auto TS 方案本质是把“模型选择超参寻优误差评估”全部交给自动化管线在一个搜索空间里同时跑完多种候选模型再按设定准则挑最优。它在拟合程度和精确度上同时压过 LSTM 和 ARIMA不是玄学而是它在有限样本、单变量时序这种典型赛题场景里恰好避开了两类对手最致命的短板。这篇文章不打算复刻某份比赛源码而是把这条 Auto TS 路线的建模逻辑、必调参数和验证方法拆开讲透让拿到同类题的人能直接套用。2. Auto TS 在时间序列里到底做了什么从模型搜索到自动调参2.1 你不需要在 ARIMA 和 ETS 之间二选一让 Auto TS 替你搜索传统时序建模的痛点在于“选型靠经验”。拿到序列先画图目测有没有趋势、有没有季节性然后决定用 ARIMA 还是指数平滑接着再为 ARIMA 定阶。这一套流程在赛题时间压力下非常容易出错序列长度不够时 ACF/PACF 图全是毛刺差分阶数 d 取 1 还是 2 完全靠手感seasonal 周期判断错了模型直接残差爆炸。Auto TS 把这件事变成了搜索问题。以开源的 AutoTS 库为例它内置了 ARIMA、ETS、Theta、TBATS、GluonTS 等多个候选模型族自动生成一组候选配置比如 ARIMA(2,1,2) 配季节性周期 7、ETS 配乘法趋势、Theta 配 0.3 平滑参数然后用时间序列交叉验证逐一评估最后按你指定的指标MAE、RMSE、MAPE 等选出最优模型。你不需要预先知道数据是加法还是乘法季节性也不需要手工定 p、d、q把候选空间交给搜索器比你肉眼猜要稳得多。我一般会先跑一次最小配置的 Auto TS看它选出哪个模型族、哪个参数组合这个结果本身就暴露了序列的结构特征。比如它选了 ETS 的乘法季节性说明序列的波动幅度随水平值放大选了带差分的 ARIMA说明序列非平稳。这一手信息比你自己去画图猜来得快也更有依据。2.2 你真的读懂“精确度比 LSTM 高”吗几种误差口径的意义标题里说的“精确度更高”落到代码层面其实是某个误差指标更小但“哪个指标”直接决定结论是否成立。回归预测常见四个口径MAE 是绝对误差的平均RMSE 放大离群点的惩罚MAPE 是百分比误差适合对比不同量级的序列但真实值接近 0 时它会爆炸SMAPE 是 MAPE 的对称版本赛题常用的还有它。Auto TS 评估时默认按训练集内部做交叉验证来选模型这个内部指标和你最后对外报告的指标一旦不一致会出现“模型选优用的 MAE最终答辩却汇报 MAPE”的错位。我在某次模拟项目X里就干过这事Auto TS 内部优化用 RMSE选出一个对尖峰特别敏感的模型结果换到 MAPE 上一看被另一个候选模型甩开一大截。所以拿到 Auto TS 的模型后不要直接用它的内置指标对外汇报要用同一套测试集、同一个误差口径重新算一遍。表格对比 LSTM、ARIMA、Auto TS 在赛题里的典型表现时我习惯固定三个维度测试集长度一致、预测起点一致、误差公式一致否则对比表没有意义。后面第 6 章会专门讲这个公平对比怎么做。2.3 环境准备与库选型pmdarima、statsforecast 与 autots 的取舍赛题环境一般只给 Python 基础包Auto TS 相关的库需要自己装。常见的三个选择pmdarima 只做 ARIMA 的自动定阶本质是 auto_arima不算完整的 Auto TSstatsforecast 的 AutoARIMA、AutoETS 性能好、速度快但搜索策略偏单模型AutoTS 库覆盖面广能同时搜多个模型族适合比赛这种“不知道哪个模型好用”的场景。我的建议是主力用 AutoTS 库做整体搜索拿到它的最优模型后再把同样配置塞给 statsforecast 复算一次当交叉验证。两个库对同一组参数的评价逻辑略有差异结果互相印证时更可信。安装时注意环境隔离这几个库对 NumPy 版本有要求我吃过亏在新环境里装完 AutoTSimport 时报 libgomp 相关的错最后是重建虚拟环境、指定 NumPy 的某个兼容版本才跑通。代码块只贴最关键的安装与版本核对命令赛题服务器一般离线建议提前把 wheel 文件下载好传进去pip install autots python -c import autots; print(autots.__version__)逻辑说明第一行安装 AutoTS 主包它会连带拉起 pandas、scikit-learn 等依赖第二行核对版本号确认安装成功再往下走。参数说明这里没有额外参数重点是确认 import 不报错。3. 数据准备把 B 题原始序列整理成 Auto TS 能直接吃的格式3.1 时间列对齐、缺失值填补与异常点处理赛题给的数据往往不是干净的 DataFrame常见情况是日期列是字符串、时间间隔不均匀、中间有缺失日期。AutoTS 对输入格式要求很明确必须是一个 pandas DataFrame包含一列时间可以是 datetime 类型和一列数值时间列做索引列名最好是英文。先统一转换时间列再把缺失的日期补出来。import pandas as pd df pd.read_csv(b_data.csv, parse_dates[date]) df df.set_index(date).sort_index() df df.asfreq(D) # 把时间轴对齐到每天 df[value] df[value].interpolate(methodlinear).fillna(methodffill) df df[df[value] 0] # 赛题值域通常为正过滤异常负值逻辑说明parse_dates 在读取时就把时间列转成 datetime 类型set_index 把时间列设为索引后面 AutoTS 按索引频率推断周期asfreq(D) 强制把缺失的日期补出来补出来的行 value 是 NaNinterpolate 用线性插值填掉缺口最后过滤掉明显的负值异常点。参数说明频率D表示按天对齐如果数据是小时级改成Hinterpolate 的 method 可以换time对时间索引做插值更自然但速度慢一些。这里有个特别注意AutoTS 内部会把索引的频率当成季节周期的参考频率不统一时它推算的 season_length 会错。我见过一个案例数据本身是工作日数据索引里却有周末日期导致模型识别出 7 天周期实际业务周期是 5 天。所以对齐频率后务必用 df.index.freq 看一眼推断结果不对就直接手动指定。3.2 平稳性检验与差分让 Auto TS 少走弯路Auto TS 内部对部分模型会自动做平稳性处理但它不会替你做“要不要差分”的决策提前做好可以让搜索空间更小、结果更稳。用 ADF 检验做一个快速判断from statsmodels.tsa.stattools import adfuller result adfuller(df[value].dropna()) print(ADF p-value:, result[1]) if result[1] 0.05: df[value] df[value].diff().dropna()逻辑说明ADF 检验的原假设是序列非平稳p 值小于 0.05 才拒绝原假设、认为序列平稳。p 大于 0.05 时我们对原序列做一阶差分把差分后的序列喂给模型。参数说明diff() 默认一阶差分如果一阶差分后还不平稳执行第二次 diff()但绝大多数赛题序列一阶差分足够adfuller 的 autolag 参数默认是AIC自动选滞后阶数一般不用动。做完差分后预测结果要记得还原AutoTS 的 forecast 输出的是差分后的值你得用最后一期真实值把差分值累加回去。这个还原步骤漏掉的人不少。我一般把最后一期真实值单独存一个变量预测完直接加回去省得回头对不上。3.3 训练集、验证集、测试集的切分窗口时序预测的切分不能随机打乱必须按时间先后切。常见做法是最后 N 个点做测试集测试集前面的 M 个点做验证集剩下全做训练集。AutoTS 在内部做交叉验证时会自己切验证集但对外报告时你需要一份“真正没见过”的测试集用来最终评估模型。test_len 30 val_len 20 train_end - (val_len test_len) val_end -test_len train df.iloc[:train_end] val df.iloc[train_end:val_end] test df.iloc[val_end:]逻辑说明把序列末尾 30 个点留给测试末尾往前 20 个点留给验证前面全部是训练。AutoTS 先用 train 拟合、在 val 上选模型确认最优模型后再用 trainval 重新拟合并预测 test。这种三切分的好处是你在 val 上挑模型时不会碰 test最后 test 的误差才是可信的对外指标。参数说明test_len 和 val_len 的比例可以考虑数据长度数据有 365 天时测试集给 30 天是合理区间取太多训练数据不够取太少测试结论没有统计意义。三切分的另一个价值是它可以暴露过拟合。如果 AutoTS 在 val 上误差很小、在 test 上突然放大说明搜索出的模型对训练段过度拟合你就该回头限制模型复杂度比如把搜索次数调低、候选模型精简。4. Auto TS 建模与必调参数一份可直接套用的核心代码4.1 快速跑通最小模型三行代码拿到第一个预测结果先把最小可跑的代码贴出来确认环境没问题再谈调参。AutoTS 库的建模接口大致如下from autots import AutoTS model AutoTS( forecast_length30, frequencyD, constraintmedium, ensembleauto, ) model.fit(df, future_forecast_length30) pred model.predict()逻辑说明AutoTS 在 fit 阶段搜索候选模型predict 阶段输出未来 30 天的预测。constraint 控制搜索空间大小medium 是折中档complex 会更耗时间但可能搜到更优模型。ensembleauto 会让模型在最后尝试把多个候选结果做加权组合通常能小幅提升精度。参数说明forecast_length 是单次预测长度必须和赛题要求一致frequency 建议写成D或取决于数据的最小间隔。这一段代码不调任何高级参数直接拿默认搜索空间跑。跑通之后看两个对象一个是 model.best_model_name告诉你搜索器认为最优的模型族是什么另一个是 model.best_model_params记录具体参数。这两个字段是你后面手工调参的出发点。如果 best_model_name 始终是 Naive 或 SeasonalNaive说明数据里没有足够信号别继续加大搜索力度先回头检查预处理。4.2 打开自动搜索selection 与 forecast_length 等的组合调整AutoTS 的核心参数其实是 num_validations 和 model_list。num_validations 控制交叉验证的折数默认 3意思是把训练段切成 3 份滚动验证。折数越大、评估越稳但耗时线性增长。model_list 可以传一个具体列表只搜索你指定的模型族比如 [ARIMA, ETS, Theta]减少搜索范围换取速度。from autots import AutoTS model AutoTS( forecast_length30, frequencyD, model_list[ARIMA, ETS, Theta], num_validations5, constraintmedium, ensembleauto, metricsmape, ) model.fit(df, future_forecast_length30) pred model.predict()逻辑说明这段代码把候选模型收窄到三个主流模型族把交叉验证折数提高到 5并把模型优选的误差指标设为 smape。交给比赛场景这几个参数是对精度影响最明显的。参数说明metric 可选 mae、rmse、smape 等选哪个要和你对外报告口径一致model_list 里写模型名必须匹配库内置的名字大小写敏感写错会直接报 KeyError。ensembleauto 保留软融合如果比赛要求可解释性改成 none 可以只输出单模型。这里要提醒一句forecast_length 不必等于赛题要预测的总长度如果你的数据支持多步递归预测可以先做短预测再滚动外推实际效果通常比一次性预测 60 天更稳因为误差不会在后段滚雪球。我一般把 forecast_length 设成 20 到 30 天然后滚动重复 predict 拼接结果。4.3 模型如何被选中cross_validation 与误差准则的阅读方法AutoTS 的模型选择机制是把训练段分成 num_validations 份每份末端都有一小段被当作验证段模型在这个多段验证上计算误差误差最小者被选为最优。也就是说fit 完成后 model.best_model_name 给出的模型是在你训练段内部的“滚动考试”里成绩最好的不代表在你切的 val 集合上一定最好。所以手动对账这一步值得做。用下面代码看它在 val 上的表现val_pred model.predict() val_true val[value].values from sklearn.metrics import mean_absolute_error print(mean_absolute_error(val_true, val_pred.forecast[value].values))逻辑说明predict 一次得到整个 forecast 对象取其中的预测列和 val 的真实值比较。这段代码只算 MAE只是让你感知模型在你独立预留的 val 上表现几何。参数说明val_pred.forecast 是 DataFrame列名与训练时指定列名一致如果你在 fit 时加了 future_forecast_length预测长度会覆盖 forecast_length 的设定对账时注意长度是否匹配。这一步对账是我个人习惯里很重要的一环发现 AutoTS 内部验证误差和 val 误差差 30% 以上就说明搜索过程过拟合了训练段直接换参数或缩搜索空间。反推回去“精确度比 LSTM 高”的结论只有在这个对齐之后再汇报才站得住。5. Auto TS 常见问题与排查四个最容易翻车的环节5.1 现象数据看着干净但 Auto TS 预测全是平移某个同学拿一份周度销售数据跑 AutoTS训练段拟合得完美预测输出却是一条水平线数值接近训练段最后一周的均值。原因不是模型坏了而是模型选了 Naive 或 SeasonalNaiveNaive 的输出就是“最后观测值无限往后复制”。AutoTS 是诚实的数据里没有强趋势或周期性时它认为最稳的预测就是平移。解决思路分两步先看 best_model_name确认是不是 Naive如果是检查预处理阶段是否把趋势信息抹掉了比如误做了一阶差分或者填充缺失值时把尖峰都填平了。还原趋势后重新搜索一般会跳出 Naive。5.2 现象模型训练特别慢几分钟都没反应AutoTS 在 constraintcomplex 且 model_list 不限制时会搜索几十上百个模型配置每个配置都要跑交叉验证分钟级的等待是常态不是死机。但比赛时间宝贵不应该让它空转。解决方法是收紧 search 范围model_list 只保留三四个模型族constraint 降到 mediumnum_validations 降到 3。经验上先跑一次小搜索确定“哪个模型族方向是对的”再针对这个模型族放大搜索比一次性全量搜索快得多效果也不差。5.3 现象验证集很准测试集整段偏移AutoTS 在你预留的 val 上 MAE 小得很漂亮换到 test 上预测曲线整体高出一截。这个偏移常见原因是训练段和测试段之间有一个结构性突变比如序列最后一段叠加了一次促销或政策影响而训练段没有这类样本。AutoTS 的模型没有外部变量通道除非你在 fit 里传入额外回归特征它只能沿用历史模式外推遇到突变天然会偏。处理思路是检查最后一段和前面的分布差异如果突变是已知事件把事件区间从训练段剔除用更早的数据重新拟合如果是不可知的那任何模型都救不了汇报时把这个限制写清楚。5.4 现象指标比 LSTM 高、图形却更难看的诡异情况RMSE 和 MAE 这类指标只考察“逐点误差”不考察“曲线形状”。AutoTS 选出的模型可能逐点误差小但相位滞后或波峰波谷对不上画图看着就是别扭而 LSTM 拟合出的曲线形状更像虽然逐点误差大。遇到这种局面我的做法是加一个形状对比指标比如计算预测和真实值的一阶差分的相关性。相关性高说明走势方向捕捉准确比单一误差数字更接近评委关心的“趋势预测”。如果 AutoTS 赢在误差、输在形状考虑在模型列表里加入 momentum 类模型或者直接改用 ensemble 把多个模型的预测做加权形状通常会变自然。6. 实测对比Auto TS 与 LSTM、ARIMA 的误差表怎么读才可信6.1 同切分、同时段、同指标对比的公平性怎么保证“Auto TS 精确度比 LSTM 和 ARIMA 高”这句话要变成可信结论必须回到对比实验本身。常见错误是 LSTM 用最后 30 天做测试ARIMA 却用最后 20 天AutoTS 又换了一个提前量最后摆一个误差表出来谁也没法复现。我推荐的对比框架是三固定预测起点一致、预测长度一致、误差公式一致。起点一致的意思是三个模型的训练段结束位置相同LSTM 在第九十天开始预测ARIMA 和 AutoTS 也必须从第九十天开始。预测长度一致是大家都在同一段 test 上评估而不是各自挑远点。误差公式一致是你汇报时全部用 MAPE或者全部用 RMSE不要 LSTM 用 MAE、ARIMA 用 RMSE自己给自己凑最有利口径。放一张参考误差表说明它的格式和边界再做一次实验就能用同样的模板填模型MAERMSEMAPE%ARIMA12.415.88.7LSTM10.914.27.3Auto TS9.612.16.4这张表的数字不是某个项目的固定结论只表达一种“可复现的对比格式”。三个模型的测试区间完全一样误差才算可比。我在实践里得到的结论是Auto TS 在小样本单变量序列上赢 LSTM 并不稀奇因为 LSTM 在小样本下很难学到有效的长期依赖反而被噪声带偏但真实业务里 LSTM 更适合多变量、长序列场景那又是另一套对比方法了。6.2 一个验证小技巧用随机游走当基线让提升率现出原形最后再给一个我常用的验证习惯无论用哪个模型做预测先跑一个“随机游走”基线作为底线。随机游走就是“下一期等于本期”它等价于 Naive 模型。如果 AutoTS 连随机游走都赢不过那说明数据里没有可利用的信号任何复杂模型的“高精度”都只是过拟合的幻觉。naive_pred test[value].shift(1) naive_mae mean_absolute_error(test[value][1:], naive_pred[1:]) model_mae mean_absolute_error(test[value], pred.forecast[value].values) print(Naive MAE:, naive_mae) print(Model MAE:, model_mae)逻辑说明shift(1) 产生“用上一期真实值当预测值”的序列去掉第一个空值后和模型误差对比。如果 model_mae naive_mae你的精心调参就是在陪跑。参数说明mean_absolute_error 来自 sklearn.metrics注意对齐长度test 去掉第一个点后长度要和预测长度完全一致长度不匹配时 sklearn 会报警。我自己的一个习惯是把所有候选模型的精度提升率都在这个基线上算一遍提升率 naive_mae - model_mae/ naive_mae。这个数字比“谁比谁高 0.5”更直观评委也更容易接受。顺便说AutoTS 快速验证阶段的默认输出里其实就包含 Naive 模型一旦发现它排在榜首我通常直接停掉搜索回去看数据不再往模型上砸时间。这句话听着像废话但我在项目里救过不止一次。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。