Python机器学习库SKLearn的特征选择

参考地址:http://scikit-learn.org/stable/modules/feature_selection.html#feature-selection
sklearn.feature_selection模块中的类可用于样本集中的特征选择/维数降低,以提高估计器的准确度分数或提高其在非常高维数据集上的性能。
1.1 删除低方差特征
VarianceThreshold是特征选择的简单基线方法。 它删除方差不符合某个阈值的所有特征。 默认情况下,它会删除所有零方差特征,即所有样本中具有相同值的特征。

例如,假设我们有一个具有布尔特征的数据集,并且我们要删除超过80%的样本中的一个或零(开或关)的所有特征。 布尔特征是伯努利随机变量,这些变量的方差由下式给出


所以我们可以选择使用阈值.8 *(1 - .8):

>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
>>> sel.fit_transform(X)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])

1.2 单变量特征选择

通过选择基于单变量统计测试的最佳特征来进行单变量特征选择。 它可以被看作是估计器的预处理步骤。 Scikit学习将特征选择例程公开为实现变换方法的对象:

1)SelectKBest删除除k个最高得分特征之外的所有内容
2)SelectPercentile除去用户指定的最高得分百分比的特征
3)对每个特征使用常见的单变量统计检验:假阳性率SelectFpr,错误发现率SelectFdr或家族误差SelectFwe。
4)GenericUnivariateSelect允许使用可配置策略执行单变量特征选择。 这允许使用超参数搜索估计器来选择最佳的单变量选择策略。

例如,我们可以对样本执行测试,以仅检索两个最佳特征,如下所示:

>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import chi2
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)
这些对象作为输入一个评分函数,返回单变量分数和p值(或仅用于SelectKBest和SelectPercentile的分数):
对于回归:f_regression,mutual_info_regression
对于分类:chi2,f_classif,mutual_info_classif

基于F检验的方法估计两个随机变量之间的线性依赖程度。 另一方面,互信息方法可以捕获任何种类的统计依赖关系,但是非参数化,它们需要更多的样本进行准确的估计。

1.3 递归特征消除

 给定赋予特征的权重(例如,线性模型的系数)的外部估计器,递归特征消除(RFE)是通过递归地考虑更小和更小的特征集来选择特征。 首先,对初始特征集进行训练,并将权重分配给每个特征。 然后,从当前设置的特征中剪除绝对权重最小的特征。 在修剪的集合上递归地重复该过程,直到最终达到所要选择的要素数量为止。

  1.4使用SelectFromModel进行特征选择

SelectFromModel是一个元变换器,可以与任何在拟合后具有coef_或feature_importances_属性的估计器一起使用。 如果相应的coef_或feature_importances_值低于提供的阈值参数,则这些特征被认为是不重要的并被移除。 除了在数值上指定阈值之外,还有内置的启发式方法用于使用字符串参数来查找阈值。 可用的启发式是“平均值”,“中位数”和浮点数,如“0.1 * mean”。

1.4.1 基于L1-特征选择

用L1范数惩罚的线性模型具有稀疏解:他们的许多估计系数为零。 当目标是降低与另一个分类器一起使用的数据的维度时,它们可以与feature_selection.SelectFromModel一起使用以选择非零系数。 特别地,用于此目的的稀疏估计量是用于回归的linear_model.Lasso和用于分类的linear_model.LogisticRegression和svm.LinearSVC的线性估计。

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)

1.4.2 基于树的特征选择

基于树的估计器(参见sklearn.tree模块和sklearn.ensemble模块中的树的森林)可用于计算特征重要性,这又可以用于丢弃不相关的特征(当与sklearn.feature_selection.SelectFromModel ):

>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier()
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_  
array([ 0.04...,  0.05...,  0.4...,  0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape               
(150, 2)
1.4.3 特征选择作为管道的一部分

特征选择通常用作执行实际学习之前的预处理步骤。 在scikit学习中推荐的方法是使用sklearn.pipeline.Pipeline:

clf = Pipeline([
  ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
  ('classification', RandomForestClassifier())
])
clf.fit(X, y)


  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值