15 降维
15.1 为什么需要降维?
(1)多余的特征会影响或误导学习器
(2)更多特征意味着更多参数需要调整,过拟合风险也越大
(3)数据的维度可能只是虚高,真实维度可能比较小
(4)维度越少意味着训练越快,更多东西可以尝试,能够得到更好的结果
(5)如果我们想要可视化数据,就必须限制在两个或三个维度上
因此,我们需要通过降维把无关或冗余的特征删掉。
降维的方法主要有:
低方差滤波:方差很小,包含的信息量很少;
高相关滤波:比如两个特征相关性较大,一个特征基本上可以替代另一个特征,就可以只保留一个;
随机森林:可以返回特征的重要性;
反向特征消除:把数据放到模型里面训练,剃掉一个特征来看看,模型的改变会不会很大;
前向特征选择:选一个最重要的特征放到模型里面,然后加一个重要的特征,观察模型改变;
15.2 维度诅咒
当训练实例拥有几千个甚至上百万个特征时,不仅导致训练非常缓慢,也更加难找到好的解决方案,这个问题就是维度诅咒。
在现实中,我们一般可以大量减少特征的数量,其一是有些特征对于分类任务来说是无足轻重的,比如,MNIST图像中边框的白色区域像素位,另外两个相邻像素通常是高度相关的,如果将它们合成为一个像素,也不会丢失太多的信息。
两种主要的数据降维方法:投影,流形学习;
三种降维技术:PCA,Kernal PCA ,LLE。
高纬度数据集很大可能是非常稀疏的:大多数训练实例可能彼此之间相聚较远。训练集的维度越高,过度拟合的风险就越大。理论上来说,通过增大训练集,使训练实例达到足够的密度,是可以解开维度的诅咒的。但是,实践中,要达到给定密度所需要的训练实例数量随着维度增加呈指数式上升。
15.2 数据降维的主要方法
15.2.1 投影
实际中,训练实例在所有维度上并不是均匀分布的,许多特征几乎是不变的,有些特征是高度相关的。因此,高维空间的所有训练实例实际上(或近似)受一个低得多的低维子空间的影响。
在许多情况下,子空间可能会弯曲或转动。
15.2.1 流形学习
d维流形学习就是n(其中,d<n)维空间中的一部分,局部类似于一个d维超平面。
15.3 降维算法—PCA
主成分分析法,是一种非监督的机器学习算法,主要用于数据的降维。通过降维,可以发现更便于人类理解的特征,其他也可以用于:可视化,去噪。
PCA是通过抛弃携带信息量较少的纬度,保留主要的特征信息来对数据进行降维处理,思路上是使用少数几个有代表性、互不相关特征来代替原先的大量的、存在一定相关性的特征,从而加速机器学习进程。白化的目的是去掉数据之间的相关联度和令方差归一化。数据预处理方式(去均值、归一化、PCA降维)
15.3.1 什么是PCA
对于一个有两个特征的数据集,如果我们用x轴表示特征1,y轴表示特征2,那么结果如下:
如果降维,那么二维可以降到一维,那么数据要么是在x轴表示,要么是在y轴表示。但是会使得降维后的数据间隔变动很大,如果想保持数据之间的间隔变化最下,对于上面的数据,我们取一个斜轴,然后将其映射,这时间隔就会较小。如下图所示:
15.3.2 保留差异性
将数据集投影到低维超平面之前,需要选择正确的超平面。选择保留最大差异性的轴看起来比较合理,因为它丢失的信息更少。
15.3.3 主成分
主成分分析可以在训练集中识别出哪条轴对差异性的贡献度最高。
轴的数量与数据集维度数量相同。定义第i条轴的单位向量就叫作第i个主成分(PC)。
主成分的方向是不稳定的:如果稍微打乱数据集,然后重新运行PCA,部分新的主成分可能指向跟原来的主成分相反的方向。但是,通常还是在同一条轴上。在某些情况下,两条主成分可能会旋转甚至互换,但是它们定义的平面还是不变。
1、如何找到主成分?
有一种标准矩阵分解技术,叫作奇异值分解(SVD)。它可以将训练集矩阵X分解成三个矩阵的点积 ,其中 包含我们想要的所有主成分。
PCA假设数据围绕原点集中,所以不要忘记先将数据集中。(即,均值归0)
【如何找到主成分(这个让样本间间距最大的轴)?】<—【如何定义样本间间距?】<—使用方差(Variance):在数理统计中,主要用于描述数据整体疏密的量。方差越大,代表数据之间越稀疏,方差越小,代表数据之间越紧密。
【解决方法】:找到一个轴,使得样本空间的所有点映射到这个轴后,方差最大。
第一步:将样例的均值归为0(demean);
移动坐标轴。上面的公式就变成下面的了:
2、低维度投影
在求出主成分之后,数据还没有实现降维,此时只是找出了训练集中所有的主成分,使用PCA降维,其实就是更换了新的坐标系。所以找出的主成分就是新的坐标系。我们将数据集投影到由前d个主成分定义的超平面上,从而将数据集的维度降到d维。
要将训练集投影到超平面上,简单地计算训练集矩阵X
和矩阵Wd
的点积即可,Wd
是包含前d个主成分的矩阵。
15.4 梯度上升法求解PCA
目标:求w,使得 最大。
1、每次求一个单位方向;
2、不能用0向量初始化;
3、不能使用StandardScaler标准化数据。(因为我们将数据映射到轴上本身就是要使方差最大,但是我们标准化之后,方差就为1了,方差的最大值就不存在了,在标准化的过程中将方差打掉了)
15.5 求数据的前n个主成分
数据进行改变,将数据在第一主成分上的分量去掉,在新的数据上求第一主成分。
15.6 scikit-learn中的PCA
导入:from sklearn.decomposition import PCA
pca.explained_variance_ration_
:解释的方差比例;
方差解释率:
获取每个主成分的方差解释率,它表示每个主成分对整个数据集的方差的贡献度。
选择正确数量的维度:
1)将靠前的主成分方差解释率依次相加,直到得到足够大比例的方差。
2)将解释方差绘制成关于维度数量的函数。
PCA压缩:
在PCA投影上运行投影的逆变换,也可以将缩小的数据集解压缩回与原始数据集同样维度的数据集。
原始数据和重建数据(压缩之后解压缩)之间的均方距离,被称为重建误差。
PCA逆转换,回到原始维度:
15.7 增量PCA
前面关于主成分分析法的实现,需要将整个训练集都进入内存,才能运行SVD算法。
增量主成分分析(IPCA)算法:可以将训练集分成一个个小批量,一次给IPCA算法喂一个。
15.8 在NumPy中实现PCA
将数据转换成前N个主成分的步骤大致如下:
1)去除平均值
2)计算协方差矩阵
3)计算协方差矩阵的特征值和特征向量
4)将特征值从大到小排序
5)保留最上面的N个特征向量
6)将数据转换到上述N个特征向量构建的新空间中