Step 4(5%):降维与投影,PCA 到底在做什么
Step 4 是九步里权重最小的一步(5%),而它经常被写成最长的一节——因为 PCA 听起来高级、画出来好看。这一章的目标有两个:给你一页纸的标准答案,以及让你看清 PCA 的一个反直觉性质。那个性质是:它会给一列纯噪声单独开一个主成分,并声称它解释了 14.2% 的方差。
归约有三条路,PCA 只是其中一条
KDD 对这一步的定义是「data reduction and projection:finding useful features to represent the data depending on the goal of the task」。注意「有用的特征」这个说法——它没规定必须用 PCA。三条路都算归约,选一条并说明理由就够:
| 路 | 做什么 | 优点 | 代价 |
|---|---|---|---|
| ① 减列:特征选择 | 删掉与目标无关或彼此高度冗余的列(相关系数筛选、方差筛选、树模型的特征重要度、逐步回归) | 列名还在,Step 8 可以解释 | 可能丢掉「弱但有用」的列 |
| ② 换列:降维 | PCA、因子分析、SVD——把 N 列线性组合成 K 个新轴 | 保留大部分方差,解决共线性 | 新列没有业务含义,解释性大幅下降 |
| ③ 减行:抽样 | 随机/分层抽样,或按时间窗截取 | 算得快 | 损失样本量;BDAS 那次不该用(大数据的卖点就是不抽样) |
对这门课的建议:以 ① 为主,用 ② 做一个补充分析。理由是 Step 8 占 20%,而 Step 8 要的是解释——用了 PCA 之后你只能说「第一主成分升高时风险下降」,而说不出「疫苗覆盖率提高 10 个百分点时风险下降多少」。用 5% 的分换掉 20% 的解释力,不划算。
但你还是要会 PCA,因为它是这一步的标准答案
下面这台真的做了 PCA:把 7 个数值列标准化,算协方差矩阵,用 Jacobi 旋转求特征分解,然后投影。三个标签页分别是碎石图、载荷、二维投影:
读数:
| 主成分 | 特征值 λ | 解释方差 | 累计 | 它其实是什么 |
|---|---|---|---|---|
| PC1 | 4.897 | 70.0% | 70.0% | 所有载荷同号且接近——这是一个「综合发展水平」轴 |
| PC2 | 0.996 | 14.2% | 84.2% | 载荷 0.999 全压在 spend 上——那是一列纯噪声 |
| PC3 | 0.315 | 4.5% | 88.7% | 识字率与疫苗覆盖的对比(载荷一正一负) |
PC1 吃掉 70%:这是好消息
7 列里第一个主成分就解释 70% 的方差,说明这些列本来就在讲同一件事:人均 GDP 高的地方,医生多、水干净、识字率高、城镇化率高。这就是共线性的另一种说法——第 20 章会展示它如何让回归系数的符号翻转。
报告里的 4.1 就写这个数:「7 个数值特征经标准化后做主成分分析,前 2 个主成分累计解释 84.2% 的方差(PC1 70.0%,PC2 14.2%),说明原始特征存在显著共线性。」一句话,带三个数字,这一节的分就到手了。
PC2 是一个陷阱:解释方差高 ≠ 有用
spend(卫生支出占 GDP 比)与目标的相关系数只有 −0.096,是我故意放进示例数据的无关列。而 PCA 给了它一个专属主成分,还标注「解释 14.2% 的方差」。
原因不难理解,但很容易忘:PCA 是无监督的,它从来没看过目标列。它找的是「数据在哪个方向上变化最大」,而一列谁也不相关的噪声,必然自成一个方向。
切到「二维投影」那个标签页,这件事变得一目了然:红点(未达标)和绿点(达标)在横轴(PC1)上几乎完全分开,在纵轴(PC2)上完全混在一起。PC2 解释了 14.2% 的方差,对预测的贡献接近零。
- 必须先标准化。PCA 基于协方差,量级大的列会独吞第一主成分。(如果不标准化,
gdp_pc的方差是几百万,PC1 会 100% 是它。) - 只在训练集上 fit。和填补、缩放一样——在全量上做 PCA 再划分,是标准的预处理泄漏。
- 不要在树模型前用。树本来就不受量级和共线性影响,PCA 只会让它失去可解释的分裂条件。「PCA + 随机森林」几乎总是比「原始特征 + 随机森林」更差且更难解释。
- 保留几个主成分要有判据。三种常见判据:累计解释方差 ≥ 80%(本例取 2 个)、特征值 > 1(Kaiser 准则,本例 PC1 的 4.897 和 PC2 的 0.996——PC2 差一点点,这个边界情况值得在报告里提一句)、碎石图的拐点。写出你用了哪条。
4.2「投影」最省事的交付物
Step 4.2 要求 project the data。它最省事也最有效的交付物就是那张二维投影散点图,按目标类别上色——因为它同时完成三件事:
- 证明你做了投影(4.2 的要求);
- 直观展示「这个问题可不可分」:如果两类在 PC1–PC2 平面上明显分开,你的分类任务大概不难;如果完全混在一起,那 Step 6 要准备接受较低的指标,并在 Step 8 解释为什么;
- 它可以直接复用到 Step 8.2 的可视化里。
本例的图告诉你:这个任务在 PC1 上就基本可分了——这与后面第 15 章那棵深度 1 的决策树(单靠人均 GDP 一刀切就有 0.861 的测试准确率)完全一致。两处独立的证据互相印证,这种呼应写进报告非常有说服力。
| ISAS | OSAS | BDAS | |
|---|---|---|---|
| PCA | PCA/Factor 节点(自带碎石图与载荷表,输出可直接截图) | PCA(n_components=2),explained_variance_ratio_ | pyspark.ml.feature.PCA(k=2, inputCol='features') |
| 特征选择 | Feature Selection 节点、CHAID 的重要度 | SelectKBest、feature_importances_ | 树模型的 featureImportances |
| 标准化 | Transform 节点 / Auto Data Prep | StandardScaler | StandardScaler(withMean=True, withStd=True) |
| 投影图 | Plot 节点(PC1 vs PC2,按目标着色) | matplotlib / Tableau | 抽样 toPandas() 后画 |
ISAS 的便宜分:SPSS Modeler 的 PCA/Factor 节点会直接给出碎石图、载荷矩阵和累计解释方差表——三张图一次到手,是 Step 4 在三条线里最省事的一次。Auto Data Prep 节点也会自动做一堆变换,但慎用:它会帮你做很多事却不告诉你做了什么,而 Step 3–4 的分正是「你做了什么」。
1. Step 4.1(半页):① 说明选了三条路里的哪条,为什么;② 若做特征选择:筛选判据 + 被删列清单 + 删前删后列数;③ 若做 PCA:碎石图 + 一句「前 K 个主成分累计解释 X% 方差」+ 保留几个的判据。
2. Step 4.2(半页):二维投影散点图(按目标着色)+ 两句解读(可分性如何、哪个轴是主要方向)。
3. 一句纪律声明:「PCA 在训练集上拟合后应用于测试集;因后续同时评估决策树模型,树模型使用未降维的原始特征。」这一句同时展示了你知道纪律 ② 和纪律 ③。
4. 一个警告(如果你的数据也有噪声列):「注意 PC2 的载荷几乎全部来自 spend,而该列与目标相关系数仅 −0.096;这说明解释方差比例不等于预测价值,PCA 为无监督方法。」这句话能拿到 Step 4 的满分,因为它证明你理解了方法的局限。
这一章的一句话
Step 4 只值 5%,写一页就够:报出累计解释方差、画一张按目标着色的投影图、说明保留几个主成分的判据。但要记住 PCA 是无监督的——它给一列纯噪声开了一个解释 14.2% 方差的主成分,所以「解释方差高」和「对预测有用」是两件事。
下一章是这本书最重要的一章。它讲一件会让你的准确率变成 98.6%、AUC 变成 0.999、误报变成 0 的事——而这全都是坏消息。