在使用PCA降维时,有哪些坑?

  统计/机器学习 监督式学习 无监督学习 数据降维 开放问题    浏览次数:11048        分享
12

我有一个分类问题,列数很多,我试了下PCA降维,然后再训练分类器,可是结果反而差了不少。

不知道有没有人遇到过类似的情况,或者是我不小心踩进了PCA的坑?

大神们可以分享下PCA的坑吗?或者成功使用PCA的经验吗?


 

TheTheThe   2017-09-22 14:41



   6个回答 
18

除了各位说的,我再补充一些我所认为的坑


  • PCA依赖于线性假设。

            我们知道PCA本质上就是SVD,所以PCA不过是利用线性投影进行降维。但是数据的内在结构未必是简单的线性关系。


  • PCA是正交的。

            正如第一点所说,PCA是正交的投影,可是未必正交的就是最好的。想象一下,姚明和郭敬明(两个三维物体),我们用灯去照他们的影子,当灯光从两人正上方10米向下照的时候,两个人影子都是一坨圆;如果我们从侧面照他们,投影出来的两个影子,可能宽度差不多,长度却差不少,这样的影子(三维降到二维)就含有更多信息。


  • PCA让方差尽量大。

            PCA本质上就是抓住主体,放过细枝末节。但有时候细枝末节往往是很重要的。五个韩国姑娘,其中一个姑娘鼻子上有痣,于是你一眼就认出了。你对她们的照片做PCA,之后发现,大家的脸型五官都没变,但是那个痣却找不到了,那你还能认出那个姑娘吗?你的算法还能认出那个姑娘吗?


  • PCA的可解释性

             如果PCA之后需要使用线性模型,那么这个线性模型大概率也是不可解释的。因为PCA本身是特征重组压缩,原本的变量的意义会消失。

SofaSofa数据科学社区DS面试题库 DS面经

木子周   2017-10-11 09:50

PCA是个差强人意的照妖镜 - batmanX   2017-10-11 10:55
PCA对于数据的scale也是很敏感的,所以通常会先做标准化;另外如果有outlier的话,PCA的效果也要大打折扣。 - 神算子   2022-05-09 23:52
9

一定要记得先做标准化。参考这个


SofaSofa数据科学社区DS面试题库 DS面经

abuu   2017-09-24 13:14

6

我也说个我的。我之前是把training set的特征和test set的特征和一起做了PCA降维。

其实这是大错特错的,因为在PCA中用test set的特征,这属于信息泄露。

正确的方法是在training set上fit_transform,在test set上transform。



SofaSofa数据科学社区DS面试题库 DS面经

道画师   2017-09-26 01:58

5

降维不能降太多,不然丢失了太多信息,反而不利于预测

SofaSofa数据科学社区DS面试题库 DS面经

雷猴   2017-09-23 09:48

3

PCA降为前需要把相关性高的那些列去掉,不然会影响到PCA的效果。


SofaSofa数据科学社区DS面试题库 DS面经

清风   2017-09-27 09:43

2

说明你的样本量不够大。

为什么你要PCA降维? 因为你的数据样本大到上千万行几十列,必须用hadoop进行算法计算,而你只有一台1万的台式机,你需要做一定的数据信息舍弃,放弃精准度,得到一个95%或者90%近似正确的结果。

PCA降维的核心理念是,抓住核心部分,放弃一些有影响力但是却不那么重要的列,以此减少算法的计算复杂度。

如果你PCA降维后反而效果更差了,说明你的样本量(行数)不够大,放弃的那些列对结果有“较大”的影响。

所以,别人扛着三百斤的大石头(大数据),为了方便,造了一辆马车(PCA降维)。不代表,你扛着三斤的石头(你的数据集),也需要一辆马车(PCA降维)。在现实的情况中,如果BAT是三百斤的大石头,可能你扛的只是0.00003斤的石头,放口袋里就可以了,不需要马车。

每个数据集都是不一样的烟火,抛开了数据集属性谈算法,都是耍流氓。

SofaSofa数据科学社区DS面试题库 DS面经

天晴   2017-12-25 18:04



  相关讨论

tsne被忽视?tsne有什么缺点?

为什么PCA被称作非监督式学习?

kNN算法有哪些缺点?

主成分分析法(PCA)算是黑盒算法吗?

PCA算法是一种保距算法吗?

PCA降维中的特征值和特征向量

一个关于PCA与eigenvector的问题

决策树有哪些缺点?

用pca对数据集降维时为什么一定要训练集和测试集?

Truncated SVD和PCA有什么区别吗?

  随便看看

返回DataFrame或者array的行数

python直方图y轴显示占比,而不是绝对数值

pandas把一列日期转换为星期

怎么在matplotlib.pyplot的plot上加上文字?

python里的<<或者>>符号是什么意思?