时间序列预测是机器学习中非常常见的任务。销量预测、访问量预测、库存计划、服务器负载、资金流水、用户活跃度都属于这一类。它和普通监督学习最大的区别在于:数据有时间顺序,不能随意打乱。
如果忽略时间结构,用普通随机划分训练集和测试集,很容易制造数据泄漏,让离线指标看起来很好,线上预测却明显失真。
一、时间序列的组成
一条时间序列通常包含几种结构:
| 结构 | 含义 |
|---|---|
| 趋势 | 长期上升、下降或稳定变化 |
| 季节性 | 按天、周、月、年重复出现的规律 |
| 周期性 | 不固定长度的经济或业务周期 |
| 噪声 | 随机波动和不可解释变化 |
| 异常点 | 活动、故障、节假日、突发事件 |
建模前先画图非常重要。很多时间序列问题在图上能直接看出规律,例如周末流量下降、月底交易上升、节假日销量突增。
二、预测问题的定义
时间序列预测需要明确几个问题:
- 预测对象是什么:销量、订单数、金额、温度还是负载。
- 预测粒度是什么:小时、天、周还是月。
- 预测范围多长:未来 1 天、7 天、30 天还是更久。
- 是否需要单步预测还是多步预测。
- 是否有外部变量,例如价格、天气、活动、节假日。
不同定义会影响特征、模型和评估方式。预测未来 1 小时流量和预测未来 30 天库存,是完全不同的问题。
三、滞后特征与滚动窗口
机器学习模型本身不理解时间,需要把时间信息转成特征。常见特征包括:
- 滞后值:昨天、上周同一天、上月同一天的指标。
- 滚动统计:过去 7 天平均、最大值、最小值、标准差。
- 时间特征:小时、星期几、月份、是否周末、是否节假日。
- 增长率特征:环比、同比、移动变化率。
- 外部变量:价格、广告投放、促销活动、天气。
构造这些特征时要严格保证只使用预测时刻之前的信息。任何未来信息都会造成数据泄漏。
四、验证方式不能随机切分
时间序列验证通常使用按时间切分:
1 | 训练集:过去数据 |
更稳的方法是滚动验证,也叫 walk-forward validation。模型在多个历史窗口上训练和预测,观察不同时间段的表现,避免只在某一个时间段上碰巧表现好。
五、常见模型选择
传统统计模型包括 ARIMA、指数平滑、状态空间模型等。它们适合规律较清晰、变量较少、解释性要求较高的场景。
机器学习模型包括随机森林、XGBoost、LightGBM、神经网络等。它们适合有大量外部变量、多条序列、非线性关系明显的场景。
选择建议:
| 场景 | 可选方法 |
|---|---|
| 单条稳定序列 | 指数平滑、ARIMA |
| 多商品销量预测 | LightGBM、XGBoost |
| 大量外部变量 | 树模型、深度模型 |
| 短期实时预测 | 滚动特征 + 轻量模型 |
| 长期规划 | 统计模型 + 业务假设 |
六、指标要贴近业务
常见指标包括 MAE、RMSE、MAPE、SMAPE、WAPE。不同指标关注点不同。RMSE 对大误差更敏感,MAE 更直观,MAPE 在真实值接近 0 时会失真。
业务上还要看预测误差的方向。例如库存预测中,低估销量可能导致缺货,高估销量可能导致积压,两者成本不同。指标不能脱离决策成本。
七、上线后的监控
时间序列模型上线后,要持续监控:
- 预测误差是否变大。
- 是否出现新的节假日或活动模式。
- 数据延迟是否影响特征生成。
- 外部变量是否缺失或口径变化。
- 模型是否需要周期性再训练。
时间序列预测不是一次性建模,而是持续校准。市场、用户和业务策略都会变化,模型必须跟着变化。
八、实践建议
先做简单基线,例如“明天等于今天”“下周同一天”等朴素预测。很多复杂模型如果连朴素基线都打不过,就说明问题定义、数据或验证方式存在问题。
真正稳定的时间序列系统,通常不是一个炫目的模型,而是一套可靠的数据口径、特征窗口、回测流程、异常处理和业务反馈机制。