特征工程是数据分析中最耗时间和精力的一部分工做,它不像算法和模型那样是肯定的步骤,更可能是工程上的经验和权衡。所以没有统一的方法。这里只是对一些经常使用的方法作一个总结。本文关注于特征选择部分。后面还有两篇会关注于特征表达和特征预处理。html
在作数据分析的时候,特征的来源通常有两块,一块是业务已经整理好各类特征数据,咱们须要去找出适合咱们问题须要的特征;另外一块是咱们从业务特征中本身去寻找高级数据特征。咱们就针对这两部分来分别讨论。算法
咱们首先看当业务已经整理好各类特征数据时,咱们如何去找出适合咱们问题须要的特征,此时特征数可能成百上千,哪些才是咱们须要的呢?segmentfault
第一步是找到该领域懂业务的专家,让他们给一些建议。好比咱们须要解决一个药品疗效的分类问题,那么先找到领域专家,向他们咨询哪些因素(特征)会对该药品的疗效产生影响,较大影响的和较小影响的都要。这些特征就是咱们的特征的第一候选集。机器学习
这个特征集合有时候也可能很大,在尝试降维以前,咱们有必要用特征工程的方法去选择出较重要的特征结合,这些方法不会用到领域知识,而仅仅是统计学的方法。函数
最简单的方法就是方差筛选。方差越大的特征,那么咱们能够认为它是比较有用的。若是方差较小,好比小于1,那么这个特征可能对咱们的算法做用没有那么大。最极端的,若是某个特征方差为0,即全部的样本该特征的取值都是同样的,那么它对咱们的模型训练没有任何做用,能够直接舍弃。在实际应用中,咱们会指定一个方差的阈值,当方差小于这个阈值的特征会被咱们筛掉。sklearn中的VarianceThreshold类能够很方便的完成这个工做。学习
特征选择方法有不少,通常分为三类:第一类过滤法比较简单,它按照特征的发散性或者相关性指标对各个特征进行评分,设定评分阈值或者待选择阈值的个数,选择合适特征。上面咱们提到的方差筛选就是过滤法的一种。第二类是包装法,根据目标函数,一般是预测效果评分,每次选择部分特征,或者排除部分特征。第三类嵌入法则稍微复杂一点,它先使用某些机器学习的算法和模型进行训练,获得各个特征的权值系数,根据权值系数从大到小来选择特征。相似于过滤法,可是它是经过机器学习训练来肯定特征的优劣,而不是直接从特征的一些统计学指标来肯定特征的优劣。下面咱们分别来看看3类方法。优化
上面咱们已经讲到了使用特征方差来过滤选择特征的过程。除了特征的方差这第一种方法,还有其余一些统计学指标可使用。code
第二个可使用的是相关系数。这个主要用于输出连续值的监督学习算法中。咱们分别计算全部训练集中各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。htm
第三个可使用的是假设检验,好比卡方检验。卡方检验能够检验某个特征分布和输出值分布之间的相关性。我的以为它比比粗暴的方差法好用。若是你们对卡方检验不熟悉,能够参看这篇卡方检验原理及应用,这里就不展开了。在sklearn中,可使用chi2这个类来作卡方检验获得全部特征的卡方值与显著性水平P临界值,咱们能够给定卡方值阈值, 选择卡方值较大的部分特征。blog
除了卡方检验,咱们还可使用F检验和t检验,它们都是使用假设检验的方法,只是使用的统计分布不是卡方分布,而是F分布和t分布而已。在sklearn中,有F检验的函数f_classif和f_regression,分别在分类和回归特征选择时使用。
第四个是互信息,即从信息熵的角度分析各个特征和输出值之间的关系评分。在决策树算法中咱们讲到过互信息(信息增益)。互信息值越大,说明该特征和输出值之间的相关性越大,越须要保留。在sklearn中,可使用mutual_info_classif(分类)和mutual_info_regression(回归)来计算各个输入特征和输出值之间的互信息。
以上就是过滤法的主要方法,我的经验是,在没有什么思路的 时候,能够优先使用卡方检验和互信息来作特征选择
包装法的解决思路没有过滤法这么直接,它会选择一个目标函数来一步步的筛选特征。
最经常使用的包装法是递归消除特征法(recursive feature elimination,如下简称RFE)。递归消除特征法使用一个机器学习模型来进行多轮训练,每轮训练后,消除若干权值系数的对应的特征,再基于新的特征集进行下一轮训练。在sklearn中,可使用RFE函数来选择特征。
咱们下面以经典的SVM-RFE算法来讨论这个特征选择的思路。这个算法以支持向量机来作RFE的机器学习模型选择特征。它在第一轮训练的时候,会选择全部的特征来训练,获得了分类的超平面$w \dot x+b=0$后,若是有n个特征,那么RFE-SVM会选择出$w$中份量的平方值$w_i^2$最小的那个序号i对应的特征,将其排除,在第二类的时候,特征数就剩下n-1个了,咱们继续用这n-1个特征和输出值来训练SVM,一样的,去掉$w_i^2$最小的那个序号i对应的特征。以此类推,直到剩下的特征数知足咱们的需求为止。
嵌入法也是用机器学习的方法来选择特征,可是它和RFE的区别是它不是经过不停的筛掉特征来进行训练,而是使用的都是特征全集。在sklearn中,使用SelectFromModel函数来选择特征。
最经常使用的是使用L1正则化和L2正则化来选择特征。在以前讲到的用scikit-learn和pandas学习Ridge回归第6节中,咱们讲到正则化惩罚项越大,那么模型的系数就会越小。当正则化惩罚项大到必定的程度的时候,部分特征系数会变成0,当正则化惩罚项继续增大到必定程度时,全部的特征系数都会趋于0. 可是咱们会发现一部分特征系数会更容易先变成0,这部分系数就是能够筛掉的。也就是说,咱们选择特征系数较大的特征。经常使用的L1正则化和L2正则化来选择特征的基学习器是逻辑回归。
此外也可使用决策树或者GBDT。那么是否是全部的机器学习方法均可以做为嵌入法的基学习器呢?也不是,通常来讲,能够获得特征系数coef或者能够获得特征重要度(feature importances)的算法才能够作为嵌入法的基学习器。
在咱们拿到已有的特征后,咱们还能够根据须要寻找到更多的高级特征。好比有车的路程特征和时间间隔特征,咱们就能够获得车的平均速度这个二级特征。根据车的速度特征,咱们就能够获得车的加速度这个三级特征,根据车的加速度特征,咱们就能够获得车的加加速度这个四级特征。。。也就是说,高级特征能够一直寻找下去。
在Kaggle之类的算法竞赛中,高分团队主要使用的方法除了集成学习算法,剩下的主要就是在高级特征上面作文章。因此寻找高级特征是模型优化的必要步骤之一。固然,在第一次创建模型的时候,咱们能够先不寻找高级特征,获得之后基准模型后,再寻找高级特征进行优化。
寻找高级特征最经常使用的方法有:
若干项特征加和: 咱们假设你但愿根据每日销售额获得一周销售额的特征。你能够将最近的7天的销售额相加获得。
若干项特征之差: 假设你已经拥有每周销售额以及每个月销售额两项特征,能够求一周前一月内的销售额。
若干项特征乘积: 假设你有商品价格和商品销量的特征,那么就能够获得销售额的特征。
若干项特征除商: 假设你有每一个用户的销售额和购买的商品件数,那么就是获得该用户平均每件商品的销售额。
固然,寻找高级特征的方法远不止于此,它须要你根据你的业务和模型须要而得,而不是随便的两两组合造成高级特征,这样容易致使特征爆炸,反而没有办法获得较好的模型。我的经验是,聚类的时候高级特征尽可能少一点,分类回归的时候高级特征适度的多一点。
特征选择是特征工程的第一步,它关系到咱们机器学习算法的上限。所以原则是尽可能不错过一个可能有用的特征,可是也不滥用太多的特征。
(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)