退一步海阔天空——机器学习降维

降维

许多机器学习问题涉及训练实例的几千甚至上百万个特征。这不仅导致训练非常缓慢,也让我们更加难以找到好的解决方案。我们一般可以大量减少特征的数量,将棘手的问题转化成容易解决的问题。比如处理图像时,其边框周围很多像素对我们的分类任务无足轻重,可以删去;两个像素通常相似度很高,我们可以将其合并(例如,取两个像素强度的平均值),这样也不会丢失太多信息。
除了加快训练,降维对于数据可视化也是非常有用的。如图,到了四维我们就很难想想了。若将维度降到两个(或三个),就可以在图形上绘制出高维训练集,这样可以更直观的看他们的关系并选择训练方式。
点、线、面、立方体和超立方体(从零维到四维超立方体)
事实证明,在高维空间中,许多事物的行为都迥然不同。例如,如果你在一个单位平面(1×1的正方形)内随机选择一个点,那么这个点离边界的距离小于0.001的概率只有约0.4%(也就是说,一个随机的点不大可能刚好位于某个维度的“极端”)。但是,在一个10000维的单位超立方体(1×1…×1立方体,一万个1)中,这个概率大于99.999999%。高维超立方体中大多数点都非常接近边界。趣味事实:只要你考虑足够多的维度,你所知道的每个人,至少 在某一个维度上,都可能算是个极端主义者(比如,他们在咖啡里放多少糖)。

数据降维的主要方法

投影

在大多数现实世界的问题里,训练实例在所有维度上并不是均匀分布的。许多特征几乎是不变的,也有许多特征是高度相关联的。因此,高维空间的所有训练实例实际上受一个低得多的低维子空间所影响。这听起来很抽象,所以我们来看一个例子。在图中,你可以看到一个由圆圈表示的3D数据集。并可以发现他们都靠近灰色平面,将其投到灰色平面后,数据变得好看多了。
在这里插入图片描述

流形学习

d维流形就是n维空间的一部分(其中,d<n),局部类似于一个d维超平面。如下图我们并不能找到一个平面很好的对该数据投影,但此图是一个2D流形,d=2,n=3:它局部类似于一个2D平面,但是在第三个维度上卷起。将其展开,决策边界则是一条简单的直线。
许多降维算法都依赖于流形假设,也称为流形假说,认为大多数现实世界的高维度数据集存在一个低维度的流形来重新表示。这个假设通 常是凭经验观察的。
但是,这个假设并不总是成立。例如,图8-6的底行,决策边界在x1=5处,在原始的3D空间中,这个边界看起来非常简单(一个垂直的平面),但是在展开的流形中,决策边界看起来反而更为复杂(四个独立线段的集合)。
在这里插入图片描述
简而言之,在训练模型之前降低训练集的维度,肯定可以加快训练速度,但这并不总是会导致更好或更简单的解决方案,它取决于数据集。

主成分分析(PCA)

主成分分析(PCA)是迄今为止最流行的降维算法。它先是识别
出最接近数据的超平面,然后将数据投影其上。

保留差异性

如图一个二维平面分别投影到三个一维平面,可以看出有很大差异。选择保留最大差异性的轴看起来比较合理,因为它可能比其他两种投影丢失的信息更少。要证明这一选择,还有一种方法,比较原始数据集与其轴上的投影之间的均方距离,使这个均方距离最小的轴是最合理的选择,也就是实线代表的轴。
在这里插入图片描述

主成分

主成分分析(PCA)可以在训练集中识别出哪条轴对差异性的贡献度最高。如果是在高维数据集中,PCA还会找到与多条线,轴的数量与数据集维度数量相同。
主成分的方向是不稳定的:如果你稍微打乱训练集,然后重 新运PCA,部分新的主成分可能指向跟原来的主成分相反的方向。 但是,它们通常还是在同一条轴上。在某些情况下,两条主成分可能 会旋转甚至互换,但是它们定义的平面还是不变。
所以怎么找到训练集的主成分呢?还好有一种标准矩阵分解技 术,叫作奇异值分解(SVD)。它可以将训练集矩阵X分解成三个矩 阵的点积U·∑· V T V^T ,,其中 V T V^T 正包含我们想要的所有主成分,如公式8-1 所示。
在这里插入图片描述
PCA假设数据集围绕原点集中。所以我们看到的Scikit-Learn的PCA类将会替你处理数据集中。但是,如果你是自己实现PCA,或者使用其他库时,不要忘记先将数据集中。

低维度投影

一旦确定了所有主成分,就可以将数据集投影到由前d个主成分定义的超平面上,从而将数据集的维度降到d维。这个超平面的选择,能确保投影保留尽可能多的差异性。例如,第二张图,3D数据集投影到由前两个主成分定义的2D平面上,就保留了原始数据集的大部分差异。因此,2D投影看起来非常像原始的3D数据集。

方差解释率

另一个非常有用的信息是每个主成分的方差解释率,它可以通过变量explained_variance_ratio_获得。它表示每个主成分轴对整个数据 集的方差的贡献度。例如,我们看图所示的3D数据集中前两个主 成分的方差解释率:

 >>print(pca.explained_variance_ratio_) 
 array([ 0.84248607, 0.14631839])

这告诉我们,数据集方差的84.2%由第一条轴贡献,14.6%来自 于第二条轴,剩下给第三条轴的还不到1.2%,所以有理由认为它可能 没有什么信息。

选择正确数量的维度

除了武断地选择要降至的维度数量,通常来说更好的办法是将靠前的主成分方差解释率依次相加,直到得到足够大比例的方差(例如 95%),这时的维度数量就是很好的选择。当然,除非你正在为了数 据可视化而降维——这种情况下,通常会直接降到二维或三维。

PCA压缩

显然,降维之后训练集占用的空间要小得多。例如,对MNIST数据集(主要用于数字识别)应用主成分分析,然后保留其方差的95%。你会发现,原来每个实例的784个特征变得只有150多个特征。所以这保留了绝大部分差异性的同时,数据集的大小变为不到原始的20%!这是一个合理的压缩比,你可以看看它如何极大提升分类算法(例如SVM分类器)的速度。
在PCA投影上运行投影的逆转换,也可以将缩小的数据集解压缩
回784维数据集。当然,你得到的并非原始的数据,因为投影时损失
了一部分信息(5%被丢弃的方差),但是它很大可能非常接近于原
始数据。可以看出图像质量有轻微损伤,但是数字基本完好无损在这里插入图片描述

增量PCA

前面关于主成分分析的种种实现,问题在于,它需要整个训练集 都进入内存,才能运行SVD算法。幸运的是,我们有增量主成分分(IPCA)算法:你可以将训练集分成一个个小批量,一次给IPCA算 法喂一个。对于大型训练集来说,这个方法很有用,并且还可以在线 应用PCA(也就是新实例产生时,算法开始运行)。

核主成分分析

核技巧是一种数学技巧,隐性地将实例映射到 非常高维的空间(称为特征空间),从而使支持向量机能够进行非线性分类和回归。事实证明,同样的技巧也可应用于PCA,使复杂的非线性投影降 维成为可能。这就是所谓的核主成分分析(kPCA)。
如图显示了使用不同核函数降到二维的瑞士卷,包括线性核函 数(相当于直接使用PCA类)、RBF核函数,以及sigmoid核函数 (Logistic)。
在这里插入图片描述

选择核函数和调整超参数

由于kPCA是一种无监督的学习算法,因此没有明显的性能指标来帮你选择最佳的核函数和超参数值。而降维通常是监督式学习任务(例如分类)的准备步骤,所以可以使用网格搜索,来找到使任务性能最佳的核和超参数。
还有一种完全不受监督方法,就是选择重建误差最低的核和超参数。但是这个重建不像线性PCA重建那样容易。我们来看看原因,图8-11显示了瑞士卷的原始3D数据集(左上),和应用RBF核的kPCA得到的二维数据集(右上)。因为核技巧,所以这在数学上等同于:通过特征映射函数 ,将训练集映射到无限维度的特征空间(右下),然后用线性PCA将转换后的训练集投影到2D平面。注意,如果我们对一个已经降维的实例进行线性PCA逆转换,重建的点将存在于特征空间,而不是原始空间中(例如,图中x表示的那个点)。而这里特征空间是无限维度的,所以我们无法计算出重建点,因此也无法计算出真实的重建误差。幸好,我们可以在原始空间中找到一个点,使其映射接近于重建点。这被称为重建原像。一旦有了这个原像,你就可以测量它到原始实例的平方距离。最后,便可以选择使这 个重建原像误差最小化的核和超参数。
在这里插入图片描述## 局部线性嵌入
局部线性嵌入是另一种非常强大的非线性降维(NLDR)技术。不像之前的算法依赖于投影,它是一种流形学习技术。简单来说,LLE首先测量每个算法如何与其最近的邻居(c.n.)线性相关,然后为训练集寻找一个能最大程度保留这些局部关系的低维表示(细节稍后解释)。这使得它特别擅长展开弯曲的流形,特别是没有太多噪声时。
在这里插入图片描述

其他降维技巧

  • 多维缩放(MDS)算法,保持实例之间的距离,降低维度.
  • 等度量映射(Isomap)算法,将每个实例与其最近的邻居连接起来,创建连接图形,然后保留实例之间的这个测地距离,降低维度。
  • t-分布随机近邻嵌入(t-SNE)算法在降低维度时,试图让相似的实例彼此靠近,不相似的实例彼此远离。它主要用于可视化,尤其是将高维空间中的实例集群可视化(例如,对MNIST图像进行二维可视化)。
  • 线性判别(LDA)实际上是一种分类算法,但是在训练过程中,它会学习类别之间最有区别的轴,而这个轴正好可以用来定义投影数据的超平面。这样做的好处在于投影上的类别之间会尽可能的分开,所以在运行其他分类算法——比如SVM分类器之前,LDA是一个不错的降维手段。
    在这里插入图片描述

练习

1.降低数据集维度的主要动机是什么?有什么主要弊端?

降维的主要动机是:

  • 为了加速后续的训练算法(在某些情况下,也可能为了消除噪声和冗余特征,使训练算法性能更好)
  • 为了将数据可视化,并从中获得洞察,了解最重要的特征
  • 为了节省空间(压缩)
    主要的弊端是:
  • 丢失部分信息,可能使后续训练算法的性能降低
  • 为机器学习流水线增添了些许复杂度
  • 转换后的特征往往难以解释

2.什么是维度的诅咒?

维度的诅咒是指许多在低维空间中不存在的问题,在高维空间 中发生。在机器学习领域,一个常见的现象是随机抽样的高维向量通 常非常稀疏,提升了过度拟合的风险,同时也使得在没有充足训练数据的情况下,要识别数据中的模式非常困难。

3.一旦数据集被降维,是否还有可能逆转?如果有,怎么做?如果没有,为什么?

一旦使用我们讨论的任意算法减少了数据集的维度,几乎不可 能再将操作完美地逆转,因为在降维过程中必然丢失了一部分信息。 虽然有一些算法(例如PCA)拥有简单的逆转换过程,可以重建出与 原始数据集相似的数据集,但是也有一些算法不能实现逆转(例如T- SNE)

4.PCA可以用来给高度非线性数据集降维么?

对大多数数据集来说,PCA可以用来进行显著降维,即便是高度非线性的数据集,因为它至少可以消除无用的维度。但是如果不存在无用的维度(例如瑞士卷),那么使用PCA降维将会损失太多信息。你希望的是将瑞士卷展开,而不是将其压扁。

5.假设你在一个1000维数据集上执行PCA,方差解释比设为95%。产生的结果数据集维度是多少?

这是个不好回答的问题,它取决于数据集。我们来看看两个极端的例子。首先,假设数据集是由几乎完全对齐的点组成的,在这种情况下,PCA可以将数据集降至一维,同时保留95%的差异性。现在,试想数据集由完全随机的点组成,分散在1000个维度上,在这种情况下,需要在1000个维度上保留95%的差异性。所以,这个问题的 答案是:取决于数据集,它可能是1到1000之间的任何数字。将解释方差绘制成关于维度数量的函数,可以对数据集的内在维度获得一个 粗略的概念。

6.常规PCA、增量PCA、随机PCA及核PCA各适用于何种情况?

常规PCA是默认选择,但是它仅适用于内存足够处理训练集的时候。增量PCA对于内存无法支持的大型数据集非常有用,但是它比常规PCA要来得慢一些,所以如果内存能够支持,还是应该使用常规 PCA。当你需要随时应用PCA来处理每次新增的实例时,增量PCA对 于在线任务同样有用。当你想大大降低维度数量,并且内存能够支持 数据集时,使用随机PCA非常有效,它比常规PCA快得多。最后对于 非线性数据集,使用核化PCA行之有效。

7.如何在你的数据集上评估降维算法的性能?

直观来说,如果降维算法能够消除许多维度并且不会丢失太多 信息,那么这就算一个好的降维算法。进行衡量的方法之一是应用逆 转换然后测量重建误差。然而并不是所有的降维算法都提供了逆转 换。还有另一种选择,如果你将降维当作一个预处理过程,用在其他 机器学习算法(比如随机森林分类器)之前,那么可以通过简单测量 第二个算法的性能来进行评估。如果降维过程没有损失太多信息,那么第二个算法的性能应该跟使用原始数据集一样好。

8.链接两个不同的降维算法有意义么?

链接两个不同的降维算法绝对是有意义的。常见的例子是使用PCA快速去除大量无用的维度,然后应用另一种更慢的降维算法,如LLE。这样两步走的策略产生的结果可能与仅使用LLE相同,但是时间要短得多。

由于本人是初学者,对很多算法参数还不太了解,所以借鉴摘抄的很多,并将其融合,在此就不一一点名出处了,希望理解。我没有写多少代码,主要是感觉写上会使篇幅太大,也没有写多推理在公式,(关键自己才大一,绝大部分都看不懂)就言简意赅写一些基本概念、原理、知识。想看详细代码这里有:

https://github.com/ageron/handson-ml/blob/master/08_dimensionality_reduction.ipynb

另,本文主要参考于《机器学习实战:基于Scikit-Learn和TensorFlow》这本书,如有需求(还有很多关于Python和机器学习资料),可关注并私信我,必一一送达。
毕竟新手,有错误之处还望赐教,还望支持,不喜勿喷,并希望找到写志同道合的朋友一起学习。嘿嘿

发布了5 篇原创文章 · 获赞 23 · 访问量 1202

猜你喜欢

转载自blog.csdn.net/weixin_45755332/article/details/105617463