pca降维需先fit再transform,避免重复fit导致维度错误;n_components设为0.95更稳妥;绘图时须用x_pca[:,0]和x_pca[:,1];离群值、稀疏矩阵、非线性结构不适用pca。

PCA 降维后数据形状不对,fit_transform 和 transform 混用导致报错
常见错误是训练时用 fit_transform,但新数据预测时又调用 fit_transform,结果维度不一致或报 ValueError: X has 5 features, but PCA is expecting 10。PCA 必须先 fit(或 fit_transform)一次得到主成分,后续所有数据都只能用 transform 投影到同一空间。
- 训练阶段:用
pca.fit_transform(X_train),得到降维后数据并保存模型 - 推理/测试阶段:必须用同一个
pca实例调用pca.transform(X_test),不能重新fit - 如果用
StandardScaler预处理,也要同样只fit一次训练集,再transform测试集
选多少个主成分?n_components 设成整数还是小数很关键
n_components 直接决定保留的信息量和后续模型效果。设成整数(比如 5)表示固定保留前 5 个主成分;设成 0–1 的小数(比如 0.95)表示保留能解释 95% 方差的最少成分数量——后者更稳妥,尤其当原始特征维度高、相关性不明时。
- 用
n_components=0.95后,检查pca.n_components_实际取了多少个,避免意外压缩过度 - 设整数时注意:若
n_components > min(n_samples, n_features),会直接报错ValueError: n_components must be - PCA 对样本数敏感:当
n_samples (小样本高维),默认用截断 SVD 算法,结果可能不稳定
画散点图看降维效果,plt.scatter 坐标传错列名就白忙活
PCA 输出是 numpy.ndarray,没有列名。想画前两个主成分的散点图,必须明确取第 0 列和第 1 列:plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)。写成 X_pca['PC1'] 或误用原始特征名,会直接报 KeyError 或 IndexError。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 别依赖
pd.DataFrame(X_pca)自动命名列,手动加列名更可控:pd.DataFrame(X_pca, columns=[f'PC{i+1}' for i in range(X_pca.shape[1])]) - 如果标签
y是字符串(如类别名),c=y会报错,得先映射为数字:from sklearn.preprocessing import LabelEncoder; y_num = LabelEncoder().fit_transform(y) - 用
plt.colorbar()配合c参数时,确保y是数值型,否则颜色条显示异常
PCA 不适合所有数据:离群值、稀疏矩阵、非线性结构一碰就失效
PCA 是线性、均方误差最优的正交投影,对三类情况完全无能为力:含强离群点的数据(拉偏协方差)、文本类稀疏 scipy.sparse 矩阵(sklearn.PCA 不支持)、本质呈流形结构(如环形、S 形)的数据(线性投影会把不同类压到一起)。
- 有离群值?先用
RobustScaler或删掉再 PCA,别指望 PCA 自带鲁棒性 - 稀疏数据(如 TF-IDF)?换
TruncatedSVD,接口几乎一样,但支持sparsity - 怀疑非线性结构?直接跳过 PCA,试
TSNE或UMAP,但注意它们不可逆、不支持transform新样本
真正麻烦的是:你不知道数据到底适不适合 PCA,直到画完图发现类别全糊在一起——这时候得回头检查原始变量相关性、画协方差热力图、甚至跑个 KernelPCA 对比,而不是硬调 n_components。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










