时间序列预测:5种简单模型优先于复杂算法
1. 时间序列预测入门为什么简单模型值得优先测试在数据分析领域时间序列预测总是充满诱惑和陷阱。我见过太多团队一上来就搭建复杂的LSTM神经网络或集成模型结果发现还不如一个简单的移动平均来得准确。这就像装修房子时还没打好地基就开始纠结墙面艺术漆的色号。时间序列预测有个反直觉的真相复杂模型在样本外预测out-of-sample forecasting中的表现常常令人失望。2018年M4预测竞赛中ES-RNN混合模型仅比简单统计方法准确度提高3%左右而实现复杂度却高了两个数量级。这引出了我们的核心原则Always start simple.2. 基础模型库你必须掌握的5种简单预测器2.1 朴素预测法Naïve Forecast最简单的预测方法是将最后一个观测值作为未来所有时间点的预测值forecast [series[-1]] * n_steps实战心得在零售销售预测中我发现当数据无明显趋势/季节性时朴素法的周预测准确度常常优于ARIMA。特别是在促销活动后的回归期商品销量往往快速回落到基线水平。2.2 移动平均Moving Average计算最近k个时间点的平均值def moving_average(series, window): return series.rolling(window).mean().iloc[-1]窗口选择经验公式日数据7天周周期月数据12期年周期无显著周期√nn为序列长度2.3 加权移动平均Weighted MA给近期数据更高权重线性衰减是最常用方案weights np.arange(1, window1) # [1,2,3,...,window] wma sum(series[-window:]*weights)/sum(weights)2.4 指数平滑Exponential Smoothing递归赋予历史数据指数衰减权重alpha 0.2 # 平滑系数 forecast [] for t in range(steps): if t 0: forecast.append(alpha*series[-1] (1-alpha)*series[-2]) else: forecast.append(alpha*series[-1] (1-alpha)*forecast[t-1])参数调优技巧使用网格搜索寻找最佳alpha0.1-0.3通常效果较好用前80%数据训练后20%验证选择参数2.5 差分整合Differencing对非平稳序列先差分再预测diff series.diff().dropna() # 预测diff序列后... forecast series[-1] predicted_diff避坑指南差分阶数可通过ADF检验确定但实践中一阶差分已解决大多数趋势问题。过度差分会导致序列方差增大反而降低预测精度。3. 模型验证避免自欺欺人的测试方法3.1 滚动预测验证Rolling Forecast Validationdef rolling_validation(series, model, window, steps): for i in range(len(series)-window-steps): train series[i:iwindow] test series[iwindow:iwindowsteps] pred model(train) yield test, pred关键指标计算MAE对异常值不敏感RMSE惩罚大误差MAPE注意零值问题3.2 对抗性测试Adversarial Testing人为制造极端场景验证鲁棒性随机插入缺失值添加脉冲噪声截断历史数据长度3.3 经济意义检验预测结果必须通过业务逻辑校验库存预测不应为负值销售额增长率需符合行业经验季节性峰值要出现在合理时间点4. 典型问题排查手册问题现象可能原因解决方案预测值恒为常数未处理趋势项尝试一阶差分预测波动过大过度差分降低差分阶数长期预测发散未使用阻尼趋势添加阻尼系数季节性预测滞后季节周期错误检查ACF图峰值5. 进阶路线何时该升级到复杂模型当简单模型出现以下情况时考虑升级多周期季节性如同时存在周/年周期外部变量有强解释力如天气影响销量序列存在已知的结构突变点预测误差的ACF图显示显著自相关但务必进行模型增量效益分析计算复杂度提升倍数准确度提升百分比维护成本差异我在电商大促预测中就犯过错误用Prophet模型预测双11销量结果比加权移动平均还差17%只因忽略了平台流量限制这个外部约束。后来在简单模型基础上添加流量修正因子效果反而最好。