我之前做线性模型和矩阵时间序列时,经常会自然地关注降维和多重共线性问题。

比如矩阵时间序列里的 CP 分解,某种意义上和 PCA 有相似的思想:从高维、相关、噪声较强的数据中提取更低维的结构,用少数 latent factors 表达主要变化。这样可以减少冗余,也能让后续模型更稳定。

但后来做机器学习时序预测,尤其是看 M5 competition 和一些零售预测、销量预测相关方法时,我发现一个变化:

在树模型和深度学习成为主流之后,PCA 和传统多重共线性处理似乎不再是核心步骤。


线性模型里,共线性是参数估计问题

在线性回归中,OLS 的估计式是:

如果特征之间高度相关, 会接近奇异,导致系数估计不稳定,系数方差膨胀。

也就是说,模型预测未必完全失效,但系数解释会变得很不可靠。

例如两个变量高度相关时,模型可能在一次训练中把权重分给 ,在另一次训练中又把权重分给 。这时很难判断到底哪个变量真正重要。

所以在线性模型中,我们会自然地关注:

  • 相关系数矩阵;
  • VIF;
  • PCA;
  • Ridge / Lasso / Elastic Net;
  • 逐步回归;
  • 因子模型;
  • 矩阵或张量分解。

这些方法背后的共同目标是:

在高维、相关的变量空间中,得到更稳定、更可解释的参数估计。


树模型里,共线性不是“数学病”

Boosting / tree-based models 的机制不同。

XGBoost、LightGBM、CatBoost 这类模型不是通过估计一组全局线性系数来拟合,而是通过特征切分来构造非线性规则。

例如:

if sales_lag_7 > threshold:
    go left
else:
    go right

它们不需要计算:

所以不会像 OLS 那样,因为特征高度相关而导致矩阵求逆不稳定。

如果两个特征高度相关,比如:

sales_lag_7
rolling_mean_7

树模型通常可以选择其中一个,也可能在不同树里交替使用它们。这会带来一些副作用,但不是传统意义上的估计问题。

更准确地说:

对树模型来说,多重共线性通常不是模型失效问题,而是特征治理问题。

它主要影响:

  • 训练效率;
  • 模型复杂度;
  • feature importance 稳定性;
  • SHAP 归因解释;
  • 上线后的排查和维护成本。

为什么现代时序预测更强调特征工程?

M5 这类现代机器学习时序预测任务,往往会把预测问题转化成 supervised learning 问题:

商品 × 门店 × 日期 → 未来销量

这时重点不再是先对原始变量做 PCA,而是构造能表达时间结构和业务结构的特征。

常见特征包括:

  • lag features;
  • rolling mean / rolling std;
  • calendar features;
  • price features;
  • event / holiday features;
  • item / store / category identifiers;
  • hierarchical aggregation features;
  • target encoding。

因此,模型效果更依赖于:

  • 时间切分是否正确;
  • 是否存在 target leakage;
  • lag 和 rolling window 是否合理;
  • 是否表达了商品、门店、品类等层级结构;
  • 验证集是否符合真实预测场景;
  • 不同 forecast horizon 上是否稳定。

这些问题通常比 PCA 更关键。


PCA 对树模型未必是默认好选择

PCA 仍然有价值,但在树模型场景中,它不一定适合作为默认步骤。

主要原因有三个。

第一,PCA 会降低解释性。

原始变量可能是:

price
discount
stock
sales_lag_7
is_holiday

PCA 之后变成:

PC1
PC2
PC3

这会让业务解释变困难。

第二,PCA 是无监督的。

它保留的是 中方差最大的方向,而不一定是对 最有预测力的方向。某些局部但关键的预测信号,可能方差不大,却对目标变量很重要。

第三,树模型本身擅长在原始特征上做切分。

例如:

if discount > 0.3 and stock > 100:
    sales increases

这种规则在原始变量空间里很自然。PCA 把变量旋转成线性组合后,反而可能破坏这种可解释的业务结构。


深度学习不是不做降维,而是改成表示学习

深度学习时序模型也不太强调传统 PCA,但这不代表它们不学习低维结构。

区别在于:

PCA 是无监督的线性降维;深度学习更倾向于端到端的监督表示学习。

例如:

  • embedding 学习商品、门店、品类表示;
  • RNN / LSTM / GRU 学习序列状态;
  • CNN 学习局部时间模式;
  • Transformer 学习长距离依赖;
  • representation learning 学习压缩表示。

所以现代方法不是不需要低维结构,而是低维结构的来源变了:

传统统计 / PCA:先从 X 中抽取低维结构,再建模 y
现代 ML / DL:在预测 y 的过程中学习有用表示

实践中理解

如果是线性模型,确实应该关注多重共线性,因为它直接影响参数估计和系数解释。

但如果是 Boosting / 树模型,我不会默认做:

VIF → 删除变量 → PCA → 建模

我更倾向于:

业务口径检查
target leakage 检查
相关特征分组
消融实验
time-based validation
grouped feature importance
模型稳定性检验

对于高度相关的 lag / rolling 特征,我也不会机械删除。因为它们虽然相关,但可能表达不同时间尺度:

短期动量
中期趋势
长期基准
周期性
平滑需求水平

真正应该删除的,通常是明显重复、口径冲突、存在泄漏或维护成本过高的特征。


总结

我现在会这样理解:

在线性模型里,多重共线性是参数估计问题。
在树模型里,多重共线性更多是特征治理问题。

PCA 仍然有价值,尤其适合线性模型、高维低样本、共同因子明显的场景。

但在现代机器学习时序预测中,PCA 通常不是默认步骤。更重要的是构造合理的时序特征、避免 target leakage、设计正确的验证方式,并确保模型在真实预测场景中稳定。