sklearn特征选择方法及参数

  本文结合sklearn中的特征选择的方法,讲解相关方法函数及参数的含义。

1. 移除低方差特征

  方差越大的特征,可以认为是对目标变量越有影响的特征,是我们需要研究的特征。可以利用 VarianceThreshold,移除方差不满足一定阈值的特征。

  class sklearn.feature_selection.VarianceThreshold(threshold=0.0)

  参数 threshold 为设定的方差阈值,小于该值的特征将被移除,默认取值0,即移除方差为0的特征。

  需要注意的是,不同分布的数据,方差的计算方式不同。连续性变量的方差,大家都比较熟悉它的计算方式;但是离散型变量的方差,计算就有所不同了。例如官方文档中的例子,假设一个二元随机变量,它的取值为0、1,服从二项分布,而二项分布的方差计算公式为:D(x) = n*p*q = n*p*(1-p),p为实验“成功”的概率,q为失败的概率,n为试验次数。(注:官方文档中写的方差计算公式少了n,个人认为他是错的,虽然不影响结果。如果我理解错了,也希望博友指正。)。针对二元变量,我们希望取值为0或者1比例不要太大。例如,我们不希望其中一个取值的比例超过80%,那么,此时 threshold 参数的可设置为:threshold = 0.8*(1- 0.8)。

2. 单变量特征选择

  所谓的单变量特征选择,就是对样本数据中的特征分别进行统计检验,并根据检验结果对特征进行评分,然后按照设定的规则进行筛选。主要有以下四种方法:

  • SelectKBest(score_func,k)

  其中 score_func 传入用于特征评分的统计检验方法,默认是 f_classif,它计算的是单变量与训练 target 间的方差分析F值(Anova F-value);k 传入用户想要根据评分从高到低留下的变量的个数,默认是10。

  注意,当选用默认的 f_classif 方法时,只适用于分类任务,即目标变量为分类变量(因为只有目标变量是分类变量,才好进行方差分析)。

  • SelectPercentile(score_func,percentile)

  其中 score_func 同上;percentile 传入用户想要根据评分从高到低留下的变量个数占总个数的比例,默认10,表示10%。 

  • SelectFpr(score_func,alpha)

  通过控制统计检验中取伪错误发生的概率来选择特征,其中score_func同上;alpha用来控制置信水平,alpha值为保留该变量的最高p值,即p值大于该值,移除对应的变量。

  • GenericUnivariateSelect(score_func,mode,param)

  这是一个整合上述几种方法的广义方法,其中score_func同上;mode 用来指定特征选择的方法,可选项有{‘percentile’, ‘k_best’, ‘fpr’, ‘fdr’, ‘fwe’},与上面几种方法相对应;param的输入取决于mode中指定的方式,即指定方式对应的传入参数。

3. 递归特征消除法

  class sklearn.feature_selection.RFECV(estimatorstep=1cv=Nonescoring=Noneverbose=0n_jobs=1)

  递归特征消除法(Recursive feature elimination)的基本思想是反复地构建多个模型(如回归模型、支持向量机等),例如,在回归任务中,对n个变量,第一轮构造n个模型,每个模型都对应着剔除掉一个变量,选择出其中效果最佳的模型对应的变量,将其剔除,再进入第二轮,这样通过递归构建模型,最终将剩余的变量控制在最佳的水平,这类似交叉验证(cross validation)的过程,我们使用 sklearn.feature_selection中的RFECV() 来实施这个过程,其具体参数如下: 

  estimator:该参数传入用于递归构建模型的有监督型基学习器,要求该基学习器具有fit方法,且其输出含有coef_或feature_importances_这种结果;

  step:数值型,默认为1,控制每次迭代过程中删去的特征个数,有以下两种情况:

    1.若传入大于等于1的整数,则在每次迭代构建模型的过程中删去对应数量的特征;

    2.若传入介于0.0到1.0之间的浮点数,则在每次第迭代构造模型的过程中删去对应比例的特征。

  cv:控制交叉验证的分割策略,默认是3折交叉验证,有以下几种情况:

    1.None,等价于不传入参数,即使用默认设置的3折交叉验证;

    2.正整数,这时即指定了交叉验证中分裂的子集个数,即k折中的k;

  n_jobs:控制并行运算中利用到的CPU核心数,默认为1,即单核工作,若设置为-1,则启用所有核心进行运算;

  函数返回值: 

  n_features_:通过交叉验证过程最终剩下的特征个数;

  support_:被选择的特征的被选择情况(True表示被选择,False表示被淘汰);

  ranking_:所有特征的评分排名;

  estimator_:利用剩下的特征训练出的模型;

参考: https://www.cnblogs.com/feffery/p/8808398.html#commentform

  

  

猜你喜欢

转载自www.cnblogs.com/solong1989/p/9637134.html