PCA 是无监督数据降维方式,目的是将一个高维数据集转换为一个低维数据集。如今我们的数据集往往有成百上千维的特征,但并不是所有的特征都很重要,通过降维,去除那些不重要的特征。数据维度的降低了,同时计算机的运算效率也得到了提升。在人工智能技术刚起步的时候,人们关注的焦点在于算法的准确性,通过不断优化算法中的计算参数,来提高运算结果的准确率。今天,随着存储与通信技术的发展,数据规模变得空前的庞大,所以运算效率变成了我们不得不考虑的问题。
假如我们有一份医患数据集,该数据集有许多患者特征,如:年龄、性别、身高、体重、职业、家庭住址、联系方式、身份证号、银行卡号、血压、血糖、心率、视力等一些列特征。这份数据集涉及到了患者的诸多隐私,是不能随便向外公开的。传统的方法是对该数据集进行匿名化处理,如将患者姓名用一串数字表示。但是在今天,通过多方面的数据匹配,仍然可以匹配出具体的患者。这时候数据降维技术就可以派上用场了,假设在降维之前,我们每一位患者有 20 个特征,我们的目标是把数据降到两维。这里降维不是去掉其中 18 个特征,保留剩下的两个特征,而是通过对 20 个特征进行压缩,将数据压缩成 2 维。降维前这 20 个特征,每一个都有其具体的实际含义,降维后的这两个特征是不可解释的,此时我们任何人都看不出来它的实际含义。如果我们要公开一些涉及到个人信息安全的数据集,那么在公开之前,就必须对数据集做处理。
之前我们讨论过 PCA 降维,整个过程我们采用的是 Python 的 Numpy 库(线性代数中的矩阵计算)来进行的,整个过程如下:
- 数据的标准化处理 - 去均值
- 计算协方差矩阵
- 计算特征向量与特征值
- 根据特征值的大小,选择前 k 个特征向量组成一个新的特征矩阵
- 原始数据与新的特征矩阵相乘
机器学习 sklearn 库直接为我们提供了 PCA 模块,我们可直接调用该模块对原始数据进行处理,更加简单方便。下面我们对 PCA 算法进行一个详细的说明。
PCA 的 API 文档
1 | sklearn.decomposition.PCA(n_components=None, |
PCA 算法中的参数说明,这里对官方的英文文档做一个翻译:
- n_components:要保留的成分数量,其值类型可以设为整型,浮点型,字符串。如果不指定该值,n_components == min(n_samples, n_features);如果 n_components == ‘mle’,并且 svd_solver == ‘full’,则使用 Minka’s MLE 方法估计维度。当 0 < n_components < 1 时,并且 svd_solver == ‘full’时,方差值必须大于 n_components,如果 n_components == ‘arpack’,则 n_components 必须严格的等于特征与样本数之间的最小值。
- copy:默认为 True 值
- whiten: 默认为 False
- svd_solver:字符型数值,默认为 auto,其余可选值有:full,arpack,randomized。算法根据数据的规模以及 n_components 来自动选择合适的参数。
PCA 的算法属性
- components_:特征变换空间(特征矩阵),根据我们指定的 n_components = k 的值,选择方差最大的 k 个值所对应的的特征向量组成的特征矩阵。
- explainedvariance:n_components 所对应的的方差。
- explained_varianceratio:不同特征方差的占比。
- singularvalues : 特征值,与前面的特征向量 conponents_是一一对应的。
样例的演示
我们使用 sklearn 自带的数据集 boston(波士顿地区房价数据集),该数据集有 506 个样本,13 个特征,像房屋面积,区位,卧室数量等等以及价格(标签值)。pca 是一种无监督降维算法,所以我们不使用价格数据。下面是 pca 的代码实现过程:
1 | from sklearn.decomposition import PCA |
图形化 PCA 降维前后的数据对比
我们用 sklearn 中 iris 花数据集来举例,该数据集有四个特征,花萼长度、花萼宽度、花瓣长度、花瓣宽度,下面是画图过程的代码实现。
1 | import matplotlib.pyplot as plt |
降维前,我们选取了 iris 数据集中的两个特征 sepal length(花萼长度)和 sepal width(花萼宽度)来绘制数据分布,由图可以看出,数据集中有三种花,但是三者相互混杂,难以区分清楚。
iris 数据集本有 4 个特征,这时我们采用 pca 算法,将 4 维数据变化为 3 维。从图中的结果可以看出,经过变换后,三种类别区分的更加清楚了。
PCA 降维小结
- 实现过程有两种:Python 的 Numpy 库;SKlearn 的 PCA 模块,两者的计算结果是相同的。
- 数据降维的结果不一定都是好的,所以在解决实际问题,要同时计算降维前与降维后的结果,进行比较。
- 降维后的数据是不可解释的,但不影响最终的计算结果。