我之前做线性模型和矩阵时间序列时,经常会自然地关注降维和多重共线性问题。
比如矩阵时间序列里的 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_holidayPCA 之后变成:
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、设计正确的验证方式,并确保模型在真实预测场景中稳定。