2.2.1 如何进行特征工程.

用于机器学习的数据源一般有两种:一种是业务部门直接提供的数据,或
者根据需要在网络上爬取的数据。这种数据称为原始数据,通常存在较多的问
题,需要通过数据预处理整理数据并且找出解决问题所需要的特征;另一种是
对原始数据进行组合加工构建的高级特征数据,构建高级特征的过程称为特征
工程。接?来我们学习如何挖掘特征与特征之间的联系,组合出高级特征。
特征工程的本质是数据转化。原始数据通过特征工程转化为更有意?的数
据,这类特征能够表述原始数据集的内在关联关系。特征工程在机器学习中占
有非常重要的地位,因为这是提升模型训练速度以及模型精度最有效的方法,
通常我们花费大量的时间寻找特征之间的规律。
如图2-7所示,特征工程包括特征构建、特征提取和特征选择三个部分。
特征构建是指对原有特征进行组合运算生成新特征。特征提取与特征选择是为
了从原始特征中找出对于提升模型效率最有用的特征。它们之间的区别是:特
征提取会改变原有的特征空间,例如组合不同的特征得到一个新的特征。而特
征选择只是从原始特征数据集中挑选子集,这个子集和原数据集之间是一种包
含的关系,它没有更改原始数据集的特征空间。两种方法都能减少特征的维
度,降低数据冗余。两种方法各有优点,特征提取能发现更有意?的特征属
性,特征选择能表示出每个特征对于模型构建的重要性。在实际应用时,根据
数据集的特点选择不同的方法。?面会讲述常用的特征提取和特征选择的方
法。

        

2.2.2 特征构建
特征构建是指通过人工的方式,从原始数据中找出一些具有物理意?的特
征。顾名思?,特征构建就是构造出来新的特征。对原有的特征进行四则运算
会产生新的特征。例如银行的信用卡系统中含有“消费总额”和“还款总
额”这两个字段,通过简单加减,可以构造出“每月还款差额”这个字段,将
两个字段变为一个字段,同时放大特征表达的含?。又例如一个客户每月的消
费金额能够反映该客户的消费水平,但是全国各地物价都有差异,如果我们对
北上广深和其他二三线城市用同一个标准就显得不太公平。如果想更客观地评
价客户的消费水平,可以用“每月消费金额”除以“当地物价水平”得到一个
新的“消费水平”,这个字段才能够真实地反映出我们想要获得的信息。以上
两个例子都是通过简单的四则运算来构造新的特征。
对于特征构建,需要花时间去观察原始数据的数据结构,一位对数据敏感
的产品经理能帮助工程师更好地构建特征。在设计特征时,应考虑以?三个问
题:这个特征对于目标问题是否有帮助?如果有,这个特征的重要程度如
何?这个特征表达的信息是否在其他的特征上体现过 ?这三个问题从表面上
看很简单,真正实施起来则比较困难,产品经理需要将自己的业务经验与工程
师的数据经验结合起来,多分析,多尝试,多思考数据背后的潜在关系以及对
业务目标的影响。
除此之外,构建特征时会使用属性分割和结合的方法。如果存在时间相关
属性,则可以划出不同的时间窗口,得到同一特征在不同时间段的特征值。也
可以分解或切分特征,例如,2019/01/01与2019/01/02在模型中是两个不同的
特征值,我们可以统一用2019/01表示,以便模型发现其中的规律。
特征构建如今仍然以人工构建为主,但人工构建始终是依靠我们的日常经
验和知识积累。人类很容易理解这类特征的含?,因此人为构造的特征存在一
定的局限性。而计算机在学习数据时,除了能看懂人类能够理解的数据,还能
够看懂很多人类不能够理解的数据。所以近两年来,有不少研究者尝试让模型
学会“自己构建特征”,例如当今在图像处理与深度学习领域最热门的“卷积
神经网络”,后面章节会?述这方面的内容。
2.2.3 特征提取
在实际项目中,我们获得的特征可能有成百上千个。如此多的特征数据,
难免会带来训练时间过长的问题。如果出现特征数量多于样本数量的情况,可
能会由于每个样本都具有独特性,样本点在高维空间中较为分散,从而造成过
拟合的现象。
什么是过拟合?通俗地讲就是训练出来的模型“太好了”,模型能够完美
适应训练集数据,但是在新数据上的表现?差强人意。因为它把训练集中一些
本不该考虑的问题也考虑了进来。比如我们训练一个分辨“什么是背包”的模
型时,我们会定?“背着装东西的包”是背包,但我们不会定?“有拉链的
包”是背包。如果模型因为训练集存在一些背包是带有拉链的,就把所有不带
拉链的包定?为不是背包,这种情况就称为“过拟合”。
所以面对特征非常多的数据集时,降低特征维度是必不可少的工作。降维
是一种根据高维特征表达的含?构造出新的低维特征的方法。例如上述将银行
的信用卡系统构造出“每月还款差额”的案例。在图像中表示为三维立体的数
据点,被投射在二维的平面中,构造出一个二维空间的新特征,如图2-8所
示。常见的降维方法有线性判别分析法(Linear Discriminant Analysis,
LDA)和主成分分析法(Principal Component Analysis,PCA)。

 

PCA 的核心思想是通过转换坐标轴,寻找一个将高维数据转换到低维的映
射,从而达到降维、去除不相关特征的目的。举个例子,我们希望找到某一个
维度方向,用该方法将数据从二维降到一维,降维后的数据能够表达原来两个
数据点所表达的含?。如图2-9所示有两个向量方向,哪个向量可以更好地代
表原始数据集呢?

 

从图像上可以看出,A直线的降维效果比 B直线好。经过A降维后,所有样
本点到这个直线的平均距离更近,并且样本点在这个直线上的投影能尽可能地
分开。这就是主成分分析法的实现原理,让降维后的数据在数学表现上能够尽
量分开。
LDA 的核心思想是将带标签的数据点通过投影的方式,映射到一个低维空
间,使得不同类别数据在图像上的间隔尽量大,同一类别中的数据间隔尽量
小,这样可以将不同类别的数据分隔开。假设我们有两类数据分别用三角形和
圆形表示,如图2-10所示,这些数据特征是二维的,我们希望将这些数据投影
到一维的直线,让每一类别的数据的投影点尽可能地接近,而不同类别数据中
心之间的距离尽可能地大。

 

 图中展示了两种不同的投影方式,哪一种能满足我们的需要呢?从图中可
以看出,右图投影后的分类效果要比?图效果好,因为右图的三角形数据和圆
形数据各自较为集中,且类别之间的空隙比较明显。这是最简单的LDA的降维
思想。在实际应用中,我们的数据分类较多,原始数据包含的特征一般超过二
维,所以降维投影后不是一条直线,而是一个低维的超平面。
PCA和LDA有很多的相似点,两种方法本质上都是将原始的样本映射到维度
更低的样本空间中。但是PCA和LDA的映射目标不一样,PCA是为了去除原始数
据集中冗余的维度,让投影空间的各个维度的方差尽可能大,让映射后的样本
具有最大的发散性;而LDA是为了让不同类别的数据尽可能区分开来,让映射
后的样本具有分类的特点。
PCA不关心特征的标签值是什么,只关心样本在数学上的规律。所以PCA降
维的输入数据不含标签,是一种无监督学习。LDA 降维是根据分类效果选择合
适的特征,因此LDA的输入数据包含标签,是一种有监督学习。只判断手上的
样本数据集有多少数据带有标签,产品经理就知道使用什么类型的降维方法,
需要获得哪些数据,才能帮助工程师在数据层面做得更完善。
2.2.4 特征选择
经过特征构建及提取之后,我们能够得到不少高级组合特征。此时的特征
数可能有成百上千个,如何去找出适合问题的特征,哪些才是真正需要的特征
呢?最简单的挑选方法是根据业务经验挑选。除此之外,也可以使用统计学的
方法更客观地分析数据特点,挑选合适的特征。
首先我们要了解挑选特征的依据是什么。根据过往的经验来看,主要从以
?两个方面来选择特征。
(1)特征是否发散:如果一个特征所有的取值样本都非常集中,没有太
大的差异性,则不选择这类特征。例如有一批银行放贷成功的客户都是同一天
办理的,那么“日期”这个特征的方差接近于0,所有客户在这个特征上基本
没有差异。这个特征显然对我们没有任何帮助,很难从中发现有价值的信息。
因此选择特征时首要选择发散的、样本有差异性的。
(2)特征与目标的相关性:一个特征与我们待解决问题的目标越相关,
这个特征就是越有价值的特征,应当优先选择。
原则上优先挑选以上两类特征,但并非所有符合以上两个条件的特征都要
选出来。特征太多容易导致分析特征、训练模型所需的时间变长,同时会让模
型变得更复杂。更重要的原因是特征个数太多容易出现特征稀疏问题,导致模
型的准确率?降,模型对新数据的泛化能力也?降。因此我们需要通过一些方
法剔除不相关、冗余、没有差异的特征,从而达到减少特征个数、减少训练时
间、提高模型精确度的目的。特征选择方法有很多,在实际项目中通常使用以
?三种,如图2-11所示。
图2-11 特征选择的三类方法
(1)过滤法(Filter):按照特征的发散性与相关性对各个特征进行评
分,设定一个阈值,选择在阈值内的特征。
(2)封装法(Wrapper):使用算法训练模型,根据目标模型计算的预测
效果评分,每次选择若干特征,或者排除若干特征。
(3)嵌入法(Embedded):首先使用算法训练模型,得到各个特征的权
值系数,再根据系数从大到小选择特征。
1. 过滤法
过滤法是一种按照不同特征的发散性或者相关性对每一维特征“打分”,
然后设定阈值过滤特征的方法。也就是说给每一维的特征赋予权重,这个权重
代表该特征的重要性,然后依据权重排序。这种方法的优点是通用性强,省去
了训练模型的步骤,并且该方法的复杂度低,适用于大规模数据集。过滤法可
以快速去除大量不相关的特征,作为特征的预筛选器非常合适。
最简单的过滤法是根据数据的方差筛选。我们认为方差越大的特征对模型
训练越有帮助。如果某个特征的方差太小,那么这个特征可能对模型的效果提
升没有帮助。最极端的情况是,如果存在某个特征的方差为零,即所有的样本
数据中该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可
以直接舍弃这个特征。在实际应用中,我们会指定一个方差的阈值,方差小于
这个阈值的特征会被我们筛掉。
还有一种常见的过滤方法是用皮尔森相关系数选择特征,这个指标能够帮
助我们理解特征与目标变量之间的关系。该方法衡量的是特征之间的线性相关
性,结果的取值范围为[-1,1]。-1表示完全的负相关,即这个变量?降会引起
另一个变量上升;+1表示完全的正相关,即这个变量?降也会让另一个变量?
降;0 表示没有线性相关,即这个变量无论上升还是?降对另一个变量都没有
影响。
除了上述两种方法以外,常用的过滤法还包括卡方检验、互信息法等,产
品经理只需要了解常用的过滤指标即可。
2. 封装法
封装法是一种利用算法的性能来评价特征子集的优劣的方法,简单理解就
是每次取一批特征放入模型训练,然后根据模型的效果对每次选择的部分特征
进行评分,或者排除部分特征。该方法的主要思想是,将子集的选择看作一个
搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比
较。这样就将特征子集的选择看作一个优化问题,再通过算法解决这个问题。
因此,对于一个待评价的特征子集,封装法需要先训练一个分类器,再根据分
类器的性能对该特征子集进行评价。适用于封装法的学习算法非常多,例如决
策树、神经网络、贝叶斯分类器、近邻法以及支持向量机等都能用于训练模型
挑选特征。
相比于过滤法,使用封装法挑选的特征往往表现效果更好,因为这种方法
考虑了特征与特征之间的关联性。但是封装法最大的问题在于每次选出的特征
通用性不强,当改变算法时,需要针对新的算法重新选择特征。并且由于每次
对子集的评价都要进行分类器的训练和测试,所以算法计算复杂度很高。对于
大规模数据集来说,封装法的执行时间很长。
3. 嵌入法
嵌入法和过滤法比较相似,也是通过特征的权值系数挑选特征的。两种方
法的差异在于,嵌入法通过机器学习训练来确定特征的优劣,而不是像过滤法
一样直接从特征的一些统计学指标来确定特征的优劣。这种方法的优点是获得
的特征表现效果最好,而且训练速度最快,但同时在模型中如何设置参数,需
要有深厚的背景知识。
从嵌入法的名字可以看出来,在这个方法中选择特征已经是模型训练的一
部分,相当于把特征挑选的过程嵌入在模型训练中。最典型的特征选择算法是
决策树算法,它采用“信息增益”概念描述每个特征的重要性,一个特征里包
含的同一分类的子节点越多,这个特征就越显著。例如当我们要区分银行的高
价值客户和普通客户时,年收入就是这棵决策树要考虑的一个显著特征。所
以,决策树本身的生成就是在做特征选择。
特征选择是一个重复迭代的过程,有的时候工程师认为挑选的特征已经很
好,但实际模型训练的效果并不太好,所以每次特征选择都要使用模型去验
证,最终是为了获得能训练出好的模型的数据,提升模型的性能。
前面简述了整个特征工程的实现过程,相信此时产品经理应该对特征工程
有了一个初步的认识,也能够理解为什么工程师会花费这么多的时间在这个环
节上。特征工程最困难的地方在于找到发现有效特征的思路,而选择特征的
难点在于其本质上是一个复杂的特征组合优化问题 。举个例子,如果有一组
样本数据中含有 20 个特征,在建模时,每个特征变量都有两种状态:“选
择”和“删除”,这组特征的状态集就包含了2 20 个组合方式。因此,从算法
的角度上看,通过穷举的方式进行求解的时间复杂度是指数级的,根本不可能
计算出来。当特征变多时,特征筛选将会耗费大量的时间和计算资源。
在数据预处理和特征工程这两个环节中,工程师通常是站在数学的角度,
使用一些数学方法或以往项目的经验来判断如何选择特征。想要使模型产生好
的效果,离不开产品经理和工程师的共同努力。产品经理的业务经验以及对特
征组合规则的逻辑设计对于数据处理、特征组合与挑选都有巨大的帮助。切勿
把数据提供给工程师以后,就等着工程师出结果,认为这是工程师需要去解决
的问题。在很多时候产品经理可以更主动一点,提出自己的看法。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐