PCA 降维:把高维压扁
约 14 分钟
本章最后一节讲降维。它解决的是前面反复出现的问题——维度太高时,距离失效、计算变慢、还容易过拟合。
核心思想:找最重要的几个方向
数据在高维空间里,往往并不「填满」整个空间,而是集中在一个低维的子空间附近。
PCA 做的事:找出数据变化最大的几个方向,把数据投影上去。
为什么是「变化最大」:方差大的方向包含更多信息。如果某个方向上所有点都挤在一起(方差接近 0),那这个维度几乎没提供区分度,扔掉损失很小。
四个步骤
① 数据中心化(每个特征减去自己的均值)
② 计算协方差矩阵
③ 对协方差矩阵做特征值分解
④ 取前 k 大特征值对应的特征向量,作为新的坐标轴
特征值的含义:第 个特征值 就是数据在第 个主成分方向上的方差。
解释方差比:
这直接告诉你:留下 维,保住了原始信息的百分之多少。
k 怎么选
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95) # 直接指定「保留 95% 的方差」
X_new = pca.fit_transform(X)
print(pca.n_components_) # 看看实际用了多少维
print(pca.explained_variance_ratio_.cumsum())
n_components=0.95 这个写法很好用——不用自己试,让它算出保住 95% 信息需要几维。
实践中的经验:很多高维数据,前 10% 的主成分就能保住 90% 以上的方差。
两个必须注意的点
① 必须先标准化
PCA 找的是方差最大的方向,量纲大的特征方差天然大,会直接主导主成分。所以除非所有特征本来就同量纲,否则一律先 StandardScaler。
② 主成分不可解释
降维后的新特征是原始特征的线性组合(比如 身高 体重 年龄),没有业务含义。
这是 PCA 最大的代价:换来了紧凑,失去了可解释性。在需要向别人解释模型的场景里,要慎用。
PCA 的四个典型用途
| 用途 | 说明 |
|---|---|
| 可视化 | 降到 2 或 3 维,把高维数据画出来看 |
| 加速训练 | 特征从 1000 降到 50,模型训练快一个数量级 |
| 去噪 | 小特征值方向常对应噪声,丢掉反而更干净 |
| 解决共线性 | 主成分之间天然正交,互不相关 |
降维不止 PCA
| 方法 | 特点 |
|---|---|
| PCA | 线性、快、可逆、可用于新数据 |
| t-SNE | 非线性,可视化效果极好,但只能用于可视化,不能变换新样本 |
| UMAP | 类似 t-SNE 但更快,能保留更多全局结构 |
| 自编码器 | 用神经网络学非线性降维,可处理极复杂结构 |
一条实践建议:可视化用 t-SNE 或 UMAP,做预处理用 PCA。 两者目的不同,不要混用。
本章小结
这一章补上了深度学习之外的另一半机器学习:
| 类别 | 模型 | 一句话 |
|---|---|---|
| 树模型 | 决策树 | 会问问题,可解释 |
| 随机森林 | 很多树投票,降方差 | |
| 梯度提升 | 树接力修错,降偏差,表格数据之王 | |
| 距离模型 | KNN | 近朱者赤,要缩放 |
| 概率模型 | 朴素贝叶斯 | 独立假设,文本首选 |
| 间隔模型 | SVM | 最宽的街道,核技巧 |
| 无监督 | k-means | 找球形簇 |
| PCA | 找方差最大的方向 |
一条选型经验:拿到表格数据,先跑梯度提升(LightGBM)和随机森林当基线;图像语音文本走深度学习;小样本且维度不高可以试 SVM。
练习:为什么 PCA 之前必须标准化?如果不做,一个以「元」为单位的收入特征会对主成分产生什么影响?
PCA 找的是什么方向,为什么是这个方向?它最大的代价是什么?可视化该用 PCA 还是 t-SNE?
登录 后可看答案