![3117400fb75fd224c116a605424a0b91.png](https://i-blog.csdnimg.cn/blog_migrate/fc8bbaeaa5a4f6c286625b1822349d7e.jpeg)
废话写在前面
准备换电脑啦~收拾电脑文档,发现了一篇关于特征选择的调研,我在调研的过程中,发现这方面可借鉴的资料还是比较有限、也不全面,如果有正在调研数据挖掘中的特征选择的同学,看到这篇文章,希望能让你们少走弯路,对你们有所帮助。
特征工程主要分为特征提取和特征选择两大类。
特征提取,如PCA,LDA ,ICA等算法,相当于生成了新的特征子集,往往用于图像识别等对于原数据解释性不高的场景。而数据挖掘的结果和应用往往需要对于原数据进行解释,使用特征提取会大大降低数据的可解释性甚至让数据变的不可解释。
特征选择,即从原特征集中选出最佳的特征子集,并不改变特征集的原始值,符合数据挖掘对于数据可解释性的要求。
经过大量文献调查,学术界对于特征选择的方法分类的共识是分为三大类。强烈推荐阅读综述[2],本文的主要内容基于该篇论文。
以下正文。
在特征选择阶段,可以采用独立的无监督学习算法(filter)、依赖于学习算法迭代地提高所选特征质量的算法(wrapper)、或者将特征选择阶段嵌入无监督学习过程的算法(embedded)。
l 依赖于学习算法迭代地提高所选特征质量的算法(wrapper)
全局搜索可以选出全局最优解,除此之外还有随机搜索、局部搜索。但是由于在剪枝之后需要搜索空间仍然很大,实际一般不用。
sequential search (Guyon and Elisseeff 2003), hill-climbing search, best-first search (Kohavi and John 1997; Arai et al. 2016), branch-and-bound search (Narendra and Fukunaga 1977), and genetic algorithms (Golberg 1989)
l sklearn.feature_selection模块中的wrapper方法
该模块仅实现了索寻找最优解的两种方法,为了方便理解,sklearn文档中提供了实现RFE和RFECV的两个实例。有文献显示,RFE可以取得很好的效果;也有资料显示,由于RFE可能会去除特征中保留的有效信息,会造成性能的下降。
sklearn文档中说,“RFECV通过交叉验证来找到最优的特征数量。如果减少特征会造成性能损失,那么将不会去除任何特征。这个方法用以选取单模型特征相当不错,但是有两个缺陷,一、计算量大。二、随着学习器(评估器)的改变,最佳特征组合也会改变,有些时候会造成不利影响。”
1. 递归特征消除(RFE)
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,移除若干权值系数的特征,再基于新的特征集进行下一轮训练。特征被消除的次序就是特征的排序。这是一种局部搜索寻找最优特征子集的贪心算法。
2. 交叉验证递归消除(RFECV)
使用交叉验证来保留最佳性能的特征。不过这里的交叉验证的数据集切割对象不再是行数据(样本),而是列数据(特征),同时学习器本身不变,最终得到不同特征对于score的重要程度,然后保留最佳的特征组合。
其分割方式类似于随机森林中的列上子采样。在一个交叉验证的循环中执行 RFE 来找到最优的特征数量。
l 特征权重排序算法(filter)
采用某种度量准则对于特征进行筛选。计算一些字段的属性例如,方差、距离、可分性度量、相关性度量、信息论度量,进行排序,选择最好的特征权重最高的字段作为特征。
Some representative criteria include feature discriminative ability to separate samples (Kira and Rendell 1992; Robnik-Šikonja and Kononenko 2003; Yang et al. 2011; Du et al. 2013; Tang et al. 2014), feature correlation (Koller and Sahami 1995; Guyon and Elisseeff 2003), mutual information (Yu and Liu 2003; Peng et al. 2005; Nguyen et al. 2014; Shishkin et al. 2016; Gao et al. 2016), feature ability to preserve data manifold structure (He et al. 2005; Zhao and Liu 2007; Gu et al. 2011b; Jiang and Ren 2011), and feature ability to reconstruct the original data (Masaeli et al. 2010; Farahat et al. 2011; Li et al. 2017a).
l sklearn.feature_selection模块中的filter方法
使用较为广泛的是单变量特征选择,为了实现单变量特征选择,该模块提供了特征选择函数,让用户可以使用已定义的参数进行特征选择,也可以自定义计算规则作为参数进行特征选择。
1. 移除低方差特征
VarianceThreshold(threshold)会移除方差不满足threshold的特征。默认情况下将会移除所有的零方差特征。
2. 单变量特征选择
sklearn提供了2个实现单变量特征选择的函数,分别是SelectKBest(选择结果最好的前k个特征)和SelectPercentile(选择结果最好的前x%的特征)。
这个两个函数原理一样,以SelectKBest(score_func=chi2,k=10)为例,此函数表示基于卡方检验选择前10个最好的特征。score_func是需要传入的计算的规则(定义好的特征计算函数)。sklearn提供了5个已定义好的参数,将参数名直接传入score_func,就可以进行对应的计算。
参数有:用于回归的f_regression、mutual_info_regression,用于分类的chi2、f_classif、mutual_info_classif。
使用上述参数,对于回归和分类,可以直接实现的特征选择如下。
a) 方差分析
f_regression作为参数,用于回归模型。它计算每个变量与目标变量的相关系数,然后计算出F值和P值。根据F值和P值对于特征进行筛选。
f_classif作为参数,用于分类模型。它以F分布为依据,利用平方和与自由度计算方差分析(ANOVA)的F值(组间均方/组内均方)。根据F值对于特征进行筛选。
b) 卡方检验
chi2作为参数,进行卡方检验,使用卡方进行筛选。
c) 互信息
mutual_info_classif作为参数,用于分类模型。基于互信息选择特征。互信息方法可以捕捉任何一种统计依赖,但是作为非参数方法,需要更多的样本进行准确的估计。
mutual_info_regression作为参数,用于回归模型。基于互信息选择特征。互信息用于度量 X 和 Y 共享的信息:度量知道这两个变量其中一个,对另一个不确定度减少的程度。
由于score_func与SelectKBest实现框架是分离的,可以将输入的sscore_func替换成其他计算函数或lambda表达式,用于实现自定义单变量特征选择的方法,例如基于距离、基于最大信息系数等。
一个计算pearson相关系数选择特征的实例:
SelectKBest(array(map(pearsonr(x, Y), X.T)).T, k=10).
l 嵌入式方法(embedded)
嵌入式特征选择是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成。例如利用回归模型的系数选择特征,基于树模型的特征选择(随机森林的平均不纯度减少(mean decrease impority)和平均精确率减少(Mean Decrease Accuracy))。
嵌入式方法是将特征选择嵌入模型学习的filter和wrapper方法之间的权衡,它们继承了包装器和过滤方法的优点:(1)它们包括与学习算法的交互;(2)它们不需要迭代地评估特征集。
l sklearn.feature_selection模块中的embedded方法
有些机器学习模型本身具有对特征进行打分的机制,可以运用到特征选择任务中,例如回归模型,SVM,决策树,随机森林等等。为了实现这一功能,该模块提供了SelectFromModel(Model)函数,这是一个通用转换器,Model只要带有conef_或feature_importances属性,那么就可以作为SelectFromModel的Model来使用。SelectFromModel通过模型本身给出的指标对特征进行选择,也就是基于conef_或feature_importances的属性值对于特征进行筛选。
在sklearn中,主要实现可以分成基于惩罚项的特征选择法和基于树模型的特征选择法。
1. 基于惩罚项
使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。例如使用结合L1惩罚项的逻辑回归模型。L1保留多个对目标值具有同等相关性的特征中的一个,从而实现了降维。实现如下:
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).
2. 基于树模型
可以使用决策树、随机森林、Boosting、XGBoost等算法进行特征选择。例如,使用GBDT模型进行特征选择:
SelectFromModel(GradientBoostingClassifier(()).
参考
[1] (美)Pang-Ning Tan等著.数据挖掘导论. 范明等译. 北京:人民邮电出版社,2011.
[2] Jundong Li, Kewei Cheng, Suhang Wang, Fred Morstatter, Robert P. Trevino, Jiliang Tang, and Huan Liu. 2017. Feature Selection: A Data Perspective. ACM Comput. Surv. 50, 6, Article 94 (December 2017), 45 pages. https://doi.org/10.1145/3136625
[3] scikit-learn 0.19.x 中文文档. http://sklearn.apachecn.org/#/