时间序列预测是机器学习中非常常见的任务。销量预测、访问量预测、库存计划、服务器负载、资金流水、用户活跃度都属于这一类。它和普通监督学习最大的区别在于:数据有时间顺序,不能随意打乱。

如果忽略时间结构,用普通随机划分训练集和测试集,很容易制造数据泄漏,让离线指标看起来很好,线上预测却明显失真。

一、时间序列的组成

一条时间序列通常包含几种结构:

结构 含义
趋势 长期上升、下降或稳定变化
季节性 按天、周、月、年重复出现的规律
周期性 不固定长度的经济或业务周期
噪声 随机波动和不可解释变化
异常点 活动、故障、节假日、突发事件

建模前先画图非常重要。很多时间序列问题在图上能直接看出规律,例如周末流量下降、月底交易上升、节假日销量突增。

二、预测问题的定义

时间序列预测需要明确几个问题:

  • 预测对象是什么:销量、订单数、金额、温度还是负载。
  • 预测粒度是什么:小时、天、周还是月。
  • 预测范围多长:未来 1 天、7 天、30 天还是更久。
  • 是否需要单步预测还是多步预测。
  • 是否有外部变量,例如价格、天气、活动、节假日。

不同定义会影响特征、模型和评估方式。预测未来 1 小时流量和预测未来 30 天库存,是完全不同的问题。

三、滞后特征与滚动窗口

机器学习模型本身不理解时间,需要把时间信息转成特征。常见特征包括:

  • 滞后值:昨天、上周同一天、上月同一天的指标。
  • 滚动统计:过去 7 天平均、最大值、最小值、标准差。
  • 时间特征:小时、星期几、月份、是否周末、是否节假日。
  • 增长率特征:环比、同比、移动变化率。
  • 外部变量:价格、广告投放、促销活动、天气。

构造这些特征时要严格保证只使用预测时刻之前的信息。任何未来信息都会造成数据泄漏。

四、验证方式不能随机切分

时间序列验证通常使用按时间切分:

1
2
3
训练集:过去数据
验证集:之后一段时间
测试集:最后一段时间

更稳的方法是滚动验证,也叫 walk-forward validation。模型在多个历史窗口上训练和预测,观察不同时间段的表现,避免只在某一个时间段上碰巧表现好。

五、常见模型选择

传统统计模型包括 ARIMA、指数平滑、状态空间模型等。它们适合规律较清晰、变量较少、解释性要求较高的场景。

机器学习模型包括随机森林、XGBoost、LightGBM、神经网络等。它们适合有大量外部变量、多条序列、非线性关系明显的场景。

选择建议:

场景 可选方法
单条稳定序列 指数平滑、ARIMA
多商品销量预测 LightGBM、XGBoost
大量外部变量 树模型、深度模型
短期实时预测 滚动特征 + 轻量模型
长期规划 统计模型 + 业务假设

六、指标要贴近业务

常见指标包括 MAE、RMSE、MAPE、SMAPE、WAPE。不同指标关注点不同。RMSE 对大误差更敏感,MAE 更直观,MAPE 在真实值接近 0 时会失真。

业务上还要看预测误差的方向。例如库存预测中,低估销量可能导致缺货,高估销量可能导致积压,两者成本不同。指标不能脱离决策成本。

七、上线后的监控

时间序列模型上线后,要持续监控:

  • 预测误差是否变大。
  • 是否出现新的节假日或活动模式。
  • 数据延迟是否影响特征生成。
  • 外部变量是否缺失或口径变化。
  • 模型是否需要周期性再训练。

时间序列预测不是一次性建模,而是持续校准。市场、用户和业务策略都会变化,模型必须跟着变化。

八、实践建议

先做简单基线,例如“明天等于今天”“下周同一天”等朴素预测。很多复杂模型如果连朴素基线都打不过,就说明问题定义、数据或验证方式存在问题。

真正稳定的时间序列系统,通常不是一个炫目的模型,而是一套可靠的数据口径、特征窗口、回测流程、异常处理和业务反馈机制。