11.2 使用主成分分析降维
第 11.1 节说明了冗余且尺度不同的坐标会扭曲距离,高维数据也无法直接画出来。主成分分析(Principal Component Analysis, PCA)会建立一组新的正交坐标,用更少维度尽量保留原数据方差。
PCA 是无监督、线性方法。它看到的是特征协方差,不是目标相关性、因果关系或 cluster 真相。它的价值在于几何压缩、可视化、降噪,以及有时让下游模型更稳定。
把坐标轴旋向最大方差
先把每行中心化为 。给定单位方向 ,一维得分为:
第一主成分 PC1 会选择让这些得分方差最大的 。从几何看,就是把每个点垂直投影到一条候选直线,再旋转直线,直到投影点分布最宽。第二主成分在与 PC1 正交的限制下最大化剩余方差,之后成分重复同一规则。
等价地说,主成分方向是协方差矩阵按特征值从大到小排列的特征向量。scikit-learn 使用奇异值分解(Singular Value Decomposition, SVD)计算 PCA,并把主轴保存在 components_。transform 返回的得分矩阵,每列对应一个保留成分。
投影实验允许你旋转候选轴。灰线表示每个点投影时丢掉的正交方向,橙点是一维得分重新放回直线的位置。当前投影方差会与最佳方向比较。改变特征 2 的尺度后,最佳轴也会旋转——这是“缩放属于建模选择”的直接图形证据。
scikit-learn 的 PCA 会中心化列,但不会自动把各列缩放到单位方差。如果特征单位不应决定重要性,就在 PCA 前放置 StandardScaler:
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
pca_pipeline = make_pipeline(
StandardScaler(),
PCA(),
)
scores = pca_pipeline.fit_transform(development[features])
pca = pca_pipeline.named_steps["pca"]缩放与 PCA 必须在同一条有效数据边界内拟合。如果 PCA 为交叉验证中的监督模型提供输入,两个转换都应进入 Pipeline,并在每个训练折中单独拟合。即使 PCA 没看 ,预先用全部样本拟合仍会泄露验证分布。
成分系数通常叫载荷(loading)。绝对值很大的正或负系数,表示该特征与主成分方向高度对齐。符号却是任意的:把整个成分及其所有得分乘以 ,几何完全相同。应解释相对模式和子空间,而不是软件偶然让轴指向左还是右。
判断压缩到底丢掉了什么
explained_variance_ratio_[j] 是第 个成分占总方差的比例。碎石图(scree plot)展示逐成分比例,累计曲线展示前 个成分保留多少:
选择最小的 达到 90% 或 95% 可以作为起点,却不是普遍最优规则。方差不等于业务价值。少见欺诈方向、传感器故障或少数群组模式可能只贡献很小总体方差,却非常重要。
PCA 可以通过 inverse_transform 把保留得分返回原特征空间。使用全部成分时,除数值精度外几乎可以精确重建;成分减少时,每行只会重建为它在保留子空间中的投影,差值就是重建误差。
重建实验像一台只有两个信道的编码器。你可以检查四种成分签名,自由选择任意两个进行传输,再逐条比较解码前后的记录。大多数行会奖励高方差成分,但两条稀有记录把重要对比藏在低方差方向,因此整体 RMSE 与稀有信号误差可能给出相反判断。这说明“累计比例很高”不能独自批准压缩。
压缩至少要从几个角度评估:
- 画逐成分与累计解释方差。
- 在留出数据上按原始业务单位计算重建误差,并分解到每个特征和重要群组。
- 检查 PC 得分图中的异常、梯度与重叠,但不能从颜色凭空发明 cluster。
- 检查不同折或 Bootstrap 样本中的成分/子空间稳定性。
- 如果目标是预测,就在有效折上评估真正的下游模型。
PCA 是线性的,因此弯曲流形可能仍需许多成分。它还对极端点敏感,因为方差使用到均值的平方距离。稳健缩放、记录核验或其他降维方法可能更合适,但每种替代方案也有自己的假设。
不能声称 PC1“导致”了某种模式,也不能把二维图上的两团点直接称作自然类别。二维 PCA 图只是一幅投影:被丢弃维度中可能仍有重叠,坐标范围与选择性着色也可能夸大分离。
本章前半把行当成没有顺序的点云。下一节会加入一个不能随意打乱的特殊坐标:时间。开始预测之前,先建立可信时间索引、日历分箱与滚动窗口。