页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

sklearn.feature_selection模块中的类可以用于样本集中的特征选择/维数降低,以提高估计器的准确度分数或提高其在非常高维数据集上的性能。

删除低方差特征

VarianceThreshold是特征选择的简单基线方法。它删除方差不符合某个阈值的所有特征。默认情况下,它会删除所有零差异特征,即所有样本中具有相同值的特征。

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

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

代码块
languagepy
>>> 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已经删除了第一列,其具有包含零的概率。

 

单变量特征选择

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

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

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

代码块
languagepy
>>> 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检验的方法估计两个随机变量之间的线性依赖程度。另一方面,互信息方法可以捕获任何种类的统计依赖,但是非参数化,它们需要更多的样本进行准确的估计。

特征选择与稀疏数据

如果你使用稀疏数据(即表示为稀疏矩阵数据) chi2mutual_info_regressionmutual_info_classif 将处理数据,而使其密集。

警告

 

小心不要使用具有分类问题的回归计分功能,您将获得无用的结果。

递归特征消除

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

RFECV 在交叉验证循环中执行RFE以找到最佳数量的特征。

例子:

 

使用SelectFromModel功能选择

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

有关如何使用的示例,请参阅以下部分。

例子

基于L1-特征选择

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

代码块
languagepy
>>> 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和逻辑回归,参数C控制稀疏度:较小的C选择的功能越少。使用Lasso,Alpha参数越高,所选的功能越少。

例子:

L1恢复和压缩感测

对于α的好选择,只要满足某些特定条件,Lasso可以仅使用少量观察结果完全恢复精确的一组非零变量。特别地,样本数应该“足够大”,否则L1模型将随机执行,其中“足够大”取决于非零系数的数量,特征数的对数,噪声量,非零系数的最小绝对值以及设计矩阵X的结构。此外,设计矩阵必须显示某些特定属性,例如不太相关。

选择用于恢复非零系数的alpha参数没有一般规则。它可以通过交叉验证(LassoCVLassoLarsCV)进行设置,尽管这可能导致处罚不力的模型:包括少量非相关变量对预测分数不是有害的。LassoLarsIC相反,BIC()倾向于设置高的α值。

参考 Richard G. Baraniuk“压缩感知”,IEEE信号处理杂志[120] 2007年7月http://dsp.rice.edu/sites/dsp.rice.edu/files/cs/baraniukCSlecture07.pdf

 

随机稀疏模型

在特征选择方面,有一些众所周知的用于回归和分类的L1惩罚模型的限制。例如,已知Lasso将倾向于从一组高度相关的特征中选择一个单独的变量。此外,即使特征之间的相关性不太高,L1惩罚方法一致地选择“良好”特征的条件一般也可以是限制性的。

为了减轻这个问题,可以使用诸如[B2009][M2010]中提出的随机化技术。被称为稳定性选择的后一种技术在模块中实现sklearn.linear_model。在稳定性选择方法中,数据的子样本适合于L1惩罚模型,其中系数的随机子集的惩罚已经被缩放。具体地,给定数据的子样本 ,其中是大小数据的随机子集n_i个,获得以下修改的套索拟合:

在哪里是公平的伯努利随机变量的独立试验,是比例因子。通过在不同随机子样本和伯努利试验中重复此过程,可以计算随机化程序选择每个特征的次数,并将这些分数用作特征选择的分数。

RandomizedLasso使用Lasso实现这种回归设置策略,同时RandomizedLogisticRegression使用逻辑回归,适用于分类任务。要获得可以使用的稳定性分数的完整路径lasso_stability_path

注意,随机稀疏模型在检测非零特征时比标准F统计量更强大,地面实数模型应该是稀疏的,换句话说,应该只有一小部分特征不为零。

例子:

参考文献:

[B2009]F.Bach,“Model-Consistent Sparse Estimation through the Bootstrap”,https://hal.inria.fr/hal-00354771/
[M2010]N.Meinshausen,P.Bohlmann,“Stability selection”,Journal of the Royal Statistical Society,72(2010)http://arxiv.org/pdf/0809.2932.pdf

 

基于树的特征选择

基于树的估计器(参见sklearn.tree模块中树的模块和森林sklearn.ensemble)可以用于计算特征重要性,而后者又可用于丢弃不相关的特征(与sklearn.feature_selection.SelectFromModel 元变换器耦合时):

代码块
languagepy
>>> 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)

例子:

 

功能选择作为管道的一部分

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

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

 

在这个片段中,我们利用一个sklearn.svm.LinearSVC 耦合sklearn.feature_selection.SelectFromModel 来评估特征重要性并选择最相关的特征。然后,a sklearn.ensemble.RandomForestClassifier对转换的输出进行训练,即仅使用相关的特征。您可以使用其他功能选择方法和分类器执行类似的操作,以提供评估功能重要性的方法。有关sklearn.pipeline.Pipeline详细信息,请参阅示例。