主成分分析Principal component analysis(PCA)

在面对海量数据或大数据进行数据挖掘时,通常会面临“维度灾难”,原因是数据集的维度可以不断增加而无穷多,但计算机的处理能力和速度却不是无限的;另外,数据集的大量维度之间可能存在共线性的关系,这会直接导致学习模型的健壮性不够,甚至很多时候会失效。因此,我们需要一种可以降低维度数量并降低维度间共线性影响的方法——这就是降维的意义所在。

主成分分析是一种降维方法。主成分分析Principal component analysis(PCA)也称主分量分析,旨在利用降维的思想,把多维指标转化为少数几个综合维度,然后利用这些综合维度进行数据挖掘和学习,以代替原来利用所有维度进行挖掘学习的方法。

主成分分析的基本方法是按照一定的数学变换方法,把给定的一组相关变量(维度)通过线性变换转成另一组不相关的变量,这些新的变量按照方差依次递减的顺序排列。在数学变换中保持变量的总方差不变,使第一变量具有最大的方差,称为第一主成分,第二变量的方差次大,并且和第一变量不相关,称为第二主成分。依次类推,I个变量就有I个主成分。

到底主成分分析的结果是怎样的状态?下面简单举一个例子。

假设原始数据集中有10个维度分别是tenure、cardmon、lncardmon、cardten、lncardten、wiremon、lnwiremon、wireten、lnwireten、hourstv,现在用主成分分析进行降维,降维后的每个“因子”是:

  1. 方程式用于 主成分-1
  2.     0.006831 * tenure +
  3.     0.007453 * cardmon +
  4.     0.1861 * lncardmon +
  5.     0.0001897 * cardten +
  6.     0.1338 * lncardten +
  7.     0.007552 * wiremon +
  8.     0.3688 * lnwiremon +
  9.     0.0001155 * wireten +
  10.     0.132 * lnwireten +
  11.     0.00006106 * hourstv +
  12.     + -4.767
  13. 方程式用于 主成分-2
  14.     -0.005607 * tenure +
  15.     0.03288 * cardmon +
  16.     0.759 * lncardmon +
  17.     0.0002219 * cardten +
  18.     0.05385 * lncardten +
  19.     -0.01013 * wiremon +
  20.     -0.4433 * lnwiremon +
  21.     -0.0001222 * wireten +
  22.     -0.1354 * lnwireten +
  23.     0.008099 * hourstv +
  24.     + -0.272
  25. 方程式用于 主成分-3
  26.     -0.01809 * tenure +
  27.     0.0124 * cardmon +
  28.     0.2859 * lncardmon +
  29.     -0.0002123 * cardten +
  30.     -0.2252 * lncardten +
  31.     0.0287 * wiremon +
  32.     1.193 * lnwiremon +
  33.     0.00002565 * wireten +
  34.     -0.1644 * lnwireten +
  35.     0.03984 * hourstv +
  36.     + -4.076
  37. 方程式用于 主成分-4
  38.     0.004858 * tenure +
  39.     -0.00553 * cardmon +
  40.     -0.1352 * lncardmon +
  41.     0.00005099 * cardten +
  42.     0.03662 * lncardten +
  43.     -0.006129 * wiremon +
  44.     -0.2493 * lnwiremon +
  45.     0.00001144 * wireten +
  46.     0.04165 * lnwireten +
  47.     0.198 * hourstv +
  48.     + -2.994
  49. 方程式用于 主成分-5
  50.     -0.01763 * tenure +
  51.     -0.005433 * cardmon +
  52.     0.5251 * lncardmon +
  53.     -0.001116 * cardten +
  54.     0.7426 * lncardten +
  55.     -0.004448 * wiremon +
  56.     0.7988 * lnwiremon +
  57.     -0.0005994 * wireten +
  58.     0.6897 * lnwireten +
  59.     0.00946 * hourstv +
  60.     + -11.09


 

这就是主成分分析后提取的5个能代表原始10个维度的新“维度”。通过上述结果我们可以发现主成分(也就是新的“维度”)是一个线性方程,而且是多元一次的方程;其含义是无法被人类直接理解的,这意味着人类无法将特征提取的方法直接应用到主成分分析之上(在类似于特征提取或分类器的算法中,可以直接了解原始参与计算的每个维度的权重的高低)。但这没有关系,因为机器学习或数据挖掘不需要知道每个因子的具体含义,只需要知道用哪些因子,如何计算便能得到最终结果。

PCA可以对主成分分析的结果按重要性排序并根据用户需求只选择能代表大多数(甚至全部,如果你愿意)指标意义的成分,从而达到降维从而简化模型或是进行数据压缩的效果;另外,它是完全无参数限制的,这意味着无需人为设定参数,且先验经验都不需要,实用性和推广性非常强。但是,这个优点从另一个角度讲却是个缺点,因为它忽略了对具有先验经验的人群和应用场景的优化和应用,导致某些场景下缺少一定“高效果”的人工干预而导致无法达到预期效果。

下面应用一个案例,用Python的机器学习库SKlearn中的PCA来对数据进行降维。原始数据集中有4个维度,现在要通过PCA转换成2个维度。实现过程如下:

  1. #coding:utf-8   
  2.   
  3.   
  4. from sklearn import datasets   
  5. from sklearn.decomposition import PCA   
  6.   
  7. iris = datasets.load_iris()   
  8. X = iris.data   
  9. print ('first 10 raw samples:', X[:10])   
  10. pca = PCA(n_components=2)   
  11. X_r = pca.fit(X).transform(X)   
  12. print ('first 10 transformed samples:', X_r[:10])   
  13. print ('variance:',pca.explained_variance_ratio_)   


降维后的原始数据集中的4个维度被转化成两个维度,结果如下:

  1. ('first 10 raw samples:', array([[ 5.1,  3.5,  1.4,  0.2],   
  2.        [ 4.9,  3. ,  1.4,  0.2],   
  3.        [ 4.7,  3.2,  1.3,  0.2],   
  4.        [ 4.6,  3.1,  1.5,  0.2],   
  5.        [ 5. ,  3.6,  1.4,  0.2],   
  6.        [ 5.4,  3.9,  1.7,  0.4],   
  7.        [ 4.6,  3.4,  1.4,  0.3],   
  8.        [ 5. ,  3.4,  1.5,  0.2],   
  9.        [ 4.4,  2.9,  1.4,  0.2],   
  10.        [ 4.9,  3.1,  1.5,  0.1]]))   
  11. ('first 10 transformed samples:', array([[-2.68420713, -0.32660731],   
  12.        [-2.71539062,  0.16955685],   
  13.        [-2.88981954,  0.13734561],   
  14.        [-2.7464372 ,  0.31112432],   
  15.        [-2.72859298, -0.33392456],   
  16.        [-2.27989736, -0.74778271],   
  17.        [-2.82089068,  0.08210451],   
  18.        [-2.62648199, -0.17040535],   
  19.        [-2.88795857,  0.57079803],   
  20.        [-2.67384469,  0.1066917 ]]))   
  21. ('variance:', array([ 0.92461621,  0.05301557]))  


 

PCA应用的关键是找到能代表原始数据最大特征的几个主成分,因此上述代码中通过pca.explained_variance_ratio_来查看每个主成分能表达原始数据的方差,实际应用时可写一个循环来判定不同主成分数量下的方差之和,同时配合一个阀值来选择PCA中components的个数。例如可设定能代表原始数据集95%的方差的主成分就可以,那么当循环出来的主成分的方差之和大于95%就可以停止循环。然后进行接下来的数据处理工作。

 
PCA可配置的参数如下:

  1. class sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)  

应用场景:

  • 如本文开始所说的,PCA的应用是降维,用在所有大量数据集建模处理之前的降维过程,因此它是数据预处理过程的一步。

 

尾巴

从主观的理解上,主成分分析到底是什么?它其实是对数据在高维空间下的一个投影转换,通过一定的投影规则将原来从一个角度看到的多个维度映射成较少的维度。到底什么是映射,下面的图就可以很好地解释这个问题——正常角度看是两个半椭圆形分布的数据集,但经过旋转(映射)之后是两条线性分布数据集。

201105022056107476


====================【好书推荐,我为自己代言】====================

《Python数据分析与数据化运营》第二版上市啦!

50+数据流工作知识点
14个数据分析与挖掘主题
8个综合性运营分析案例
涵盖会员、商品、流量、内容4大主题
360°把脉运营问题并贴合数据场景落地


本书主要基于Python实现,其中主要用到的计算库是numpy、pandas和sklearn,其他相关库还包括:
  • 标准库:re、time、datetime、json、 base64、os、sys、cPickle、tarfile
  • Python调用R的rpy2
  • 统计分析:Statsmodels
  • 中文处理:结巴分词
  • 文本挖掘:Gensim
  • 数据挖掘和算法:XGboost、gplearn、TPOT
  • 爬虫和解析:requests、Beautiful Soup、xml
  • 图像处理:OpenCV和PIL/Pollow
  • 数据读取:xlrd、pymongo、pymysql
  • 数据预处理:imblearn
  • 展示美化类:Matplotlib、pyecharts、graphviz、prettytable、wordcloud、mpl_toolkits、pydotplus
如果你对以下内容感兴趣,那么本书将值得一看:
  • KMeans聚类的自动K均值的确立方法
  • 基于软方法的多分类模型组合评估模型的应用
  • 基于自动下探(下钻、细分)的应用
  • 基于增量学习的多项式贝叶斯分类
  • pipeline管道技术的应用
  • 基于超参数的自动参数值的优化方法
  • 特征自动选择
  • 文本分类、文本主题挖掘
  • 基于自动时间序列ARIMA的P、D、Q的调整
  • python决策树规则输出
  • 基于自定义图像的文本标签云
  • 非结构化数据,例如图像、音频、文本等处理
  • 对象持久化处理
  • 如何使用Python调用R实现数据挖掘
  • 自动化学习:增加了对于自动化数据挖掘与机器学习的理论、流程、知识和应用库介绍,并基于TPOT做自动化回归和分类学习案例演示
有关这本书的写作感受、详细内容介绍、附件(含数据和代)下载、关键知识和方法以及完整书稿目录,请访问《Python数据分析与数据化运营》第二版出版了!要购买此书,可以去京东当当天猫等查看。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>