数据降维
针对每一张表格,维度是指样本的数量 (行数) 或者特征的数量 (列数)。一般如果没有特殊说明,维度说的是特征的数量,一维是指只有一个特征,二维是指有两个特征。
对于图像,维度就是图像中特征向量的个数。一维就是一条直线,二维就是平面坐标系,N 维就是 N 维空间。
降维算法中的"降维"是指减少特征矩阵的维度,这样可以提高计算速度,还有利于进行可视化。
一般来说,使用 PCA 降维的效果要比特征选择好很多,可以使用很少的新特征来承载绝大部分有效信息,可以参考实例 手写数字的降维。
主成分分析 PCA
在进行特征选择时,有种方法是根据数据的方差进行过滤。如果一个特征的方差很小,则意味着这个特征上有大量的值是相同的,那么这个特征对标签而言就没有区分度,这种特征就不带有多少有效信息。相反,如果一个特征的方差很大,则说明这个特征上带有大量的信息。
在降维算法中,PCA 使用的信息衡量指标就是样本方差,又称 "可解释性方差",方差越大,特征所携带的信息量就越多。
其中: 就是该特征样本方差的无偏估计量。
思考:为什么分母是 而不是 ?
通过 PCA 进行降维的步骤:
- 输入原特征矩阵,结构为 (M, N),M 为样本数,N 为特征数;
- 决定降维后的特征数量 K;
- 通过某种空间变换,找出 N 个新的特征向量,以及所构成的新的 N 维向量空间,并计算出两者之间的变换关系;
- 找出特征矩阵在新的特征空间中的坐标;
- 只选取方差最大的 K 个方向,删除没有被选中的。这就成功地将特征矩阵由 N 维降为 K 维。
实际上,找出一个新的 N 维特征空间,让数据能够被压缩在少数特征上,并且总信息量不损失太多的技术就是空间坐标变换,是通过矩阵分解来完成。PCA 和 SVD 是两种不同的矩阵分解方法,用于衡量信息量的方法不同而已。
降维之后,PCA 找到的每个特征向量就叫 "主成分",被丢弃的特征向量被认为包含的信息量很少,被视为方差。
思考:特征选择和降维都是特征工程的一部分,有什么不同?
特征选择是从已知的特征中选取携带信息最多的特征,选取之后的特征仍具有可解释性,我们能很明确地知道该特征代表什么含义。
降维是将已有的特征进行压缩,降维之后的特征是将原有的特征进行线性或非线性组合而成的,具有不可解释性。降维之后的新特征虽然携带大量的信息,但是我们却无法明确知道其含义。因此,降维算法更像是特征创造的一种。
由此可见,降维一般不适用于探索特征和标签之间关系的模型 (如线性回归),因为无法解释新特征和标签之间的关系;所以在线性回归模型中,应使用特征选择。
class
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None,)
其中:n_componets
: 表示降维之后的维度,除了输入整数之外,还可以是 mle
(最大似然估计),这时会使用 "最大似然估计" 自动选择 n_componets
的值。
选择最合适的 n_componets
:
当参数 n_componets
不填写任何信息时,默认为 min(X.shape)
个特征,相当于没有进行降维,因为一般来说,样本数都会大于特征数。但是我们却可以使用 pca.explained_variance_ratio_
这一属性来查看各个特征值所含信息量的占比,并以此绘制方差贡献率曲线,以此来选择最合适的 n_componets
。
使用 PCA 进行矩阵分解需要进行求解特征矩阵的协方差矩阵等一系列繁琐的矩阵运算,但是使用 SVD 分解矩阵却简便许多,不需要计算协方差矩阵,就可以直接求出新特征空间和降维后的特征矩阵。但另一方面, PCA 使用方差来衡量数据所携带的信息量,但是 SVD 的信息衡量指标 "奇异值" 相比于方差却满意理解。
因此,sklearn 将降维流程分成了两部分,一部分是求解新的特征空间 V,由 SVD 分解完成以大大降低矩阵分解的难度;另一部分是求解从原有的特征空间到新的特征空间的变换矩阵和新特征矩阵,这由 PCA 来完成,这就实现了用 SVD 便于计算的性质求解变换矩阵,却依然使用方差作为信息量的评估指标。具体流程如下:
所以 PCA 类的初始化定义中有 SVD 分解器的参数 svd_solver
,使用属性 components_
便可查看坐标变换矩阵 .
重要参数 svd_solver
和 random_state
:
svd_solver
: 在降维过程中,用于决定矩阵分解的方式,有四种模式可选:{'auto', 'full', 'arpack', 'randomized'}
,默认为 auto
。
-
auto
:基于X.shape
和n_components
的默认策略来选择分解器,如果特征矩阵的尺寸大于 500×500,并且要提取的特征数 K 小于数据最小维度min(X.shape)
的 80%,就使用效率比较高的randomized
方式;否则,就进行完整的 SVD,然后根据要提取的特征数 K 进行截断。 -
full
:调用scipy.linalg.svd
中的标准的 LAPACK 分解器来生成精确完整的 SVD 矩阵,这种模式适合于数据量不是特别大,计算时间充足的情况,生成的精确完整的 SVD 矩阵的结构为:。 -
randomized
:在完成的精确的SVD分解中引入随机性,分解器会先生成多个随机向量,然后一一监测这些随机向量中是否有符合需要的,如果符合就保留这个特征向量。这种模式比full
模式要快很多,并且能够保证运行运行效果,很适合特征矩阵很大,计算量庞大的情况。 -
arpack
:从scipy.spare.linalg.svds
调用 ARPACK 分解器来进行奇异值的截断分解 (SVD truncated),分解时就使用要提取的特征维度 K,并且会结合randomized
模式下的随机性,这样可以加快运算速度,很适合特征矩阵很大的情况,但是一般只适用于稀疏矩阵。截断后的SVD分解出的结构为:。
参数 whiten:
控制数据是否进行"白化"处理,将 V 中的特征向量都转换为单位向量,且方向相互垂直,即点积为 0.
属性 components_
:
属性 components_
会返回新特征向量,并由此可以计算出新的特征矩阵 X_dr. 在矩阵分解时,在原有的特征基础上,找出能够让信息尽量聚集的新特征向量,这些新特征向量组成的新特征空间其实就是 V(k, n) 。当 V(k, n) 是数字时,几乎无法判断 V(k, n) 和原有特征究竟有什么关系;但是如果原有特征是图像, V(k, n) 这个空间向量就可以进行可视化. 这时对两张图进行对比,就可以看出新特征空间究竟从原始数据里提取了什么重要信息。具体应用可以参考 人脸识别中的components_
属性 explained_variance_ratio_
:
会返回一个列表,其中的元素是新的特征所含信息量占总信息量的百分比,并且按从大到小进行排列。
网友评论