sklearn-特征工程之特征选择

时间:2020-12-25 23:54:04

title: sklearn-特征工程之特征选择
date: 2016-11-25 22:49:24
categories: skearn
tags: sklearn
---

抄袭/参考资料


当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:

  • 特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
  • 特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。

根据特征选择的形式又可以将特征选择方法分为3种:

  • Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
  • Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
  • Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

我们使用sklearn中的feature_selection库来进行特征选择。

Filter:过滤法

方差选择法

VarianceThreshold 是特征选择中的一项基本方法。它会移除所有方差不满足阈值的特征。默认设置下,它将移除所有方差为0的特征,即那些在所有样本中数值完全相同的特征。

from sklearn.feature_selection import VarianceThreshold
# 设置方差阈值为100
sel = VarianceThreshold(threshold=100)
sel.fit_transform(X)

单变量特征选择

单变量特征选择基于单变量的统计测试来选择最佳特征。它可以看作预测模型的一项预处理。Scikit-learn将特征选择程序用包含transform 函数的对象来展现:

  • SelectKBest 移除得分前 \(k\) 名以外的所有特征
  • SelectPercentile 移除得分在用户指定百分比以后的特征
  • 对每个特征使用通用的单变量统计测试: 假正率(false positive rate) SelectFpr, 伪发现率(false discovery rate) SelectFdr, 或族系误差率 SelectFwe.
  • GenericUnivariateSelect 可以设置不同的策略来进行单变量特征选择。同时不同的选择策略也能够使用超参数寻优,从而让我们找到最佳的单变量特征选择策略。

这些作为打分函数输入的对象(同样位于feature_selection模块中),返回单变量的概率值:

相关系数法

卡方检验

互信息法


Wrapper:包装法

递归特征消除法

递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。


Embedded:嵌入法 / 基于模型进行特征选择

基于惩罚项的特征选择法

class sklearn.feature_selection.SelectFromModel(estimator, 
                                                threshold=None, 
                                                prefit=False)

使用L1范数作为惩罚项的:ref:Linear models会得到稀疏解:大部分特征对应的系数为0。当你希望减少特征的维度以用于其它分类器时,可以通过 feature_selection.SelectFromModel 来选择不为0的系数。特别指出,常用于此目的的稀疏预测模型有:

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Lasso

lr = Lasso(alpha=10)
lr.fit(X,y)

#带L1惩罚项的逻辑回归作为基模型的特征选择
model = SelectFromModel(lr, prefit=True)
model.transform(X)

基于树模型的特征选择法

基于树的预测模型(见 sklearn.tree 模块,森林见 sklearn.ensemble 模块)能够用来计算特征的重要程度,因此能用来去除不相关的特征(结合 sklearn.feature_selection.SelectFromModel )

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingRegressor

gbdt = GradientBoostingRegressor()
gbdt.fit(X,y)

#GBDT作为基模型的特征选择
model = SelectFromModel(gbdt, prefit=True)
model.transform(X)