跳转至

14.9   降维

活动数据越做越大:兴趣标签、浏览行为、报名时间、社交关系、文本留言,加起来几十甚至上百个特征。小率想画图观察,却发现二维屏幕放不下这么多维。

降维(Dimensionality Reduction) 要做的,是把高维数据压到低维,同时尽量保留重要结构。它既能帮助可视化,也能减少噪声、加快后续模型。

图 14.9.0 降维把高维点云压成二维地图

把 100 维压到 2 维,不会丢掉很多信息吗?
会。所以降维永远是在“保留结构”和“压缩信息”之间取舍。

14.9.1   PCA 找最大方差方向

主成分分析(Principal Component Analysis, PCA) 是最经典的线性降维方法。它寻找一组互相垂直的新方向,让数据投影后的方差尽可能大。

第一主成分可以写成:

\[ \mathbf{w}_1=\arg\max_{\|\mathbf{w}\|=1}\operatorname{Var}(X\mathbf{w}) \]

直觉是:把数据投影到最能展开差异的方向上。第二主成分在与第一主成分垂直的方向里继续找最大方差。

PCA 保留什么

PCA 保留的是线性方差结构。它适合压缩连续数值特征、去噪和作为许多模型前的预处理。


14.9.2   t-SNE 和 UMAP 更像可视化地图

t-SNE 和 UMAP 常用于把高维点云画到二维图上。它们更重视局部邻域:原来互相接近的点,降维后也尽量接近。

但要谨慎解读:

  • t-SNE 图上簇之间的远近,不一定代表真实全局距离。
  • 不同随机种子和参数可能让图形变化。
  • 可视化好看,不代表适合直接拿二维坐标做最终模型。
t-SNE 图能帮我看结构,但不能把簇间距离讲得太绝对。
很好。图是线索,不是结论本身。

14.9.3   降维服务不同目标

目标 常用方法 注意
去噪压缩 PCA 看解释方差比例
可视化 t-SNE、UMAP 谨慎解释全局距离
分类前预处理 PCA、监督降维 在交叉验证内完成
高维聚类前处理 PCA、UMAP 检查稳定性

降维如果发生在监督学习流程中,必须像标准化一样放进 Pipeline。先用全量数据降维再交叉验证,会泄漏验证集信息。


14.9.4   用 Python 做 PCA

from sklearn.datasets import make_classification
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = make_classification(
    n_samples=500,
    n_features=20,
    n_informative=6,
    random_state=2026,
)

pca_pipe = make_pipeline(StandardScaler(), PCA(n_components=0.90))
pca_pipe.fit(X)

pca = pca_pipe.named_steps["pca"]
print("保留主成分数 =", pca.n_components_)
print("累计解释方差 =", round(pca.explained_variance_ratio_.sum(), 3))

二维图不要过度解读

降到 2 维的图适合观察候选结构,不适合直接证明类别真实存在。尤其 t-SNE 的簇间距离、簇大小和方向都要谨慎解释。

小率的笔记本

降维把高维数据压到低维,常用于可视化、去噪、加速和预处理。PCA 保留线性方差结构;t-SNE/UMAP 更偏局部结构可视化。任何监督流程里的降维都要防泄漏。