当前位置: 首页 > 科技观察

本文介绍机器学习中的三种特征选择方法

时间:2023-03-17 16:56:37 科技观察

机器学习中的特征需要选择,生活中何乐而不为呢?特征选择是指从许多可用特征中选择一个子集的过程。其目的和预期效果一般从以下三个方面考虑:提高模型效果主要通过过滤无效特征或噪声特征来实现;加速模型训练,更简化的特征空间自然可以提高模型训练的速度,增强特征的可解释性。这方面的影响一般不是特别明显。例如,当存在一组共线性较高的特征时,通过合理的特征选择,只能保留高效的特征,从而提高模型的可解释性另一方面,要了解不同的特征选择方法,首先需要根据特征对训练任务的价值将特征分类如下:高价值特征,这些特征是对模型训练很有帮助,特征选择的目的就是尽可能准确的保留这些低价值的特征。这些特征对模型训练的帮助不大,但也是正相关的特征。当特征选择率较低时,可以丢弃这些特征;高相关性特征,这些特征对模型训练也很有帮助,但是特征之间的相关性往往很高。换句话说,一组特征可以被另一组特征代替,所以存在冗余特征,在特征选择中应该过滤掉。;噪声特征,这些特征不仅对模型训练没有积极作用,反而会干扰模型的训练效果。有效的特征选择方法应该优先过滤掉它们。在实际应用中,特征选择方法主要可以分为以下三类:本文将分别介绍这三种方法,最后以sklearn自带的数据集为例给出简单的应用和效果对比。01过滤法过滤法(Filter)是实现特征选择最简单也是最常用的方法。它最大的优点是不依赖于模型,只从特征的角度挖掘它的价值,从而实现特征的排序和选择。事实上,基于过滤方法的特征选择方案的核心是对特征进行排序——根据特征的值排序后,可以选择或剔除任意比例/数量的特征。显然,如何评估特征的价值来实现排序是这里的关键环节。为了评价特征的价值,大致可以分为以下三类评价标准:基于特征所包含信息的高低:这一般是基于方差法的特征选择,即较大的方差越大,标签越容易区分。否则,具有低方差的特征被认为具有低辨别度。极端情况下,当一列特征的所有值都相同时,方差为0,对模型训练没有价值。当然,实际上直接用方差的大小来衡量特征所包含的信息量是不精确的。比如对于[100,110,120]和[1,5,9]这两组特征,根据前者的方差计算公式较大,但后者从机器学习的角度可能更具判别力。因此,在使用方差法进行特征选择之前,一般需要根据相关性对特征进行归一化:一般根据统计理论,逐一计算每一列与标签列之间的相关系数。当它很高时,它被认为对模型训练更有价值。衡量两列数据相关性的指标有很多,典型的有欧几里德距离、卡方检验、T检验等。基于信息熵理论:类似于统计得出的相关性方法,也可以从从信息论的角度衡量一列特征与标签列之间的相关程度,典型的方法是计算特征列与标签列之间的互信息。当互信息越大时,说明提供列特征时标签信息的确定程度越高。这其实类似于决策树中拆分标准的思路。当然,基于过滤法的特征选择方法也有明显的缺点:因为不依赖于模型,所以无法挖掘出最适合模型的特征。系统;特征排序和选择是独立进行的(这里的独立是指特征与特征之间的独立性,不包括特征与标签之间的相关性计算等),对于某些特征,单次使用价值较低,结合使用高的特性无法有效挖掘和保留。02打包法过滤法是从特征重要性的角度进行排序,从而完成目标特征选择或低效特征过滤的过程。如前所述,它最大的缺点之一是因为不依赖任何模型,所以无法为对应的模型选择最合适的特征系统。同时,还有一个隐藏的问题:就是特征选择保留的比例问题。实际上,这往往是一个超参数,一般需要手动定义或超参数优化。相比之下,wrapping方法将特征选择看成一个黑盒问题:即只需要指定目标函数(这个目标函数一般是特定模型下的评价指标),目标函数通过a最大化某种方法,不管其内部实现的问题。进而,从具体实现的角度来看,给定一个具有N个特征的特征选择问题,可以抽象为选择最优的K个特征子集来实现目标函数的最优值。很容易看出这里的K可能是1到N之间的任意值,所以这个问题的搜索复杂度是指数次方:O(2^N)。当然,对于这样一个复杂度如此之高的算法,聪明的前辈们不可能直接暴力尝试,尤其是考虑到目标函数往往足够昂贵(即模型在特定特征子集上的评估过程一般是一个比较耗时的过程),所以一般有以下两种具体实现方式:顺序选择。名字叫顺序选择,其实是一种贪心算法。包含K个特征的最优子空间搜索问题简化为从1->K递归选择(SequentialFeatureSelection,SFS)或从N->K递归剔除(SequentialBackwardSelection,SBS)的过程,前者也称为forward选择,后者相应地称为反向选择。具体来说,以递归选择为例,初始状态下特征子空间为空,尝试逐个选择每一个特征加入到特征子空间中,计算对应目标函数的值,将这个过程执行N次,得到获取当前最好的第一个特征;就这样,递归地,继续选择第二个和第三个,直到完成预期的特征个数K。这个过程的目标函数的执行次数是O(K^2),相对于指数幂算法的复杂度来说是可以接受的。当然,在实际应用过程中也衍生出很多改进的算法,如下图所示:来源:《A survey on feature selection methods》heuristicsearch。启发式搜索一般采用进化算法,如遗传算法,在优化领域应用广泛。在具体实现中,需要考虑如何将特征子空间表示为种群中的个体(例如,将包含N个特征的选择问题表示为长度为N的0/1序列,其中1表示选择该特征,0表示不选择,序列中1的个数就是特征子空间中的特征个数),则模型在相应特征子空间中的效果可以定义为种群中相应个体的适应度;二是定义了遗传算法中的主要操作:交叉、变异、繁殖等进化过程。基于wrapping方法的特征选择方案是一种面向模型的实现方案,理论上选择效果最好。但实际上,在上述实现过程中,一般需要预先指定期望保留的特征个数,因此也涉及到超参数的问题。另外,wrapping方法最大的缺点就是计算量巨大。顺序选择的实现虽然将算法的复杂度降低到平方阶,但仍然是一个很大的数;而遗传算法和粒子群算法的启发式搜索方案,由于都是基于种群的优化实现,自然需要大量的计算。03embedding方法和wrapping方法类似于依赖模型进行选择的思想,但不同于涉及的计算量巨大:基于embedding方法的特征选择方案,顾名思义,就是将特征选择过程“附加”到一个模型训练任务本身,从而依赖特定的算法模型来完成特征选择过程。个人一直认为“嵌入式”这个词在机器学习领域是一个非常神奇的存在。甚至在我刚开始接触特征选择方法的时候,也曾经把embedding方法和wrapping方法混淆,无法从感性上理解。其实文中至此,基于embedding方式的特征选择方案呼之欲出。最常用的是树模型和基于树模型的一系列集成算法。由于该模型提供了特征重要性的重要信息,因此可以自然地使用它。实现模型的值有高有低,从而完成根据特征重要性高低进行特征选择或过滤的过程。此外,除了决策树系列模型,广义线性模型如LR、SVM也可以通过拟合权重系数来评价特征的重要性。基于embedding方法的特征选择方案简单高效,一般被认为是融合了filtering方法和wrapping方法两种方案的优点:它不仅在wrapping中具有面向模型的特征选择优势法,又具有过滤法的开销小、速度快的特点。.但其实它也有相应的缺点:不能识别高度相关的特征,比如特征A和特征B都具有很高的特征重要系数,但同时两者又是高度相关的,甚至特征A=特征B.这时候基于embedding方法的特征选择方案就无能为力了。04三种特征选择方案的实用比较本节以sklearn中的乳腺癌数据集为例,给出三种特征选择方案的基本实现,并简要对比特征选择结果。加载数据集并导入必要的包:fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.feature_selectionimportSelectFromModel,SelectKBest,RFEfromsklearn.ensembleimportRandomForestClassifier通过在train_test_s中设置默认数据集来确保默认数据集训练模型一致分割:%%timeX,y=load_breast_cancer(return_X_y=True)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)rf=RandomForestClassifier(max_depth=5,random_state=3)rf.fit(X_train,y_train)rf.score(X_test,y_test)#OutputresultCPUtimes:user237ms,sys:17.5ms,total:254msWalltime:238ms0.9370629370629371过滤方法的特征选择方案,通过调用实现sklearn中选择KBest,内部使用F检验衡量特征与标签的相关性,选择的特征维度设置为20:%%timeX_skb=SelectKBest(k=20)。fit_transform(X,y)X_skb_train,X_skb_test,y_train,y_test=train_test_split(X_skb,y,random_state=3)rf=RandomForestClassifier(max_depth=5,random_state=3)rf.fit(X_skb_train,y_train)rf.score(X_skb_test,y_test)#输出CPU时间:用户204毫秒,系统:7.14毫秒,total:211msWalltime:208ms0.9300699300699301封装方法的特征选择方案是在sklearn中调用RFE实现的。传入的目标函数是算法模型为随机森林,特征选择维度也设置为20:%%timeX_rfe=rf(X_rfe_train,y_train)rf.score(X_rfe_test,y_test)#OutputresultCPUtimes:user2.76s,sys:4.57ms,total:2.76sWalltime:2.76s0.9370629370629371embedding方法的特征选择方案,在sklearn中调用SelectFromModel来实现,依赖算法模型也设置为随机森林,特征选择维度依然为20:%%timeX_sfm=SelectFromModel(RandomForestClassifier(),threshold=-1,max_features=20).fit_transform(X,y)X_sfm_train,X_sfm_test,y_train,y_test=train_test_split(X_sfm,y,random_state=3)rf=RandomForestClassifier(最大深度=5、random_state=3)rf.fit(X_sfm_train,y_train)rf.score(X_sfm_test,y_test)#输出结果CPUtimes:user455ms,sys:0ns,total:455msWalltime:453ms0.9370629370629371通过上面简单的对比实验,可以发现与原来的全特征方案相比,过滤法在只保留20维特征时带来了一定的算法性能损失,而wrapping法和embedding法保持了相同的模型效果,但embedding法消耗明显更短