特征工程概述

本文主要谈及特征工程领域的一般思想和方法,全文6000余字,估计阅读时间18分钟

如果说机器学习是一门科学,那是特征工程则是这门科学里的艺术。在传统的机器学习领域,特征工程是数据科学家的头号敌人。正因如此,如果不是深度学习将特征工程的种种技术和知识难度降低到让模型能够自动提取的水准,机器学习怕是将继续在深渊里挣扎,难以像现在这样风靡全球。

所以本次特征工程概览也只能做到点到为止,因为在传统机器学习模型中,特征提取跟各行各业的知识深度挂钩,漂亮的特征也是各个行业数据科学家们孜孜不倦的追求,是构建数据科学的核心壁垒,很难有统一的标准。本文将讲述特征工程的步骤和一般方法,重点讲述如何做数据转换和特征选择,其大纲如下:

特征工程的一般步骤

数据探索分析&数据清洗&缺失值填充

数据转换

特征选择

总结

一 特征工程的一般步骤

i) 特征工程的几个阶段

在ARGO

机器学习的基本认识

一文中,我们谈到过机器学习中特征工程的几个阶段,这里不妨再次回味一下:

数据探索分析

数据清洗和缺失值填充

数据转换

特征提取和特征构造

特征选择

值得注意的是,特征工程是一个反复迭代不断优化的循环周期过程,包含内容方法很多,想一次达标,一口吃成胖子,除非是绝顶高手,否则很难做到。

ii) 特征工程方法论

特征工程最核心的方法论:提问题做假设去论证

不同的阶段问不同的问题,做不同的假设,采用不同的方法,便是整个的特征工程要做的事情。学机器学习,数学想必读者都已重拾一二,而特征工程,这个所谓艺术的技术部分跟数学之美尤其的类似,一个精彩的问题,一个漂亮的假设往往能够一鸣惊人,将模型的精确度提高到一个新的水平,犹如数学家凭借直觉而来的猜想。

在上面的几个步骤当中,数据清洗和缺失值填充,尤其是特征构建是比较艺术的部分,只能粗略带过,其他的阶段,我们以问问题,做假设,去论证的形式对这几个阶段进行详细展开。

二 数据探索分析&数据清洗&缺失值填充

在一开始拿到一堆乱糟糟的数据,无论是从数据库取到的数据还是Excel的表格还其他其他类型的大量数据时,我们的数据之旅就要开始了。这个时候为了让自己快点进入角色,理清头绪,建立对这些数据的大体概念,这种自问自答的自嗨就很有必要。 这个时候最应该问的几个问题是:

1 Which features are categorical?

什么特征是离散的?

2 Which features are numerical?

什么特征是连续的?

3 Which features are mixed data types?

什么数据类型是混合数据类型?

4 Which features cannot be used directly and should be processed?

那些特征还不能直接使用,需要做进一步的处理?

先明确好这几个问题,就可以寻求这些问题的答案了。一般而言,特征值分为两类,数值型文本型。无论是哪种类型,区分其离散,连续或者是混合都是比较简单的,直接查看该特征值的分布就能明确。查看特征分布可以归为对于这几个问题的探索:

5 What is the distribution of numerical feature values across the samples?

连续数据特征是怎样分布的?

6 What is the distribution of categorical features?

离散数据特征是怎样分布的?

对于接下来的数据清洗和缺失值填充,应该试图回答这几个问题:

7 Which features may contain errors or typos?

哪些数据含错误或者正确的类型?

8 Which features contain blank, null or empty values?

哪些数据包含空值?

对于错误数据的判断和缺失值的填充基于数据本身的理解,各行业的数据并不相同,方法也不同。缺失值可以填该特征的均值,最大值,最小值,或是填0等。

但是,值得注意的是,对于所谓的错误数据并不必大为恐慌,如临大敌。大部分传统机器学习模型对于噪音的容忍程度还是比较高的,尤其像如今应用最多的树形结构模型,Boosting或Bagging的GBM而言。而且对于大量样本而言,少量样本的噪音对于最后的精度影响细微。所以,这个工作可以在最后模型需要精细调优时再细化。

对于数据有了一个大概的了解和初步的清理之后,就可以对不符合模型要求的特征值做一些数据转换工作了。

三 数据转换

数据转换要解决的关键问题是:

9 values of the feature is fitable for the model?

模型直接使用该特征的值是否合适?

上文说过,数据一般分为文本型和数值型两种,对于文本型的特征值转换,传统NLP技术提供了许多方法,如词袋法,TF-IDF等。这里不做过多介绍,ARGO将NLP视为机器学习的落地技术重点,之后会有更详细的阐述。本文主要集中在数值型,包括非连续类别型和连续型以及离散型非数值特征的数据转换的方法。

1) 数值型特征两个基本要点

要对数值型特征,最重要的前提是探明这几个问题,它是后续进行数据数值转的基础。

10 numeric data is the magnitude matters ?

这个特征是否真需要用具体的数值去描述?

11 what is the scale of the features?

特征值的范围是什么?

对于一些特征而言,该特征值最主要的目标是要把特征值分成特定的几种类,并不关心具体的数值。比如一个针对健康预测的模型中,很有可能年龄就是这么一个变量,八岁、九岁的孩子并没有什么本质的区别,做特征工程时要思考清楚这个特征值的数值背后反映出来的意义,而非特征值本身,必要时用统计学方法或特征选择方法去验证。

同时,要确定特征值的范围。 有的模型,特征范围敏感,如线性回归。有的模型,如k-means,其特征值的范围过大对于计算几何距离有很大的影响,最好normalize。但是,像逻辑函数模型以及决策树,梯度boost模型等,其对于特征范围就不是太敏感的。而且目前很多模型本身在实现的时候已在内部做了很多对于输入数据特征值的优化,范围也没有那么敏感。

2) 离散型特征转换方法

对离散型特征,最重要的是做出类别数量假设。

对于离散型数值特征,一般会有以下数据转换方法针对不同的数量的类别假设:

二值法,比如设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0。

固定宽度装箱,二值法引申版本,找到多个固定阈值对特征进行设定,需要依赖行业知识。

分位装箱,使用数据值的分位数做阈值,将特征值离散化。这样的特征分布比较均匀。

对于离散型非数值特征,一般采用如下方法对数据进行转换 :

独热编码(One Hot Encode), 最简单的理解就是与位图类似,设置一个个数与类型数量相同的全0数组,每一位对应一个类型,如该位为1,该数字表示该类型。

字典编码(Label Encode),因为独热编码应对于大量类型,占用位数过多,效率过低,因此可以引入字典,比如10代表某种类型,11就可以代表另外一种类型,节省了编码空间。

虚拟编码(Dummy Coding),跟独热编码类似,但由于实际上可以用一个全0的向量代替独热编码的其中一个,从而节省一个编码空间,减少一个自由度。

注意,若用数字1-12表示1-12月,那么就潜在表示了12月和1月差的很远,其实离的很近,在考虑远近的这种情况下(比如聚类),用字典编码非常不合适,而用One-Hot编码或dummy编码就很有价值。但是虚拟编码的问题在于模型不太好解释,不能像独热编码一样对于每个类别特征的价值说的那么清楚。

对于不确定的类别假设,需要我们大胆假设,小心求证。求证方法除了观察画图的数据科学基本技能外,下文的特征选择方法也可使用。同时,因为本文只讲思想和方法,本文提到的转换方法如sikit-learn都已有了具体的实现。

3) 连续性数据特征的转换方法

连续型数据特征的处理就相对复杂一些,其数据转换的需求,依赖于数据本身的分布和模型的需要。

i) 改变特征值分布的数据转换

对数据做变换的目的是它能够让它符合我们所做的假设,使我们能够在已有理论上对其分析。

https://www.zhihu.com/question/22012482

Log化

针对一些数值连续特征的方差不稳定,特征值重尾分布我们需要采用Log化来调整整个数据分布的方差,属于方差稳定型数据转换。比如在词频统计中,有些介词的出现数量远远高于其他词,这种词频分布的特征就会现有些词频特征值极不协调的状况,拉大了整个数据分布的方差。这个时候,可以考虑Log化。尤其在分本分析领域,时间序列分析领域,Log化非常常见, 其目标是让方差稳定,把目标关注在其波动之上。

Box-Cox方法

Box-Cox这也是为了改善数据的整体分布,能够改善样本代表的整体分布的正态性。其总体分布越接近正态分布,抽样分布(样本的算术平均值所服从的分布)就在样本量越大时越接近正态分布。而抽样分布的正态性越好,t 检验就越准确

注意,这两种方法都试图改变数据的分布状态,方便特征工程的相关性检查。

因为接下来的度量相关性时使用时,有可能用到Pearson相关系数检验的是变量间的线性关系,只有两变量服从不相关的二元正态分布时,Pearson相关系数才会服从标准的t-分布。但如果变量间的关系是非线性的,则两个不独立的变量之间的Pearson相关系数也可以为0。

https://www.zhihu.com/question/22012482

ii) 无量纲化特征缩放技术

对于需要处理量纲问题,是模型不用考虑各个特征之间的距离偏差,使之无量纲化一般对应两种方法:

Min-Max 归一化

标准化

L2-Normorliziation

Min-Max归一化其示意图如下:

标准化计算公式和示意图下:

与此之外还有L2-Normorliziation 方法,其主要是将特征其除以欧式距离得到一个缩小的值,不太经常遇到。

无论缩放方法如何,特征缩放始终将特征除以常数(称为归一化常数)。因此,它不会改变单一特征分布的形状

但是这些特征缩放技术有可能会将原本稀疏的特征向量变成密集的特征向量。而有的算法是对这稀疏特征向量做了一些优化,所以特征向量密集反而会影响计算。为什么会密集呢? 因为标准差的优化减去的是均值,会将一些0选项反而缩放成为非0选项。

本文不打算讲述特征构造这一步,特征构造是八仙过海,各显神通的步骤,难有统一的标准和方法。在特征构造之后,接下来就是特征工程一般化的重头戏--特征选择。

四 特征选择

特征选择主要解决如下几个问题:

12 X is related to the predict result?

X与预测结果是否相关?

13 Is feature X related to feature Y?

X与Y是否相关?

14 Should we remove X from the feature set?

X应不应该挪出特征集合?

15 What's the best feature set?

最好的特征集合是哪些?

特征选择之所以很重要最核心的原因是并非特征越多越好,特征越多,不但会加大模型的预测和训练负担,导致执行效率变差,而且会导致比较严重的过拟合的问题。“如果一个模型足够漂亮,它应该是充分简洁的”。

应对上述问题提出的几个假设

Correlating相关性假设,假设特征与预测结果的相关性,特征与特征之间的相关性。

Completing完备性假设,提出最佳的特征组合假设。

回答上述问题并求证假设的方法在特征选择中一般有三种:

Filter过滤器方法,与模型训练独立开,侧重单个特征于预测目标的相关性。

Wrapper包装器方法,使用统一评分函数,将子特征组合作为输入对其打分排序

Embedded嵌入式法,模型与特征选择一体,引入正则化项机器学习模型帮组选择。

i)Filter过滤器方法

过滤器方法将特征选择和模型训练作为两个互相独立的部分,这与后文要讲的嵌入式法是截然不同的。这种方法侧重于特征本身的显著性和特征与预测结果的相关性。

过滤器方法主要包括:

方差选择法

特征选择中的一项基本方法。这个方法帮我们移除所有方差不满足设定阈值的特征。比如应该移除所有方差为0的特征,即那些在所有样本中数值完全相同的特征和布尔特征数据集中那些超过80%的数据都为1或0的特征。

相关系数法

先计算各个特征对目标值的相关系数以及相关系数的P值。根据这些相关系数对特征相关性进行排序,依次过滤不太相关的特征。相关系数的计算可以用计算线性相关性的皮尔逊系数函数,也可以用其他的数学相关度计算函数。

卡方检验法

卡方检验是检验定性自变量对定性因变量的独立性的经典方法。通过构建统计量

其中,A为抽样结果的实际值,E为依托假定分布的预期期望,该变量服从某一自由度的卡方分布。卡方检验可以通过假设自变量和应变量相互独立,从而用这一分布做假设检验,决定是否否决该假设。

互信息法

互信息法是从信息论发展而来,也是用来衡量两个变量关联性的一种方法。其计算公式如下:

很显然,当x,y 相互独立时,互信息的信息量最小为0。当 x,y协同变化时,互信息的信息量最大。

总之,过滤器法有优势也有劣势。在实际处理问题时用什么方法,也没有统一的标准。

过滤器方法的优点是计算时间上较高效,对于过拟合问题也具有较高的鲁棒性。缺点就是倾向于选择冗余的特征,因为他们不考虑特征之间的相关性,有可能某一个特征的分类能力很差,但是它和某些其它特征组合起来会得到不错的效果。

ii) Wrapper包装器方法

wrapper方法实质上是训练模型之外, 另起炉灶,做了一个专门用于评价特征组合的分类器模型或统计学指标,该模型或指标设定了特征组合的评价标准函数。选取的特征子集对样本集进行分类,分类的精度作为衡量特征子集好坏的标准,经过比较选出最好的特征子集。它考虑了特征与特征之间的关联性,但是当观测数据较少时容易过拟合,而当特征数量较多时, 计算时间又会急剧增加

Wrapper常用的方法有:

递归特征消除(REF,Recursive feature elimination)

这是在wrapper中最经常使用的方法。这种方法中,衡量特征组合的指标是分类模型。比如常用的SVM,逻辑回归模型,线性模型等等。

自定义模型特征选择

通过自带feature importance衡量的模型,如决策树,随机森林,GBM等对自定义的模型,通过feature importance列表对最优的特征进行选择。很多的说法中,将自定义模型选择放在了Embedded方法中,个人认为不妥,至少这与Embedded的定义不符,这取决于评价模型和实际训练模型是否一致。

逐步方法(stepwise method)

逐步方法与递归特征消除类似,只不过用的衡量特征指标是统计学指标,而非分类模型指标。它一般分为三种,向前选择,向后选择,逐步回归。如向前选择是从零模型(即只含常数项的模型)出发,每一步向模型中增加一个自变量,使得增加的自变量具有最大的F 统计量值。依次下去,直到模型中的每一个自变量对应的F 统计量值都小于某一个预先给定的值。向后选择是从全集逐个淘汰,逐步回归则是两者集中。具体参看后文所附的好文章推荐。

iii)Embedded嵌入式法

Embedded嵌入式法故名思议,与前面两者最大的不同就是将特征选择,降维和模型训练同时完成。将特征选择嵌入到模型训练当中。当然,其训练可能是用相同的模型,但是特征选择完成后,还能基于特征选择完成的特征和模型训练出的超参数,再次训练优化。

在这种特征选择中,一般用带L1正则化的项完成特征选择。 为什么用L1的正则项做特征选择?参见ARGO之前的专家文章:专家观点:L1正则稀疏?,主要是因为L1正则化后倾向于将某些特征的权重值化为0值,得到一个更加稀疏的特征矩阵。

L1正则方法具有稀疏解的特性,因此天然具备特征选择的特性,但是要注意,L1没有选到的特征不代表不重要,原因是两个具有高相关性的特征可能只保留了一个,如果要确定哪个特征重要应再通过L2正则方法交叉检验。

https://www.zhihu.com/question/28641663/answer/41653367

正因如此,

故可结合L2惩罚项来优化。具体操作为:若一个特征在L1中的权值为1,选择在L2中权值差别不大且在L1中权值为0的特征构成同类集合,将这一集合中的特征平分L1中的权值,故需要构建一个新的逻辑回归模型来进行特征选择。

https://www.zhihu.com/question/28641663

同时,应当注意的是在使用交叉验证数据集方法进行Embedded特征选择时有一个陷阱。特征选择必须在交叉验证的循环内,而不是循环外。因为特征选择之后再做K折,会在交叉验证时便已经引入Bias,使用交叉验证之后的模型评分不能准确代表特征选择的结果。Embedded特征选择的特征选择和模型应该融为一体,如果要避免这种复杂度考虑,可以改用Random Forest直接在全数据集上训练,因为这个模型的每课子树实际上已经做了有放回的抽样基础上做的每个子树的模型训练,实际上与K折相似。

一般而言,这三种方法都可以纳入到自动特征选择的模型当中,当计算算力足够时,以最后的模型评分作为最终指标,从而选出里面的最佳方案。当时间算力都纳入考量指标时,选Embedded嵌入式法会比较节省时间。

五 总结

在以上的内容中,本文重点强调了数据转换和特征选择,而可能实际上最难的点在于观察数据并因此做出新特征的假设,并对其进行验证。这个过程费时费力,以获取时间序列的数据为例,其前面几天的均值一般可以作为模型的一个重要的特征,但是取哪几天的值最佳,这个过程就免不了来回反复的确认,消耗大量的时间。

在传统的机器学习领域,特征工程是数据科学家的主要经验和行业壁垒,除了我们上述的这些一般化方法,我们还需要其他的针对特殊数据的特殊处理方法。但是无论如何,我们都可以遵从一般的准则:提问题做假设去论证

附特征工程脑图:

图片来源:https://github.com/apachecn/kaggle

深度好文:

https://www.zhihu.com/question/28641663

https://wiki.mbalib.com/wiki/%E5%8D%A1%E6%96%B9%E6%A3%80%E9%AA%8C

https://machinelearningmastery.com/an-introduction-to-feature-selection/

https://www.zhihu.com/question/22012482

https://zhuanlan.zhihu.com/p/36284359

Box-Cox:

http://www.sohu.com/a/70868355_349736

用sikit-learn 做特征选择

http://sklearn.lzjqsdd.com/modules/feature_selection.html

外国友人的好文

https://machinelearningmastery.com/an-introduction-to-feature-selection/

https://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/

kaggle的特征工程

https://www.kaggle.com/startupsci/titanic-data-science-solutions/notebook

one-hot编码

好了,今天ARGO关于特征工程概述就介绍到这了,谢谢大家关注我们的公众号。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20190121G0ZUJW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券