1.1 Wrapper包装法
包装法也是一个特征选择和算法训练同时进行的方法,与嵌入法十分相似,它也还一个依赖于算法自身的选择,比如coef_和feature_importances_属性来完成特征选择,不同的是,我们往往使用一个目标函数作为黑盒来帮助我们选取特征,而不是自己输入某个评估指标或统计量的阈值。包装法在初始特征集上训练评估器,并且通过coef_和feature_importances_属性获得每个特征的重要性,然后,从当前的一组特征中修剪最不重要的特征,接着在修剪过的集合上递归地重复该过程,直到最终得到所需数量的特征。区别于过滤法和嵌入法的易车训练解决所有问题,包装法需要使用特征子集进行多次训练,因此他所需要的计算成本最高。
注意,在这个图中的“算法”,指的不是我们最终用来导入数据的分类或回归算法,而是专业的数据挖掘算法,即我们的目标函数。这些数据挖掘算法的核心功能就是选取最佳特征子集。
最经典的目标函数是递归特征消除法(Recursive feature elimination,简写为RFE),它是一种贪婪的优化算法,旨在找到性能最优的特征子集,它反复创建模型,并在每次迭代时保留最佳特征或是剔除最差特征,下一次迭代时,它会使用上一次建模中没有被选中特征来构建下一个模型,直到所有的特征都耗尽为止。然后,它根据子集保留或是剔除特征的顺序来对特征进行排名,最后选出一个最佳子集。包装法的效果是所有特征选择方法中最利于提升模型表现的,它可以使用很少的特征达到很优秀的效果。除此之外,在特征数目相同时,包装法和嵌入法的效果能够匹敌,不过它比嵌入法算得更见缓慢,所以也不适用于太大型的数据。相比之下,包装法是最能保证模型效果的特征选择方法
1.2 feature_selection.RFE,递归特征消除法
class sklearn.feature_selection.RFE (estimator, n_features_to_select=None, step=1, verbose=0)
参数estimator是需要填写的实例化后的评估器,n_features_to_select是想要选择的特征个数,step表示每次迭代中希望移除的特征个数。除此之外,RFE类有两个很重要的属性, .support_:返回所有的特征的是否最后被选中的布尔矩阵,以及.ranking_返回特征的按数次迭代中综合重要性的排名。类feature_selection.RFECV会在交叉验证循环中执行RFE以找到最佳数量的特征,增加参数cv,其他用法都和RFE一模一样。
1.3 特征选择总结
经验来说,过滤法更快速,但更粗糙。包装法和嵌入法更精确,比较适合具体到算法去调整,但计算量比较大,运行时间长。当数据量很大的时候,优先使用方差过滤和互信息法调整,再上其他特征选择方法。使用逻辑回归时,优先使用嵌入法。使用支持向量机时,优先使用包装法。迷茫的时候,从过滤法走起,看具体数据具体分析。其实特征选择只是特征工程中的第一步。真正的高手,往往使用特征创造或特征提取来寻找高级特征。在Kaggle之类的算法竞赛中,很多高分团队都是在高级特征上做文章,而这是比调参和特征选择更难的,提升算法表现的高深方法。