社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习之特征工程详解

新机器视觉 • 4 月前 • 116 次点击  

特征工程是指使用专业的背景知识和技巧处理数据,使得特征能在机器学习算法上发生更好的作用的过程。


更好的特征意味着更强的灵活性,只需简单模型就能得到更好的结果,因此,特征工程在机器学习中占有相当重要的地位,可以说是决定结果成败的最关键和决定性的因素。


本文以特征工程的基本概念为引,着重介绍了特征工程的主要工作流程和实现方法,供大家学习参考。


1.特征工程的基本定义


维基百科中给特征工程做出了简单定义:特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。简而言之,特征工程就是一个把原始数据转变成特征的过程,这些特征可以很好的描述这些数据,并且利用它们建立的模型在未知数据上的表现性能可以达到最优(或者接近最佳性能)。从数学的角度来看,特征工程就是人工地去设计输入变量X。


英文解释能帮助我们更好地理解特征工程:


Feature Engineering is the process of transforming raw data into features that better represent the underlying problem to the predictive models,resulting in improved model accuracy on unseen data.


以性别判断为例做一个形象的比喻:


如何提取特征,能更准确地判断一个人的性别?如果以这个人戴不戴眼镜为特征数据,显然这是一个相关性很低的数据,我们很难从这个特征中得出性别结果;如果以有无喉结为特征数据,一般来说有喉结的为男性,反之为女性,这个特征能判定绝大多数情况,误差相对较小;如果以Y染色体为特征数据,那么拥有Y染色体的为男性,没有Y染色体的为女性,这个特征能判定所有情况,误差为零。


可见,特征的选取对模型的性能表现十分重要。


剔除无关数据,选取更贴切的特征展示和描述数据,使之与结果具有高相关性的过程,就是特征工程。


因此,特征工程其实是一个如何展示和表现数据的问题,在实际工作中需要把数据以“良好”的方式展示出来,使得能够使用各种各样的机器学习模型来得到更好的结果。如何从原始数据中去除不佳的数据,展示合适的数据成了特征工程的关键问题。


2.特征工程的意义


·特征越好,灵活性越强


只要特征选得好,即使是一般的模型(或算法)也能获得很好的性能,因为大多数模型(或算法)在好的数据特征下表现的性能都还不错。好特征的灵活性在于它允许你选择不复杂的模型,同时运行速度也更快,也更容易理解和维护。


·特征越好,构建的模型越简单


有了好的特征,即便你的参数不是最优的,你的模型性能也能仍然会表现的很nice,所以你就不需要花太多的时间去寻找最有参数,这大大的降低了模型的复杂度,使模型趋于简单。


·特征越好,模型的性能越出色


特征工程的最终目的就是提升模型的性能。


3. 特征工程的工作流程


特征工程的基本工作流程可以分为四步:


·特征使用 (数据选择,可用性)

·特征获取 (特征来源,特征存储)

·特征处理 (数据清洗,特征预处理)

· 特征监控 (现有特征,新特性)


如下图所示:




1. 特征使用


·基于业务理解和业务目标,尽可能找出对因变量有影响的所有自变量;


·数据可用性评估,评估方向包括:获取难度、覆盖率、准确率。



2. 特征获取


1)获取途径


·如何获取特征(接口调用/github下载等)


·如何存储(数据库/csv/txt/dataframe等)



3. 特征处理


3.1特征清洗


·数据采集


采集数据前,需要明确哪些数据对最后的预测结果使用帮助的,是否可采集到,

在线上实时计算时数据获取是否快捷;


·数据清洗


除去“脏”的数据;


如何判定脏数据?


1)简单属性判定:一个人身高3米+的人、一个人一个月买了10w的发卡,显然不合情理;


2)组合或统计属性判定:声称在美国ip却一直是大陆的新闻阅读用户、判定一个人是否会买篮球鞋,样本中却绝大部分为女性用户;


3)补齐可对应的缺省值:不可信的样本丢掉,缺省值极多的字段考虑不用。


·数据采样


采集清洗过数据之后,正负样本是不均衡的,要进行数据采样。(正负样本的概念可以简单理解为正样本是待检测的目标,比如检测人脸时,人脸是正样本,非人脸则是负样本)


采样的方法有随机采样、分层采样等,随机采样得到的数据可能会很不均匀,更多的是根据特征采用分层抽样。


3.2预处理


通过特征提取,我们能得到未经处理的特征,这时的特征还需要进行进一步处理。


·去重处理:


对于重复值进行削减


·缺失值处理:


可能会出现一些暂时无法获取的信息,被遗漏的信息,不存在属性信息等。


缺失值解决办法:


-直接删除(仅有少量样本缺失时可尝试使用)

-插值补全特征值


1)均值/中位数/众数补全

均值补全--样本属性可度量

中位数/众数--样本属性距离不可度量


2)固定数值补全


3)模型预测

建立一个模型预测缺失的数据。即用其他特征做预测模型,来算出缺失特征,但若缺失特征与其他变量之间没有太大相关,预测结果将会不准确。


4)高维映射

把特征映射到高维空间。

将属性映射到高维空间,采用独热编码(one-hot)技术。将包含 K 个离散取值范围的属性值扩展为 K+1 个属性值,若该属性值缺失,则扩展后的第 K+1 个属性值置为 1。


这种做法是最精确的做法,保留了所有的信息,也未添加任何额外信息,若预处理时把所有的变量都这样处理,会大大增加数据的维度。这样做的好处是完整保留了原始数据的全部信息、不用考虑缺失值;缺点是计算量大大提升,且只有在样本量非常大的时候效果才好。


数据变换:


单个特征上的规范化、离散化、稀疏化。


1)规范化处理


也就是数据的归一化和标准化。数据中不同的特征由于量纲往往不同,数值间差距可能非常大,会影响到数据分析的结果。需要对数据按照一定比例进行缩放,保持数据所反映的特征信息的同时,使之落在合理范围内,便于进行综合分析。


常用方法包括


线性归一化:



非线性数据变换:


对数函数log x,常用于数据量级非常大的场合;


反正切函数



用于将角频率转换到[-1,1]范围内;


标准化



使数据服从标准正态分布。


2)离散化处理


指将连续的数据进行分段,称为离散化的区间。分段的原则有基于等距离、等频率等方法。


离散化的原因是因为一些模型是基于离散的数据的,如决策树。有效的离散化能减少算法的空间时间开销,提高系统对样本的分类聚类能力和抗噪声能力。


3)稀疏化处理


对于离散型类别标签数据,通常将其做0、1哑变量的稀疏化。尤其将原始字符串心事的数据数值化。除了决策树等少量模型能直接处理字符串输入,对于逻辑回归、SVM等来说,数值化处理是必须的。


如果特征的不同值较多,则根据频数,所有出现次数较少的值可以归为同一类。


一般采用的方法有Ordinal Encoding、One-hot Encoding、Binary Encoding。


特征选择


在训练机器学习模型之前,特征选择是一个很重要的预处理过程,之所以进行特征选择,原因有:


1)现实任务中经常遇到维数灾难问题,如果能选择出重要特征,再进行后续学习过程,可以减轻维数灾难;


2)去除不相关的特征往往会降低学习任务的难度,使模型更易理解;


3)去除不相关的变量还可以尽量减少过拟合的风险,尤其是在使用人工神经网络或者回归分析等方法时,额外的输入变量会增加模型本身的额外自由度。


常见的特征选择方法


1)Filter(过滤式)


按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。通过卡方检验、皮尔逊相关系数、互信息等指标判断哪些维度重要,剔除不重要的维度。与学习器无关。


2)Wrapper(包裹式)


使用一个基模型进行多轮训练,每次选择若干特征,或者排除若干特征。根据目标函数(通常是预测效果评分),来决定各特征是否重要。通常结合遗传算法或模拟退火算法等搜索方法来对选取特征。


3)Embedding(嵌入式)


该方法基于机器学习的算法和模型进行训练,学习器通过训练自动对特征进行选择。如使用L1范数作为惩罚项的线性模型(例如lasso回归)会得到稀疏解,大多数特征对应的系数为0。从而实现了特征选择。

降维


当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。


正常角度下的维度


映射后的线性维度


LDA(线性判别分析)与PCA(主成分分析)都是常用的降维方法,二者的区别在于:


·出发思想不同。PCA主要是从特征的协方差角度,去找到比较好的投影方式,即选择样本点投影具有最大方差的方向( 在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。);而LDA则更多的是考虑了分类标签信息,寻求投影后不同类别之间数据点距离更大化以及同一类别数据点距离最小化,即选择分类性能最好的方向。


·学习模式不同。PCA属于无监督式学习,因此大多场景下只作为数据处理过程的一部分,需要与其他算法结合使用,例如将PCA与聚类、判别分析、回归分析等组合使用;LDA是一种监督式学习方法,本身除了可以降维外,还可以进行预测应用,因此既可以组合其他模型一起使用,也可以独立使用。


·降维后可用维度数量不同。LDA降维后最多可生成C-1维子空间(分类标签数-1),因此LDA与原始维度N数量无关,只有数据标签分类数量有关;而PCA最多有n维度可用,即最大可以选择全部可用维度。



4. 特征监控


我们想知道一个特征是否真的靠谱,在时间有限的情况下,每次选择表现最好的特征加入到模型训练中,这个时候就需要进行特征评估,特征评估可以从以下几个维度进行衡量:


4.1特征自身的质量


·特征覆盖度,这个指标是衡量某个特征能够影响的样本量,一般情况下,会排查覆盖度特别低的


·特征的准确性,也就是说特征值是否考虑,会不会存在太多错误数据


·特征方差,衡量特征是否有区分度,比如 100 个训练样本,有 99 个是 0,那么这个特征方差就特别低,肯定有问题。


4.2特征与目标值的相关性


·相关系数


·单特征 AUC



总结


特征工程是将原始数据转化为特征,更好表示预测模型处理的实际问题,提升对于未知数据的准确性。它是用目标问题所在的特定领域知识或者自动化的方法来生成、提取、删减或者组合变化得到特征。借用业界广泛流传的一句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。


版权声明


转自DataCanvas,版权属于原作者,仅用于学术分享



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/177297
 
116 次点击