在4.1节中我们已经初步介绍了特征工程的几种处理方式以及使用场景,本节我们将对几个常用处理方式进行详细介绍。
做特征工程的第一步,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。它关系到机器学习模型的上限,原则上是不能错过一个可能有用的特征,也不能滥用特征。通常来说,从两个方面考虑来选择特征:
·选择合适的特征:做特征工程最重要的是要考虑到实际问题,根据业务去寻找最适合解决问题的特征。
·寻找高级特征:除了从原始数据中提取特征,还可以根据实际需求拿一级特征合成高级特征,高级特征的优化能提高模型的性能。
特征选择的方法一般分为如下3类:
·过滤法(Filter):按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数来选择特征。简单地说,就是选择某一标准对现有的所有特征进行评分,设置某一“及格线”后,高于线的特征留下,低于线的特征剔除。
·包装法(Wrapper):包装法的解决思路没有过滤法直接,它会选择一个目标函数来一步步地筛选特征,最常用的包装法是通过递归的方式消除特征。递归消除特征法使用一个机器学习模型来进行多轮训练,每轮训练后,消除若干权值系数的对应的特征,再基于新的特征集进行下一轮训练。相比过滤法,它的结果更加科学,但计算量也更大。
·嵌入法(Embedded):是先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。与前两个方法相比较,嵌入法类似于过滤法,但是是通过训练来确定特征的优劣。而嵌入法和包装法的区别是,尽管二者都是用机器学习的方法来选择特征,但是嵌入法不是通过不停地筛掉特征来进行训练,而是使用特征全集。
图4-1是上述3种方法的流程图。
图4-1 特征选择的3种方法
在我们拿到已有的特征后,我们还可以根据需要寻找到更多的高级特征。比如有车的路程特征和时间间隔特征,我们就可以得到车的平均速度这个二级特征。根据车的速度特征,我们就可以得到车的加速度这个三级特征。也就是说,高级特征可以一直寻找下去。高级特征的合成方法一般有以下4种,我们用4.1.2节中的特征选择的销售数据为例进行解释。
·低级特征相加:假设你希望根据每日销售额得到一周销售额的特征。你可以将最近7天的销售额相加得到。
·低级特征之差:假设你已经拥有每周销售额以及每月销售额两项特征,可以求一周前一月内的销售额。
·低级特征相乘:假设你有商品价格和商品销量的特征,那么就可以得到销售额的特征。
·低级特征相除:假设你有每个用户的销售额和购买的商品件数,那么就可以得到该用户平均每件商品的销售额。
当然,寻找高级特征的方法远不止于此,它需要你根据你的业务和模型需要而得,并不是随便的两两组合就可以形成高级特征,这样容易导致特征爆炸,反而没有办法得到较好的模型。
通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:
·不属于同一量纲:即特征的规格不一样,不能够放在一起比较。比如身高(cm)数据通常大于100,而体重(kg)数据通常小于100。无量纲化可以解决这一问题,最典型的就是0-1标准化和Z-score标准化,这两者也是最常用的。0-1标准化就是对原始数据进行线性变换,使结果落到[0,1]区间,这种方法有一个缺陷,就是当有新数据加入时,可能导致原数据集中的最大值和最小值发生变化,而需要重新定义。Z-score标准化就是将数据处理后使其符合标准正态分布,即为均值为0、标准差为1的正态分布。
·信息冗余:对于某些定量特征,其包含的有效信息为区间划分,比如学习成绩。假若只关心“及格”或“不及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。
·定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,这就需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用OneHot编码的方式将定性特征转换为定量特征:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。如果你觉得上述文字难以理解,表4-2和表4-3可以比较简单地解释OneHot编码法的处理方式。
表4-2 未处理的原数据集
表4-3 OneHot处理后的数据集
假设数据集中“国籍”这一特征需要进行特征扩展,且该特征只有中国、美国、英国这3类,那么就可以通过OneHot编码将原数据(字符串)转换成如上0-1型数据,处理过程包括以下几个操作:
·存在缺失值:现实世界中的数据往往非常杂乱,未经处理的原始数据中某些属性数据缺失是经常出现的情况,因此缺失值需要补充。常见的处理方式有列平均值填充、列加权平均值填充等。
·异常特征样本清洗:在实际项目中,拿到的数据通常有不少的异常数据,如果不剔除掉这些异常数据则会对算法模型的准确率造成很大的影响。一般有两种方法来筛选异常数据:1)聚类,比如可以用k-means聚类将训练样本分成若干个簇,如果某一个簇里的样本数很少,而且簇质心和其他所有的簇都很远,那么这个簇里面的样本极有可能是异常特征样本了;2)异常点检测方法,一般是使用iForest或者one class SVM,使用异常点检测的机器学习算法来过滤所有的异常点。
·处理不平衡的数据:这主要是因为数据集中各个类别的样本分布不一致,如果不考虑数据不平衡的问题,会影响模型的准确率。一般有两种方法处理:权重法和采样法。权重法是比较简单的方法,对训练集里的每个类别加一个权重。如果该类别的样本数多,那么它的权重就低,反之权重就高。采样法有两种思路,一种是对类别样本数多的样本做子采样,第二种思路是对类别样本数少的样本做子采样。
当特征处理完成后,虽然可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,出现训练时间长的问题,因此对特征进行压缩可以有效解决训练时间过长的问题。特征压缩最直接的方法就是特征降维,常见的降维方法主要是主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中。但是在具体操作和操作目的上两者存在着一些差异,下面进行详细介绍。
(1)PCA主成分分析
PCA的工作就是从原始的空间中顺序寻找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴选取的是与第一个坐标轴正交的平面中方差最大的,第三个轴这样的是与第1、2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得新的坐标轴后,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。
那么我们如何得到这些包含最大差异性的主成分方向呢?
事实上,通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间中,实现数据特征的降维。
图4-2给出较为简明的操作过程。
图4-2 主成分分析示意图
(2)LDA线性判别分析
由于LDA的计算过程中涉及甚多复杂的数学公式,在此就不做过多介绍了。LDA的原理是将带上标签的数据(点),通过投影的方法,投影到维度更低的空间,使得投影后的点,会形成按类别区分,相同类别的点将会在投影后更接近,不同类别的点距离较远。而我们在构建LDA时的目的就是要找到这样一个投影函数,它能够使不同类的点在投影后,在新的空间内的距离尽可能地远。
PCA和LDA虽然都用到数据降维的思想,但是监督方式不一样,目的也不一样。PCA是为了去除原始数据集中冗余的维度,让投影子空间的各个维度的方差尽可能大,也就是余下的特征要尽可能不相似。LDA是通过数据降维找到那些具有区分度的维度,使得原始数据在这些维度上的投影,不同的类别尽可能区分开来。如果你想通过一种最简单的方式判断在什么场合用哪种方法,就看这是一个无监督式学习(数据无标签)还是有监督式学习(数据有标签),PCA用于无监督降维,LDA用于有监督降维。
(3)ICA独立成分分析
PCA特征转换降维,提取的是不相关的部分,ICA独立成分分析,获得的是相互独立的属性。ICA算法本质是寻找一个线性变换z=Wx,使得z的各个特征分量之间的独立性最大。ICA相比于PCA更能刻画变量的随机统计特性,且能抑制噪声。