PCA:Python降维算法实战
PCA 降维实战:用 Python 把高维数据压缩到二维,还保留核心信息
做特征工程时,最让人头疼的往往不是模型调参,而是字段太多:几十上百个特征里,相关性高的一堆,噪声也不少,直接丢进模型,训练慢还容易过拟合。PCA(主成分分析)就是解决这类问题的常用手段——它不按业务直觉删列,而是通过线性变换把原始特征重新组合成几个互不相关的“主成分”,用更少的维度保留尽可能多的方差信息。
下面直接用 Python 走一遍完整流程,使用 scikit-learn 自带的鸢尾花数据集,重点讲清楚每一步为什么这么做。
一、先标准化,再做 PCA
PCA 对特征尺度极其敏感。如果一个特征单位是“元”、数值成百上千,另一个是“百分比”、只有零点几,PCA 会天然偏向数值大的变量,结果完全失真。所以实战中先标准化、后降维基本是固定动作。
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
iris = load_iris()
X = iris.data
y = iris.target
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
二、先看可解释方差,再定降维维度
很多教程一上来就 n_components=2,这在可视化时没问题,但在建模场景里属于拍脑袋。更稳妥的做法是先不指定维度,让 PCA 输出所有主成分的方差贡献,再根据累计方差决定保留几个。
pca_full = PCA()
pca_full.fit(X_scaled)
print("各主成分方差占比:", pca_full.explained_variance_ratio_)
print("累计方差占比:", np.cumsum(pca_full.explained_variance_ratio_))
鸢尾花数据跑出来通常是:第一主成分约 73%,第二约 23%,前两个累计超过 95%。也就是说,把四维压到二维,仍能保留绝大部分区分度,这也是它常被用来画散点图的原因。
实际项目里,可以设一个阈值,比如累计方差达到 85% 或 90% 就停:
pca = PCA(n_components=0.90)
X_pca = pca.fit_transform(X_scaled)
print("保留主成分数:", pca.n_components_)
print("各成分方差占比:", pca.explained_variance_ratio_)
n_components 传整数表示指定维度,传小数则表示希望保留的方差比例,这是很多人容易忽略的用法。
三、降到二维后,观察类别是否还分得开
降维不是目的,关键看压缩后的数据还有没有区分能力。把前两个主成分画成散点图,能直观判断不同类别是否仍然分离。
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 5))
for label, name in enumerate(iris.target_names):
plt.scatter(
X_pca[y == label, 0],
X_pca[y == label, 1],
label=name
)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.legend()
plt.title("PCA on Iris")
plt.show()
如果不同类别在二维图上已经明显分成几团,说明后续用简单模型也可能有不错效果;如果全部糊在一起,就要考虑特征本身区分度不足,而不是一味怪 PCA。
四、读懂主成分由哪些原始变量构成
PCA 最大的争议点是“主成分不好解释”。其实可以通过 components_ 查看每个主成分在原始特征上的载荷,载荷绝对值越大,说明该原始变量对这个主成分影响越强。
loadings = pd.DataFrame(
pca_full.components_,
columns=iris.feature_names,
index=[f"PC{i+1}" for i in range(X.shape[1])]
)
print(loadings)
结合鸢尾花数据会发现,PC1 大致综合了花瓣长度、花瓣宽度等尺寸信息,整体反映花朵大小;PC2 则更多体现萼片与花瓣之间的相对差异。这样解释给业务方听,比“模型自动生成的新特征”要清楚得多。
五、容易踩的几个坑
第一,必须对训练集 fit,再 transform 测试集,不能把训练集和测试集合在一起标准化和 PCA,否则会造成数据泄露。
第二,PCA 适合处理连续型数值特征。类别变量、文本向量要先完成编码或向量化,不能直接混入。
第三,PCA 是无监督方法,它保留的是方差,不保证保留类别区分能力。极端情况下,方差最大的方向未必对分类最有用,这时可以对比 LDA、t-SNE、UMAP 等方法。
第四,降维后模型效果不一定提升。如果原始特征本来不多、共线性不严重,PCA 反而可能丢掉有用信号。建议用同一套验证集比较降维前后的分数和耗时,再决定是否上线。
结尾
PCA 的价值不只是“把高维数据画成二维图”,更在于它提供了一套可量化的压缩思路:先标准化,再根据累计解释方差选维度,最后结合载荷理解新特征的含义。真正上手时,不必执着于把数据压到多低,而要在信息保留、模型效果和可解释性之间找到平衡。按照这套流程跑一遍,基本就能避开大部分降维场景里的常见问题。


还没有评论,来说两句吧...