Feature Engineering: Feature Selection, Feature Construction, and Dimensionality Reduction
最基本的概念介绍
关于各种相关的统计学知识和基本的数据分析知识 我们在下面的章节中已经有了比较详细的介绍
- 探索性数据分析
- 描述性统计与可视化
- 数据科学导论 这里我们希望能专注于机器学习中相关概念的介绍 尽可能避免那些基础知识在这里重复的出现
特征工程的基本介绍
特征工程(Feature Engineering)特征工程是将原始数据转化成更好的表达问题本质的特征的过程,使得将这些特征运用到预测模型中能提高对不可见数据的模型预测精度。我们做特征工程来让模型的效果更好
数据中的特征对预测的模型和获得的结果有着直接的影响。可以这样认为,特征选择和准备越好,获得的结果也就越好。
特征工程为算法的效果设定了一个上线 我们的各种算法优化只是在逼近这个上线。特征工程需要很强的业务思维,是数据科学家的必备 比看似高大上的算法更加难以学习
在更加广义的视角下 特征工程可以包含
- 数据的收集
- 特征的初步筛选
- 数据预处理
- 特征选择,特征构造与特征降维
数据的收集工作与特征初步筛选是高度依赖经验的 没有介绍的意义 数据预处理我们在探索性数据分析:数据预处理中介绍过了 因此我们这里只关注特征选择,特征构造与特征降维这一狭义的特征工程方法
这是我们的ML全周期

深度学习时代的特征工程
在机器学习领域,“Garbage In, Garbage Out”是业界的共识,特征工程处于机器学习流水线的上游位置,处理结果的好坏关系到后续模型的效果。
深度学习时代,因为模型具有很强的特征表达能力,特征工程显得不那么重要了;很多人说有了深度学习后,就不需要做特征工程了 这里我们讨论深度学习时代的特征工程问题
深度学习在计算机视觉、自然语言处理等领域取得巨大成功,这种end-to-end的学习方式使得在这些领域中,手工做特征工程的重要性大大降低;但是在其他领域 如搜索 广告等广泛运用关系型数据库的领域,特征工程依然是非常重要的
数据的多种特征
我们常用的变换有
- 基于行的特征变换(row-based):新的特征是由同一样本的其他特征变换得到的,比如数值型特征的缩放变换。
- 基于列的特征变换(column-based):对所有样本数据做统计、聚合才能得到,如最大值、最小值、平均值等。
深度学习模型在一定程度上可以学习到row-based的特征变换,比如PNN、DCN、DeepFM、Wide&Deep等都可以学到特征的交叉组合操作。
但是,深度神经网络很难学习到column-based的特征变换,这是因为深度模型一次只能接受一个小批次的样本,无法建模到全局的统计聚合信息,而这些信息通常是十分重要的。
AutoFE 永远无法取代手工的特征工程
自动化特征工程(AutoFE)研究尚处于初级阶段,AutoFE是解决原始特征表达信息不充分或者存在冗余的问题
特征工程非常依赖于数据科学家的业务知识、直觉和经验,通常带有一定的创造性和艺术性,因此很难被AutoFE工具取代。
特征工程与领域知识
特征工程与专业的领域知识之间的关系,是所有机器学习学者都在讨论的问题,我们非常希望知道,没有高深的领域知识能否进行特征工程的研究
我们首先需要明确的是,领域知识对与FE来说非常重要,但是严谨的分析流程可以让我们实现很多原本需要领域知识才可以想到的特征工程技术。多数据科学竞赛爱好者依靠可靠的数据分析与迭代,实现高性能预测模型,而他们往往对这个领域一无所知;这要求我们关注数据集本身的形状,迭代优化特征工程与算法。
因此,我们这里将介绍那些无需领域知识的特征工程技巧,帮助我们优化模型的效果。
在非常多的计算机科学算法中,我们用更多的RAM来加速算法,也就是空间复杂度换时间复杂度。在FE中,关于领域知识与训练数据也可以有类似的权衡,过多的人类敢干预算法是否算得上一种优秀机器学习方式,或许深度学习与AUTOFE才是完全的机器学习
一些FE的注解
FE依赖两个重要的分析 探索性数据分析EDA和残差分析EA
探索性数据分析EDA注重研究数据的模式,EA则研究算法的性能,与随机数据或者基准模型比较也是EA的一部分
FE并不能总是提高ML性能,只有数据模式恰好无法被选择的算法识别的时候才有用。
某种FE技术在某项应用中没有用,但是很可能以后在其他领域中被挖掘出来,不妨多尝试各种FE技巧,FE是否起效果是难以估计的,不做没有人能知道
FE与ML是紧密联系的,超参数优化会作用我们修改FE最后改变结果,无法事先确定有哪种更优的ML与FE技术,需要相互左右修改。
特征选择
特征选择是从大量的特征中选择少量的有用特征;非常自然的 不是所有的特征都是平等的。那些与问题不相关的属性需要被删除;还有一些特征可以比其他特征更重要;也有的特征跟其他的特征是冗余的。特征选择就是自动地选择对于问题最重要的特征的一个子集。
他的作用是
- 简化模型,增加模型的可解释性
- 缩短训练时间
- 避免维度灾难
- 改善模型通用性、降低过拟合
特征子集选择的方式主要有下面的三类
- 嵌入(embed) 学习算法本身包括特征选择的步骤 比如决策树
- 封装 (wrapper) 特征选择和训练过程整合 用训练出的模型效果进行特征选择 比如LVW (LasVegas Wrapper )
- 过滤 (filter) 特征选择和训练完全独立 根据特征本身进行特征选择 和学习器无关
过滤 (filter)
过滤方法本身的特点
我们考虑自变量和目标变量之间的关联来筛选特征,特征选择的评价标准从数据集本身的内在性质获得
过滤式特征选择的研究者认为,相关度较大的特征或者特征子集会在分类器上获得较高的准确率。过滤式特征选择的评价标准分为四种,即距离度量、信息度量、关联度度量以及一致性度量。
优点:算法的通用性强;省去了分类器的训练步骤,算法复杂性低,因而适用于大规模数据集;可以快速去除大量不相关的特征,作为特征的预筛选器非常合适。
缺点:由于算法的评价标准独立于特定的学习算法,所选的特征子集在分类准确率方面通常低于Wrapper方法。
手工删除无用的特征
这高度依赖我们的经验 这里是对一些基本经验的总结 是从数据本身的角度进行移除,那些基于业务的手工过滤特征在这里无法被介绍
- 删除明确无作用的量:如观测的编号,他们理论上不会对模型有任何正面作用
- 删除缺失值比率过高的量:没有固定的线,根据情况决定
- 删除方差几乎为0的特征:
- 变量取值的个数不到变量个数的百分之十
- 频数最大的两个情况 频数比值超过百分之二十
- 删除复共线性太强的量:
- 找到目前相关系数最强的两个变量
- 计算他们和剩余总体的相关系数(复相关系数)
- 删除复相关系数最大的变量
- 是否需要重复这个步骤继续进行删除要从数据集的情况来看
- 基于相关系数进行筛选 保留较强相关的量描述性统计与可视化中的相关分析
Relief方法
使用Relief方法就可以有稳定的方法来进行 过滤 (filter) ;它本质上就是在研究相关性
该方法设计了一个“相关统计量”来度量特征的重要性,该统计量是一个向量,其每个分量分别对应于一个初始特征,而特征子集的重要性则是由子集中每个特征所对应的相关统计量分量之和来决定
最终只需指定一个阈值 , 然后选择比 大的相关统计量分量所对应的特征即可;也可指定欲选取的特征个数 然后选择相关统计量分量最大的 个特征.
这个相关统计量的计算方法为: 给定训练集, ,对每个示例, Relief 先在的同类样本中寻找其最近邻,称为“猜中近邻”(near-hit),再从的异类样本中寻找其最近邻,称为“猜错近邻”(near-miss),然后,相关统计量对应于属性的分量为
其中表示样本在属性上的取值,diff取决于属性的类型:若属性为离散型,则时diff,否则为1;若属性为连续型, 则diff 注意已规范化到[0,1]区间.
它本质上是在计算某个特征在猜错与猜对之间有没有明显的作用 如果有就增大相关统计量对应的分量,最后平均各个样本的情况就是我们最终的输出
Relief是为二分类问题设计的,其扩展变体Relief-F 能处理多分类问题, 不过他们对于定性自变量都没有什么作用
封装 (wrapper)
封装方法的介绍
Wrapper:封装式特征选择是利用学习算法的性能评价特征子集的优劣。因此,对于一个待评价的特征子集,Wrapper方法需要训练一个分类器(需要人为指定分类器),根据分类器的性能对该特征子集进行评价。
优点:相对于Filter方法,Wrapper方法找到的特征子集分类性能通常更好。
缺点:Wrapper方法选出的特征通用性不强,当改变学习算法时,需要针对该学习算法重新进行特征选择;由于每次对子集的评价都要进行分类器的训练和测试,所以算法计算复杂度很高,尤其对于大规模数据集来说,算法的执行时间很长。
具体的封装方法研究往往是搜索手段的研究 如
- 递归特征消除法
- 贪心思想的前后项搜索方法
- 随机搜索方法
稳定性选择(Stability Selection)
稳定性选择是一种基于二次抽样和选择算法(训练模型) 相结合的方法,选择算法可以是回归、分类SVM或者类似算法。
原理实现
在不同的特征子集上运行训练模型,不断地重复,最终汇总特征选择的结果
比如可以统计某个特征被认为是重要特征的频率 (被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数, 而最无用的特征得分将会接近于0。
优缺点
特征值下降的不是特别急剧,这跟纯LASSO的方法和随机森林的结果不一样, 能够看出稳定性选择对于克服过拟合和对数据理解来说都是有帮助的。
总的来说,好的特征不会因为有相似的特征、关联特征而得分为0
在许多数据集和环境下,稳定性选择往往是性能最好的方法之一。
递归特征消除(Recursive Feature Elimination)
Recursive Feature Elimination,简称RFE
原理
- 反复的构建模型(比如SVM或者回归模型)
- 接着选出最好(或者最差)的特征(可以根据系数来选),把选出来的特征放到一边
- 然后在剩余的特征上重复上面1,2步骤,直到遍历完所有特征。
RFE算法的主要思想就是使用一个基模型(这里是S模型VM)来进行多轮训练, 每轮训练后,根据每个特征的系数对特征打分,去掉得分最小的特征, 然后用剩余的特征构建新的特征集,进行下一轮训练,直到所有的特征都遍历了。
这个过程中特征被消除的次序就是特征的排序,实际上这是一种寻找最优特征子集的贪心算法
优缺点
RFE的稳定性很大程度上取决于在迭代选择的时候,选择哪一种模型。
- 如果RFE采用的是普通的回归,没有经过正则化的回归是不稳定的,从而RFE也是不稳定的
- 如果采用Ridge或Lasso模型,经过正则化的回归是稳定的,从而RFE是稳定的
特征值排序
理论上来讲,如果某个特征进行排序或者打乱之后,会很明显的影响(无论正向影响还是负向影响)到模型(预测评分)效果评分,
那么可以说明这个特征对模型来说是重要的;反之,说明这个特征存不存在并不会影响到模型的效能。
特征值排序就是基于这样的思想设计的方法
嵌入(embed)
嵌入式特征选择是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动地进行了特征选择.
对于嵌入方法 我们在回归方法就介绍的正则化回归是一个非常好的例子线性回归基础中的 Ridge 回归 线性回归基础中的 LASSO 回归 线性回归基础中的 ElasticNet 回归
在最原始的最小二乘回归模型中 我们的最优化目标为
当样本特征很多,而样本数相对较少时很容易陷入过拟合 因此我们引入了 正则化 也就是 线性回归基础中的 Ridge 回归
当然我们也可以使用其他正则化方法 这就是线性回归基础中的 LASSO 回归
其中 正则化更容易得到稀疏解 因此我们一般把基于 正则化的学习方称为一种嵌入式特征选择方法,其特征选择过程与学习器训练过程融为一体,同时完成
除去基于正则化思想以外 基于树模型的嵌入特征选择也使用的非常普遍 我们使用的决策树 梯度提升树都是嵌入特征选择的模型
深度学习也是一种嵌入的特征选择方法
特征构造
特征构造是指我们根据经验将原本的数据进行加工来得到对模型更加有意义的特征
这要求你在样本数据上花费大量的时间并且思考问题的本质,数据的结构,以及怎么最好的在预测模型中利用他们。
在大量的建模实例中 我们能见到各种特征构造的身影
白化
数据降维着重于降低维数的思考,但是他的作用往往不局限于只可以降低维数;
我们在探索性数据分析:数据转换(Data Transformation)里介绍了关于转换的问题,用于将一些原始特征转换成更加方便分析的格式,同时提到了探索性数据分析:数据变换 作为一种更加进阶的数据转换方法。
马氏距离变换消除了自相关性,标准化变换换来了单位方差,同时综合这两者的方法就是白化 白化产生的数据非常适合各种模型的建模分析,比较常见的白化方式有 PCA(主成分分析)白化 和ZCA(马氏转换)白化是一种数据变换的方式,但是由于其较为高级被放入了FE中
可计算特征
基本介绍
可计算特征:我们将已有特征输入后进行计算,计算结果作为新的特征
可计算特征是比较基础的一种特征构造方法。可计算特征更加适用于简单的ML模型(如线性回归交互项),神经网络方法一般被认为可以自主学习可计算特征,当然,我们引入可计算特征到NN中可能也会提升效果
一般情况下,可计算特征我们研究三类问题,分别是单特征变换,特征算术组合,特征坐标系概念变换
一般认为AUTOFR可以处理可计算特征的问题
单特征变换
在一个特征上进行操作是特征构造的最简单方法,比较常用的变换形式有,指数,对数,平方,三次方,开根等;
除非我们使用了自定FE,否则单特征变换不应该毫无根据的进行,我们必须是因为某些原因才进行变换,比如对数变换用于重尾的正数非常有效。
其他比较常用的单特征变换还有Sigmoid 操作;他有着S型的函数,可以保持数值域中间部分的可变性,而减少值域两端的可变性 如
同样常用的单特征变换还有BoxCox变换
如果确信值的分布有一长尾,而且想合并长尾中的值以加强信号,那么这种变换就非常适合
特征算术组合
特征的算术组合也称为“多项式特征”。如果某种特征组合在问题领域内有意义,就可以把它显式地添加进来。例如,如果有长度和宽度这两个特征,那么面积(长度乘以宽度)就有同样的作用。添加这种组合需要一定的直觉,添加所有算术组合会是一个错误。
因为特征组合的空间非常大,所以应该使用尽可能多的领域知识来进行指导
笛卡尔积
如果两个特征总是同时出现(如楼层和房间号),那么使用这两个特征的笛卡儿积作为一个单独特征可以加强信号,供ML 算法使用;
这是分解复杂特征的逆操作
特征坐标系概念变换
如果我们认为两个向量的角度是有意义的,那么我们就可以考虑使用极坐标系方便模型学习角度特征;如果我们想要降低相关性,那么马氏距离完成的旋转坐标系就可以被考虑
对于颜色特征,我们也有RGB HSV等编码方式,他们有着自己的编码特点
这里考虑将探索性数据分析:数据变换综合一下
复杂特征分解
某些特征字段可能包括大量信息,比如一个字段包含了年月日时分秒,对我们有价值的信息藏在其中,但不能直接使用,这就是复杂特征的分解需要处理的问题。
字符串拆分
我们举一个例子,泰坦尼克数据集用舱位编号如C123来表明乘客身份信息,从其中拆分出的C等舱这一信息很可能对我们的预测能起到效果,这就是字符串拆分
时间戳拆分
依赖我们的感觉,考虑保留年月日时分秒的哪一种信息,比如四季,工作日与休息日等;如果有时区信息我们还需要考虑如何统一他们,同时时区信息也可以作为独立特征揭示地理位置信息。
位置信息拆分
经纬度,国家等等都是位置拆分信息的一部分;我们往往希望分开考虑经纬度,这样一般才会有更好的效果
数据降维
数据降维,又称特征降维,是将高维空间的数据集映射到低维度空间,同时尽可能少的丢失数据,或者降维后的数据点尽可能的被区分
维数降维(维数约简)的目的:更简洁地表示数据,方便算法的使用
- 避免维度灾难,导致算法失效,或者时间复杂度高
- 避免高维数据中引入的噪声,防止过拟合
- 压缩存储,方便可视化分析
我们在机器学习导论与监督学习:降维与度量学习 中介绍过一次数据降维的问题 对理论的介绍还算比较详尽 这里我们从处理数据的角度进行一次整理和分类 更少的关注理论细节
数据降维手段会导致误差分析与模型的可解释性严重降低,这只在极少的情况下可以被挽回
线性降维方法
- 主成分分析 PCA
- 线性判别分析 LDA
- 因子分析 FA
嵌入方法
保留局部性质
- 局部线性嵌入 LEE
- 拉普拉斯特征映射 LE
保留全局性质
- 随机领域嵌入 SNE
- 分布邻域嵌入 T-SNE
核化方法
核化的线性降维方法 KLDA KPCA是最常见的
迁移学习
迁移学习降维 TCA
没分类
还有lsa降维 独立成分分析 (independent component analysis,ICA)。 低秩近似。它是一种最小化技术,目标是找到与某种输入矩阵尽量相似的低秩矩阵,其中的邻近度是用特定矩阵范数定义的 非负矩阵分解(NMF)。也称为非负矩阵近似、自建模曲线解析和正定矩阵分解。给定一个没有负值的矩阵 M,它可以找出矩阵W和H,使得M=W×H,其中 W和及也都没有负值。
我们在特征工程中介绍他 本文的数据降维部分
基于坐标轴旋转的维度约简 pca svd LDA LSA等都属于这个范畴
AutoFE
特征工程如何的复杂且依赖于领域知识,但是我们依旧希望研究让FE可以自动化进行的技术,AutoFE技术仅仅依赖于训练数据。随着LLM模型的引入,AutoFE技术或许可以吸收领域知识,进而实现最好的机器学习效果
卷积神经网络
卷积神经网络在特征空间的一个小区域(图像中的一段)使用一个筛选器(卷积核 convolution kernel)卷积核可以将原本的特征(像素)映射到一个更小的维度上
使用卷积神经网络就可以训练出这种核,其形式是一个有了固定参数的神经网络,卷积神经网络实现的压缩让我们基本不用进行手工的特征工程
Featuretools
Featurestools不是用来让特征工程自动化的方法,相反的,他自动的寻找机器学习算法。
遗传编程
我们尝试自动的寻找可计算特征
- Title: Feature Engineering: Feature Selection, Feature Construction, and Dimensionality Reduction
- Author: Hyacehila
- Created at : 2024-05-02 07:24:00
- Link: https://hyacehila.github.io//blog/2024/05/02/feature-engineering/
- License: This work is licensed under CC BY-NC-SA 4.0.