sklearn中的特征选择方法
sklearn.feature_selection中提供了丰富的特征选择方法,包括单变量选择和递归的特征消除方法。
最简单的特征选择方法应该算是VarianceThreshold。该方法用来对特征值非常集中的特征进行筛除。只对方差达到给定大小的特征予以保留。但其实这种特征一般在EDA过程中就可以人工地发现,并手动删除。
其默认筛除方差为0,也就是值全部相等的特征。
单变量选择
单变量选择方法通过对各特征变量进行统计检验,衡量特征与目标变量之间的关系,根据得分选择相对好的特征。
sklearn.feature_selection.中提供的评分的标准包括
- chi2——卡方
- f_classif——方差分析,返回F值和P值
- f_regression——特征与目标特征的相关系数,返回F值和P值
- mutual_info_classif——用于分类问题(目标特征是离散的)的互信息
- mutual_info_regression——用于回归问题(目标特征是连续的)的互信息
具体的选择方法包括
- SelectKBest——保留k个最高分的特征
- SelectPercentile——保留得分在前指定百分位的特征
- SelectFdr——基于假正率FPR选择p值小于给定的值的特征
- SelectFpr——基于错误发现率选择p值小于给定的值的特征
- SelectFwe——基于总体错误率选择p值小于给定的值的特征
- GenericUnivariateSelect——能采用超参数搜索的方式选择最好的单变量选择策略。其mode参数可指定特征选择模式‘percentile’, ‘k_best’, ‘fpr’, ‘fdr’, ‘fwe’。
递归特征消除
通过一个模型拟合数据,来分配各个特征的权重。根据参数,把一部分权重低的特征剔除。如此迭代,直到最终剩下的特征数目达到要求。
scklearn中提供了两个方法实现递归的特征消除,RFE和RFECV。
都是用step参数来指定每次迭代剔除的特征数,如果step为大于1的整数,则每次去掉step个特征;如果为0到1之间的小数,表示剔除特征的比例。
两者的不同在于,RFE通过n_features_select指定最终要得到的特征数目。
而RFECV采用交叉验证方式,来寻找最优特征数目,只用参数min_features_to_select限制了最小特征数。此外多了cv参数来制定交叉验证方式,默认为5层叠交叉验证。
SelectFromModel
SelectFromModel可以直接与带有 coef_ 或 feature_importances_特征重要性属性的模型一起使用。训练模型后,可将特征重要性小于 threshold 参数给定阈值的特征剔除。
threshold 参数可以数值地指定阈值,也可以通过字符串,如“mean”, “median” 或 “0.1*mean”来确定阈值。默认threshold使用“mean”。而如果使用的模型具有 l1 范数正则项,则默认使用 1e-5为阈值。
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
>>> X = [[ 0.87, -1.34, 0.31 ],
... [-2.79, -0.02, -0.85 ],
... [-1.34, -0.48, -2.55 ],
... [ 1.92, 1.48, 0.65 ]]
>>> y = [0, 1, 0, 1]
>>> selector = SelectFromModel(estimator=LogisticRegression()).fit(X, y)
>>> selector.estimator_.coef_
array([[-0.3252302 , 0.83462377, 0.49750423]])
>>> selector.threshold_
0.55245...
>>> selector.get_support() #只选择第二列特征
array([False, True, False])
>>> selector.transform(X) #将特征选择器 用于输入数据,获得特征数据集
array([[-1.34],
[-0.02],
[-0.48],
[ 1.48]])