sklearn_Feature selection(特征选择)

From: 

http://sklearn.apachecn.org/cn/0.19.0/modules/feature_selection.html#feature-selection

https://www.jianshu.com/p/b3056d10a20f


目录

 

1.13. 特征选择

1.13.1. 移除低方差特征

1.13.2. 单变量特征选择

1.13.3. 递归式特征消除

1.13.4. 使用 SelectFromModel 选取特征

1.13.4.1. 基于 L1 范数的特征选取

1.13.4.2. 基于 Tree(树)的特征选取

1.13.5. 特征选取作为 pipeline的一部分


1.13. 特征选择

在 sklearn.feature_selection 模块中的类可以用来对样本集进行 feature selection(特征选择)和 dimensionality reduction(降维),这将会提高估计器的准确度或者增强它们在高维数据集上的性能。

1.13.1. 移除低方差特征

VarianceThreshold 是特征选择的一个简单基本方法,它会移除所有那些方差不满足一些阈值的特征。默认情况下,它将会移除所有的零方差特征,即那些在所有的样本上的取值均不变的特征。

例如,假设我们有一个特征是布尔值的数据集,我们想要移除那些在整个数据集中特征值为0或者为1的比例超过80%的特征。布尔特征是伯努利( Bernoulli )随机变量,变量的方差为

\mathrm{Var}[X] = p(1 - p)

因此,我们可以使用阈值 ".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]])

正如预期一样, VarianceThreshold 移除了第一列,它的值为 0 的概率为 p = 5/6 > .8 。

1.13.2. 单变量特征选择

单变量的特征选择是通过基于单变量的统计测试来选择最好的特征。它可以当做是评估器的预处理步骤。Scikit-learn 将特征选择的内容作为实现了 transform 方法的对象:

  • SelectKBest 移除那些除了评分最高的 K 个特征之外的所有特征
  • SelectPercentile 移除除了用户指定的最高得分百分比之外的所有特征
  • 对每个特征应用常见的单变量统计测试: 假正率 SelectFpr, 错误发现率 SelectFdr , 或者总体错误率 SelectFwe 
  • GenericUnivariateSelect 允许使用可配置方法来进行单变量特征选择。它允许超参数搜索评估器来选择最好的单变量特征。

例如下面的实例,我们可以使用 \chi^2 检验样本集来选择最好的两个特征:

>>>

>>> 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)

SelectKBest 和 SelectPerecntile 能够返回特征评价的得分和P值:

sklearn.feature_selection.SelectPercentile(score_func=<function f_classif>, percentile=10)
sklearn.feature_selection.SelectKBest(score_func=<function f_classif>, k=10)

其中的参数 score_func 有以下选项:

  • 回归:
    f_regression :相关系数,计算每个变量与目标变量的相关系数,然后计算出F值和P值; 

  mutual_info_regression:互信息,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。

      (参考:http://www.cnblogs.com/gatherstars/p/6004075.html)

  • 分类 :
    chi2:卡方检验;
    f_classif:方差分析,计算方差分析(ANOVA)的F值 (组间均方 / 组内均方);
    mutual_info_classif:互信息,互信息方法可以捕捉任何一种统计依赖,但是作为非参数方法,需要更多的样本进行准确的估计。

这些基于 F-test 的方法计算两个随机变量之间的线性相关程度。另一方面,mutual information methods(互信息)能够计算任何种类的统计相关性,但是作为非参数的方法,互信息需要更多的样本来进行准确的估计。

稀疏数据的特征选择

如果你使用的是稀疏的数据 (例如数据可以由稀疏矩阵来表示),

chi2 , mutual_info_regression , mutual_info_classif 可以处理数据并保持它的稀疏性。

Examples:

1.13.3. 递归式特征消除

给定一个外部的估计器,可以对特征赋予一定的权重(比如,线性模型的相关系数),recursive feature elimination ( RFE ) 通过使用越来越小的特征集合来递归地选择特征。 首先,评估器在初始的特征集合上面训练( 每一个特征的重要程度是通过一个 coef_ 属性 或者 feature_importances_ 属性来获得的 )。 然后,从当前的特征集合中淘汰权重最低的特征。在特征集合上不断的递归这个步骤,直到最终达到所需要的特征数量为止。 RFECV 在一个交叉验证的循环中执行 RFE 来找到最优的特征数量

示例:

1.13.4. 使用 SelectFromModel 选取特征

SelectFromModel 是一个 meta-transformer(元转换器) ,它可以用来处理任何带有 coef_ 或者 feature_importances_ 属性的训练之后的评估器。 如果相关的 "coef_" 或者 featureimportances 属性值低于预先设置的阈值,我们就认为这些特征是不重要的。除了指定数值上的阈值之外,还可以通过给定字符串参数来使用内置的启发式方法,来找到一个合适的阈值。有效的启发式方法有 mean,  median 以及使用浮点数乘以这些(例如,0.1*mean )。

有关如何使用的例子,可以参阅下面的例子。

Examples

1.13.4.1. 基于 L1 范数的特征选取

Linear models 使用 L1 范数的线性模型有一个稀疏解:他们的许多估计系数均为 0。当降维的目的是为了使用其他分类器时, 它们可以与 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)

在SVM和Logistic回归中,参数 C 控制着稀疏性,C越小选择的特征越少。在Lasso中,参数 alpha越大,选择的特征越少。

示例:

L1-recovery 和 compressive sensing(压缩感知)

当选择了正确的 alpha 值以后, Lasso 可以仅通过少量观察点便恢复完整的非零特征, 假设特定的条件可以被满足的话。特别的,数据量需要 “足够大” ,不然 L1 模型的表现将缺乏保障。 “足够大” 的定义取决于非零系数的个数、特征数量的对数值、噪音的数量、非零系数的最小绝对值、 以及设计矩阵(design maxtrix) X 的结构。特征矩阵必须有特定的性质,如数据不能过度相关。

关于如何选择 alpha 值没有固定的规则。alpha 值可以通过交叉验证来确定( LassoCV 或者 LassoLarsCV ),尽管这可能会导致欠惩罚的模型:包括少量的无关变量对于预测值来说并非致命的。相反的, BIC( LassoLarsIC )倾向于给定高 alpha 值。

Reference(参考文献) Richard G. Baraniuk “Compressive Sensing”, IEEE Signal Processing Magazine [120] July 2007http://dsp.rice.edu/sites/dsp.rice.edu/files/cs/baraniukCSlecture07.pdf

1.13.4.2. 基于 Tree(树)的特征选取

基于树的 estimators (查阅 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.13.5. 特征选取作为 pipeline的一部分

特征选择通常在实际的学习之前用来做预处理。在 scikit-learn 中推荐的方式是使用 :sklearn.pipeline.Pipeline:

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

在这段代码中,我们利用 sklearn.svm.LinearSVC 和 sklearn.feature_selection.SelectFromModel 来评估特征的重要性并且选择出相关的特征。 然后,在转化后的输出中使用一个 sklearn.ensemble.RandomForestClassifier 分类器,比如只使用相关的特征。你也可以使用其他特征选择的方法和可以提供评估特征重要性的分类器来执行相似的操作。 请查阅 sklearn.pipeline.Pipeline 来了解更多的实例。

猜你喜欢

转载自blog.csdn.net/weixin_42280517/article/details/82466937