PCA降维这事,说起来简单,但实际用起来,坑还真不少。先说几个核心判断:你得先理解PCA的“脾气”,知道它什么时候该“fit”,什么时候该“transform”;主成分个数选多少,不能光看心情;画图的时候,坐标轴传对了没?还有,数据本身合不合适,心里得有个数。下面咱们把这些关键点掰开揉碎了说。

Python降维算法怎么用_PCA主成分分析与数据可视化实践

PCA 降维后数据形状不对,fit_transformtransform 混用导致报错

最让人头疼的坑,就是训练和预测阶段把fit_transformtransform搞混了。比如,训练时用fit_transform跑了一遍,结果新数据来了,又顺手调了个fit_transform,系统立马就给你看脸色:ValueError: X has 5 features, but PCA is expecting 10。这其实是个原则性问题。PCA的逻辑是,先通过fit(或者fit_transform)从训练数据里“学习”出一套主成分方向,然后,之后所有新数据,都只能老老实实地用这套方向去transform,不能重新“学习”。

选多少个主成分?n_components 设成整数还是小数很关键

那么,到底选多少个主成分才合适?n_components这个参数,直接决定了你保留了多少信息,以及后续模型的效果。设成整数,比如5,意思就是固定保留前5个主成分;设成0到1之间的小数,比如0.95,那就灵活多了——它会自动帮你保留能解释95%方差的最少成分数量。在原始特征维度高、相关性又不明确的时候,用小数是更稳妥的做法。

画散点图看降维效果,plt.scatter 坐标传错列名就白忙活

这点看起来简单,但出错率极高。PCA跑出来的结果是一个numpy.ndarray,没有列名。你想画前两个主成分的散点图,必须明确地取第0列和第1列:plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)。如果写成X_pca['PC1'],或者误用了原始特征的名字,那系统就会毫不客气地给你报KeyErrorIndexError

PCA 不适合所有数据:离群值、稀疏矩阵、非线性结构一碰就失效

话说回来,PCA确实不是万能药。它本质上是一个线性、基于均方误差最优的正交投影,碰到三类数据,基本就歇菜了:一是含有强离群点的数据,它们会严重拉偏协方差;二是文本类稀疏矩阵(比如scipy.sparse),sklearn.PCA 根本不支持;三是本质呈流形结构的数据,比如环形、S形,线性投影会把原本不同类别的数据点压到一起,导致分类完全失败。

真正麻烦的是,你往往很难一开始就判断数据到底适不适合PCA。直到你画完图,发现所有类别都糊在一起,这时候才回过头去检查原始变量的相关性,画协方差热力图,甚至跑个 KernelPCA 做个对比——而不是硬着头皮调 n_components 这个参数。

本文转载于:https://www.php.cn/faq/2332306.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。