14.9 降维¶
活动数据越做越大:兴趣标签、浏览行为、报名时间、社交关系、文本留言,加起来几十甚至上百个特征。小率想画图观察,却发现二维屏幕放不下这么多维。
降维(Dimensionality Reduction) 要做的,是把高维数据压到低维,同时尽量保留重要结构。它既能帮助可视化,也能减少噪声、加快后续模型。
把 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 更偏局部结构可视化。任何监督流程里的降维都要防泄漏。
