1. 前言

在硕士期间学习研究了数据降维相关的知识,阅读了一些相关文章,也断断续续在知乎上写了

一些数据降维的入门级文章,收获了一些小伙伴的赞同,并在 GitHub 上开源了一些特征抽取算

法的源代码,获得了的 1.1k+star。

因为在 GitHub 的代码中留下了邮箱,因此有许多小伙伴来询问我数据降维方法的使用,其中有

很大一部分并不是计算机专业的,也是刚刚接触机器学习这一领域。所遇到的问题都类似这

种:

我有数据,我想降维,我怎么选择方法

希望小伙伴们在阅读完本文之后,将学会如何根据自己的数据和目的,快速地选择简单基本的

特征降维算法构建一个 baseline 的模型。

2. 数据降维是什么

顾名思义,数据降维就是通过特征选择或者特征变换操作将数据从原始的D维空间投影到新的

K维空间。数据降维方法主要分为特征选择和特征抽取 (特征降维) 两类。

2.1 特征选择

特征选择方法是在所有的特征中通过子集搜索算法寻找和模型最相关的特征子集的过程,简单

的说就是在所有特征中选择和目标最相关的一些特征,丢弃掉一些不太重要的特征。

特征选择方法又分为三个类型:

  • 过滤式

过滤式特征选择方法根据特征的统计学特性选择特征。对于有标签的数据,我们可以计算标签

和特征的互信息、相关系数等值,作为特征的得分,然后选择得分比较高的特征。对于没有标

签的数据,也可以选择计算特征的方差等值,通常方差较小的特征是无用特征的概率更大一

些。经过上述操作,我们就可以简单快速的选择更有用的特征,实现特征降维。

优点:只需要对特征进行常数级别的遍历,效率高;得到的特征子集使用范围广,后续各种模

型都可以使用这个特征子集。

缺点:特征子集具有冗余性(可以想想为什么,答案在文末);得到的特征子集通常不是最优的。

常用算法:ReliefF、基于互信息的特征选择、基于相关系数的特征选择、基于 Fisher-score 的特征选择

  • 包裹式

包裹式特征选择方法通过训练机器学习模型来选择特征。例如 SVM-RFE 方法,需要多次调用

SVM 方法,每次选择表现最好的特征。

优点:得到的特征子集准确率高;

缺点:需要多次调用模型,很耗时;得到的特征子集只适用于当前的模型(其他模型使用这个

特征子集效果不一定会好)。

常用算法:SVM-RFE

  • 嵌入式

在训练机器学习模型的同时选择了特征,例如逻辑回归、LASSO 模型。嵌入式特征选择方法的

特点就是在训练好模型的同时,模型会给不同特征不同的权重,使用这个权重来衡量特征的重

要性。

优点:耗时适中,同时有较好的准确率。

缺点:容易被噪声特征影响。

常用算法:逻辑回归、Lasso

2.2 特征抽取

特征抽取也被称为特征降维,用的最广泛也最常见的一种特征抽取方法就是 PCA。特征抽取根

据变换的方式分为线性和非线性两种。

数据降维 - 图1

一些常见的特征抽取方法

  • 线性降维

线性降维就是通过某种线性变换,将数据从高维空间映射到低维空间。

举一个简单的例子:比如你在经营一个水果摊子 “晴子水果”,好多来你这买水果的顾客都很特

别,每次都会买 (3 个苹果 2 个梨) 的组合。此时你每次记账都要记:【苹果:3,梨:2】。久而

久之,你决定把 3 个苹果 2 个梨组合到一起,称为一个 “晴”,之后记账的时候就可以简单记下

【晴:1】。

上述例子有这样的关系:晴1 = 苹果1/3 + 梨*1/2,1/3 和 1/2 就是苹果和梨所占的权重。线性降

维就可以理解为寻找高维空间向低维空间映射时每个维度所占的权重,例如 PCA 就是寻找在低

维空间中数据点的方差尽可能的大,协方差为 0 时,不同维度所所占的权重。

  • 非线性降维

非线性降维指的是是从高维空间向低维空间的转化是非线性的,看下面经典的三维瑞士卷:

数据降维 - 图2

3 维瑞士卷数据和利用 LE 算法得到的二维数据

瑞士卷可以看作是二维数据折叠、弯曲之后展现在三维空间,其本身还是一个二维数据。一种

常见的非线性降维思想是认为高维数据在局部上是线性的,我们只需要保证局部线性,就可以

将数据从三维转换到二维。以瑞士卷为例,我们可以把瑞士卷看作是很多小块的二维平面在三

维空间拼接而成,只要保证这些小的二维平面,就可以将数据从三维空间转化到二维空间。

2.3 如何选择

介绍了常见的特征降维方法,在不同的场景下我们应该使用什么样的特征降维方法呢,如下几

点是你需要考虑的:

  • 特征数目

当数目特征较多的时候,应该首先选择过滤式特征选择方法,快速减少数据量,可以有效防止

过拟合现象,同时加快后续模型训练的速度。当数目特征较少时,可以使用特征抽取方法或者

包裹式特征选择方法,此时需要你对方法和数据的特点都有一定的了解,才能选择合适的方法。

  • 特征有效性

如果可能存在和目标无关的特征,可以考虑使用特征选择方法,去除一些无用特征。如果特征

都和目标有一定的关系,可以考虑使用特征抽取方法对特征进行变化,在尽可能保留信息的情

况下降低特征数目。

  • 目的

如果你的目的是选择和目标最相关的特征,那么特征抽取方法明显是不合适的,因为其会将原

始特征转化为新的特征;如果你关心准确率等指标,那么请随意使用特征抽取方法。同时特征

选择方法的可解释性也要略高于特征抽取方法。

3. 数据降维能干什么

数据降维可以做什么,在选择数据降维方法之前一定要考虑数据降维能否解决你的问题,下面是数据降维能解决的几个问题。

3.1 提高准确率

数据降维算法可以去除无效特征,提高模型的准确率,同时缓解模型的过拟合现象。

3.2 减少数据量

减少特征的数目,可以提高后续的处理速度和所需要的储存空间。

3.3 可视化

某些数据降维算法可以很好的将高维数据在二维或者三维空间进行展示,直观有效的像别人展

示你的结果,非线性的特征抽取方法常常用于数据可视化,其中 T-SNE 是一个表现很好的可视

化算法。

4、如何选择合适的数据降维方法

当你有一份数据需要降维时,该如何选择特征降维算法。

4.1 目的

明确你的目的,是为了提高模型的准确率,还是为了选择重要的特征,抑或是对数据进行可视

化,不同的目的需要选择不同的数据降维算法。

举一些典型的例子:

  • 我想要对一份数据进行降维,从而提高模型的准确率

此时你需要考虑你选择的特征降维算法是否具有样本外降维的能力。也就是当你使用训练了降

维算法之后,是否可以得到一个转移函数或者矩阵F(X),当出现了一个或一批新的样本点,通

F(x)可以将这些样本点进行降维。大部分非线性特征抽取方法都不具备样本外降维的能力,

一种解决方法是将原始数据作为输入,降维后的数据作为输出,训练一个模型,利用这个模型

对数据进行降维。

  • 我需要选择重要的特征

也许你分析数据是为了找到和目的最有关的特征,从而进行下一步工作。此时你的选择就只能

局限在特征选择算法中,此时你需要考虑的是如何组合不同类型的特征选择方法,找到更优的

特征子集。

  • 我需要展示我的数据

此时你的重点就更应该放在可视化算法上,这里我推荐你使用 T-SNE 算法或者其衍生算法,它

在数据可视化领域具有十分好的表现。

4.2 数据的特点

数据的特点是你选择数据降维算法不得不考虑的一点,只有选择适合数据的数据降维方法,才

会有更好的结果。主要遵循能更有效的利用数据这个准则。

  • 数据是有标签的:尽可能的选择有监督的数据降维算法。
  • 数据是二维的:选择可以利用二维结构的数据降维算法。
  • 数据中有无效特征:使用特征选择方法。

根据经验来说,通常使用过滤式特征选择方法 + PCA 算法可以在大部分数据上取得还不错的效

果,同时实现起来也较为简单,如果没有什么想法,可以尝试使用这种组合。如果对数据和方

法有一定的了解,还是应该选择更合适的方法。

5、后记

数据降维是数据预处理手段的一种,当你尝试了几种数据降维方法效果却依旧不尽人意的时

候,也可以考虑使用其他数据预处理手段。

常用机器学习库 sklearn 手册:

https://scikit-learn.org/

11 种特征抽取算法源代码:

https://github.com/heucoder/dimensionality_reduction_alo_codes
https://zhuanlan.zhihu.com/p/237718243