精华内容
下载资源
问答
  • sklearn 特征选择

    千次阅读 2018-11-26 10:55:04
    特征选择 转至元数据结尾 创建: 片刻,最新修改于: 2017-09-27 转至元数据起始   删除低方差特征 单变量特征选择 递归特征消除 使用SelectFromModel功能选择 基于L1-特征选择 随机稀疏模型 基于树...

    特征选择

    转至元数据结尾

    转至元数据起始

     

     

    原文链接 : http://scikit-learn.org/stable/modules/feature_selection.html

    译文链接 : http://cwiki.apachecn.org/pages/viewpage.action?pageId=10814341

    贡献者 : 片刻 ApacheCN Apache中文网

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

    删除低方差特征

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

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

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

    >>> from sklearn.feature_selection import VarianceThreshold

    >>> X = [[001], [010], [100], [011], [010], [011]]

    >>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))

    >>> sel.fit_transform(X)

    array([[01],

           [10],

           [00],

           [11],

           [10],

           [11]]) 

    如预期的那样,VarianceThreshold已经删除了第一列,其具有包含零的概率。

     

    单变量特征选择

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

    • SelectKBest除去ķ最高得分功能之外的所有功能
    • SelectPercentile 删除除用户指定的最高得分百分比的功能之外的所有内容
    • 对每个特征使用常见的单变量统计检验:假阳性率SelectFpr,假发现率 SelectFdr或家族误差SelectFwe
    • 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

    (1504)

    >>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y)

    >>> X_new.shape

    (1502

    这些对象将输入一个评分函数作为输入,该函数返回单变量分数和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 归类和分类:

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

    (1504)

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

    (1503

    使用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 元变换器耦合时):

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

    (1504)

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

    (1502)

    例子:

     

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

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

    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详细信息,请参阅示例。

    展开全文
  • 特征选择 (feature_selection) Filter 1. 移除低方差的特征 (Removing features with low variance) 2. 单变量特征选择 (Univariate feature selection) Wrapper 3. 递归特征消除 (Recursive...

    目录

    特征选择 (feature_selection)

    Filter

    1. 移除低方差的特征 (Removing features with low variance)

    2. 单变量特征选择 (Univariate feature selection)

    Wrapper

    3. 递归特征消除 (Recursive Feature Elimination)

    Embedded

    4. 使用SelectFromModel选择特征 (Feature selection using SelectFromModel)

    5. 将特征选择过程融入pipeline (Feature selection as part of a pipeline)


     

    scikit-learn(工程中用的相对较多的模型介绍):1.13. Feature selection

    原创 2015年08月07日 09:03:28

    参考:http://scikit-learn.org/stable/modules/feature_selection.html

    The classes in the sklearn.feature_selection module can be used for feature selection/dimensionality reduction on sample sets, either to improve estimators’ accuracy scores or to boost their performance on very high-dimensional datasets.

    1removing features with low variance

    VarianceThreshold 是特征选择的简单baseline方法,他删除方差达不到阈值的特征。默认情况下,删除all zero-variance features, i.e. features that have the same value in all samples.
    假设我们想要删除  超过80%的样本数都是0或都是1(假设是boolean features  的所有特征,由于boolean featuresbernoulli随机变量,所以方差为Var[X] = p(1-p),所以我们可以使用阈值0.8*1-0.8):

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

    删除了第一列,因为p=5/6 > 0.8。

    2Univariate feature selection(单变量特征选择)(我用这个非常多)

    Univariate feature selection基于univariate statistical tests(单变量统计检验),分为:
    SelectKBest removes all but the  k highest scoring features

    • SelectPercentile removes all but a user-specified highest scoring percentage of features
    • using common univariate statistical tests for each feature: false positive rate SelectFpr, false discovery rate SelectFdr, or family wise error SelectFwe.
    • GenericUnivariateSelect allows to perform univariate feature selection with a configurable strategy. This allows to select the best univariate selection strategy with hyper-parameter search estimator.

    例如,我们可以对样本集使用卡方检测,进而选择最好的两个features

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


    几个注意点:

    1These objects take as input a scoring function that returns univariate p-valuesFor regression: f_regressionFor classification: chi2 or f_classif 

    Beware not to use a regression scoring function with a classification problem, you will get useless results.

    2)Feature selection with sparse data:If you use sparse data (i.e. data represented as sparse matrices), only chi2 will deal with the data without making it dense.例子:Univariate Feature Selection

    3recursive feature elimination(递归特征消除)

    Given an external estimator that assigns weights to features (e.g., the coefficients of a linear model), recursive feature elimination (RFE) is to select features by recursively considering smaller and smaller sets of features.(从最初的所有特征集到逐步删除一个feature< features whose absolute weights are the smallest are pruned from the current set features>,最后达到满足条件的features个数)。

    RFECV performs RFE in a cross-validation loop to find the optimal number of features.
    Recursive feature elimination: A recursive feature elimination example showing the relevance of pixels in a digit classification task.

    4L1-based feature selection

    L1的sparse作用就不说了:

    >>> from sklearn.svm import LinearSVC
    >>> from sklearn.datasets import load_iris
    >>> iris = load_iris()
    >>> X, y = iris.data, iris.target
    >>> X.shape
    (150, 4)
    >>> X_new = LinearSVC(C=0.01, penalty="l1", dual=False).fit_transform(X, y)
    >>> X_new.shape
    (150, 3)

    With SVMs and logistic-regression, the parameter C controls the sparsity: the smaller C the fewer features selected. With Lasso, the higher the alpha parameter, the fewer features selected.

    Examples:

    5Tree-based features selection(这个也用的比价多)

    Tree-based estimators (see the sklearn.tree module and forest of trees in the sklearn.ensemble module) can be used to compute feature importances, which in turn can be used to discard irrelevant features:

    >>> from sklearn.ensemble import ExtraTreesClassifier
    >>> from sklearn.datasets import load_iris
    >>> iris = load_iris()
    >>> X, y = iris.data, iris.target
    >>> X.shape
    (150, 4)
    >>> clf = ExtraTreesClassifier()
    >>> X_new = clf.fit(X, y).transform(X)
    >>> clf.feature_importances_ 
    array([ 0.04...,  0.05...,  0.4...,  0.4...])
    >>> X_new.shape              
    (150, 2)

     

    6Feature selection as part of a pipeline

    Feature selection is usually used as a pre-processing step before doing the actual learning. The recommended way to do this in scikit-learn is to use a sklearn.pipeline.Pipeline:

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

    In this snippet we make use of a sklearn.svm.LinearSVC to evaluate feature importances and select the most relevant features. Then, a sklearn.ensemble.RandomForestClassifier is trained on the transformed output, i.e. using only relevant features. You can perform similar operations with the other feature selection methods and also classifiers that provide a way to evaluate feature importances of course. See the sklearn.pipeline.Pipeline examples for more details.

     

     

    特征选择 (feature_selection)

    特征选择 (feature_selection)

    [toc]

    本文主要参考sklearn(0.18版为主,部分0.17)1.13节的官方文档,以及一些工程实践整理而成。

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

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

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

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

    特征选择主要有两个目的:

    • 减少特征数量、降维,使模型泛化能力更强,减少过拟合;
    • 增强对特征和特征值之间的理解。

      拿到数据集,一个特征选择方法,往往很难同时完成这两个目的。通常情况下,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的)。本文将结合 Scikit-learn提供的例子 介绍几种常用的特征选择方法,它们各自的优缺点和问题。

    Filter:

    1. 移除低方差的特征 (Removing features with low variance)

      假设某特征的特征值只有01,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用。而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。

    >>> 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的概率达到了5/6.

    2. 单变量特征选择 (Univariate feature selection)

      单变量特征选择的原理是分别单独的计算每个变量的某个统计指标,根据该指标来判断哪些指标重要,剔除那些不重要的指标。

      对于分类问题(y离散),可采用:
        卡方检验f_classifmutual_info_classif互信息
      对于回归问题(y连续),可采用:
        皮尔森相关系数f_regressionmutual_info_regression最大信息系数

      这种方法比较简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效)。这种方法有许多改进的版本、变种。

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

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

      将特征输入到评分函数,返回一个单变量的f_score(F检验的值)p-values(P值,假设检验中的一个标准,P-value用来和显著性水平作比较),注意SelectKBest SelectPercentile只有得分,没有p-value

    • For classification: chi2, f_classif, mutual_info_classif
    • For regression: f_regression, mutual_info_regression

    Notice:
      The methods based on F-test estimate the degree of linear dependency between two random variables. (F检验用于评估两个随机变量的线性相关性)On the other hand, mutual information methods can capture any kind of statistical dependency, but being nonparametric, they require more samples for accurate estimation.(另一方面,互信息的方法可以捕获任何类型的统计依赖关系,但是作为一个非参数方法,估计准确需要更多的样本)

    Feature selection with sparse data:
      If you use sparse data (i.e. data represented as sparse matrices), chi2, mutual_info_regression, mutual_info_classif will deal with the data without making it dense.(如果你使用稀疏数据(比如,使用稀疏矩阵表示的数据), 卡方检验(chi2)、互信息回归(mutual_info_regression)、互信息分类(mutual_info_classif)在处理数据时可保持其稀疏性.)

    Examples:
    Univariate Feature Selection
    Comparison of F-test and mutual information

    2.1 卡方(Chi2)检验

      经典的卡方检验是检验定性自变量对定性因变量的相关性。比如,我们可以对样本进行一次[Math Processing Error]chi2 测试来选择最佳的两项特征:

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

     
    2.2 Pearson相关系数 (Pearson Correlation)

      皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-11]-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关。  Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy pearsonr 方法能够同时计算 相关系数 和p-value.

     

    import numpy as np
    from scipy.stats import pearsonr
    np.random.seed(0)
    size=300
    x=np.random.normal(0,1, size)
    # pearsonr(x, y)的输入为特征矩阵和目标向量
    print("Lower noise", pearsonr(x, x+np.random.normal(0,1, size)))
    print("Higher noise", pearsonr(x, x+np.random.normal(0,10, size)))
    >>>

    # 输出为二元组(sorce, p-value)的数组
    Lower noise (0.71824836862138386,7.3240173129992273e-49)
    Higher noise (0.057964292079338148,0.31700993885324746)

     

    这个例子中,我们比较了变量在加入噪音之前和之后的差异。当噪音比较小的时候,相关性很强,p-value很低。

      Scikit-learn提供的 f_regrssion 方法能够批量计算特征的f_scorep-value,非常方便,参考sklearn pipeline

      Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近0例如:

    x = np.random.uniform(-1, 1, 100000)
    print pearsonr(x, x**2)[0]


    -0.00230804707612

      更多类似的例子参考 sample plots 。另外,如果仅仅根据相关系数这个值来判断的话,有时候会具有很强的误导性,如 Anscombe’s quartet ,最好把数据可视化出来,以免得出错误的结论。

    2.3 互信息和最大信息系数 (Mutual information and maximal information coefficient (MIC)

      经典的互信息(互信息为随机变量XY之间的互信息[Math Processing Error]I(X;Y)为单个事件之间互信息的数学期望)也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:

     

      互信息直接用于特征选择其实不是太方便:1、它不属于度量方式,也没有办法归一化,在不同数据及上的结果无法做比较;2、对于连续变量的计算不是很方便(XY都是集合,xy都是离散的取值),通常变量需要先离散化,而互信息的结果对离散化的方式很敏感。

      最大信息系数克服了这两个问题。它首先寻找一种最优的离散化方式,然后把互信息取值转换成一种度量方式,取值区间在[01] minepy 提供了MIC功能。

    反过头来看y=x2这个例子,MIC算出来的互信息值为1(最大的取值)

    from minepy import MINE
    m=MINE()
    x =np.random.uniform(-1,1,10000)
    m.compute_score(x, x**2)
    print(m.mic())
    >>>1.0
     MIC的统计能力遭到了 一些质疑 ,当零假设不成立时,MIC的统计就会受到影响。在有的数据集上不存在这个问题,但有的数据集上就存在这个问题。

    2.4 距离相关系数 (Distance Correlation)

      距离相关系数是为了克服Pearson相关系数的弱点而生的。在xx2这个例子中,即便Pearson相关系数是0,我们也不能断定这两个变量是独立的(有可能是非线性相关);但如果距离相关系数是0,那么我们就可以说这两个变量是独立的。

      R energy 包里提供了距离相关系数的实现,另外这是 Python gist 的实现。

    >x = runif(1000, -1,1)
    >dcor(x, x**2)[1]
    0.4943864

      尽管有 MIC 距离相关系数 在了,但当变量之间的关系接近线性相关的时候,Pearson相关系数仍然是不可替代的。
      第一,Pearson相关系数计算速度快,这在处理大规模数据的时候很重要。
      第二,Pearson相关系数的取值区间是[-11],而MIC和距离相关系数都是[01]。这个特点使得Pearson相关系数能够表征更丰富的关系,符号表示关系的正负,绝对值能够表示强度。当然,Pearson相关性有效的前提是两个变量的变化关系是单调的。

    2.5 基于模型的特征排序 (Model based ranking)

      这种方法的思路是直接使用你要用的机器学习算法,针对 每个单独的特征 响应变量建立预测模型。假如 特征 响应变量 之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者 扩展的线性模型 等。基于树的方法比较易于使用,因为他们对非线性关系的建模比较好,并且不需要太多的调试。但要注意过拟合问题,因此树的深度最好不要太大,再就是运用交叉验证

      在 波士顿房价数据集 上使用sklearn 随机森林回归 给出一个_单变量选择_的例子(这里使用了交叉验证):

    from sklearn.cross_validation import cross_val_score, ShuffleSplit
    from sklearn.datasets import load_boston
    from sklearn.ensemble import RandomForestRegressor
    import numpy as np

    # Load boston housing dataset as an example
    boston = load_boston()
    X = boston["data"]
    Y = boston["target"]
    names = boston["feature_names"]

    rf = RandomForestRegressor(n_estimators=20, max_depth=4)
    scores = []
    # 单独采用每个特征进行建模,并进行交叉验证
    for i in range(X.shape[1]):
        score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",  # 注意X[:, i]和X[:, i:i+1]的区别
                                cv=ShuffleSplit(len(X), 3, .3))
        scores.append((format(np.mean(score), '.3f'), names[i]))
    print(sorted(scores, reverse=True))

    [('0.620', 'LSTAT'), ('0.591', 'RM'), ('0.467', 'NOX'), ('0.342', 'INDUS'), ('0.305', 'TAX'), ('0.240', 'PTRATIO'), ('0.206', 'CRIM'), ('0.187', 'RAD'), ('0.184', 'ZN'), ('0.135', 'B'), ('0.082', 'DIS'), ('0.020', 'CHAS'), ('0.002', 'AGE')]


    Wrapper

    3. 递归特征消除 (Recursive Feature Elimination)

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

      sklearn官方解释:对特征含有权重的预测模型(例如,线性模型对应参数coefficients)RFE通过递归减少考察的特征集规模来选择特征。首先,预测模型在原始特征上训练,每个特征指定一个权重。之后,那些拥有最小绝对值权重的特征被踢出特征集。如此往复递归,直至剩余的特征数量达到所需的特征数量。

      RFECV 通过交叉验证的方式执行RFE,以此来选择最佳数量的特征:对于一个数量为dfeature的集合,他的所有的子集的个数是2d次方减1(包含空集)。指定一个外部的学习算法,比如SVM之类的。通过该算法计算所有子集的validation error。选择error最小的那个子集作为所挑选的特征。

    from sklearn.feature_selection import RFE
    from sklearn.linear_model import LogisticRegression

    #递归特征消除法,返回特征选择后的数据
    #参数estimator为基模型
    #参数n_features_to_select为选择的特征个数
    RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)

    示例:
    Recursive feature elimination: 一个递归特征消除的示例,展示了在数字分类任务中,像素之间的相关性。
    Recursive feature elimination with cross-validation: 一个递归特征消除示例,通过交叉验证的方式自动调整所选特征的数量。

    示例:
    Recursive feature elimination: 一个递归特征消除的示例,展示了在数字分类任务中,像素之间的相关性。
    Recursive feature elimination with cross-validation: 一个递归特征消除示例,通过交叉验证的方式自动调整所选特征的数量。

    Embedded

    4. 使用SelectFromModel选择特征 (Feature selection using SelectFromModel)

      单变量特征选择方法独立的衡量每个特征与响应变量之间的关系,另一种主流的特征选择方法是基于机器学习模型的方法。有些机器学习方法本身就具有对特征进行打分的机制,或者很容易将其运用到特征选择任务中,例如回归模型,SVM,决策树,随机森林等等。其实Pearson相关系数等价于线性回归里的标准化回归系数。

      SelectFromModel 作为meta-transformer,能够用于拟合后任何拥有coef_feature_importances_ 属性的预测模型。 如果特征对应的coef_  feature_importances_ 值低于设定的阈值threshold,那么这些特征将被移除。除了手动设置阈值,也可通过字符串参数调用内置的启发式算法(heuristics)来设置阈值,包括:平均值(“mean”), 中位数(“median”)以及他们与浮点数的乘积,如”0.1*mean”

    Examples
    Feature selection using SelectFromModel and LassoCV: 在阈值未知的前提下,选择了Boston dataset中两项最重要的特征。

    4.1 基于L1的特征选择 (L1-based feature selection)

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

     

      使用feature_selection库的SelectFromModel类结合带L1以及L2惩罚项的逻辑回归模型:


    from sklearn.feature_selection import SelectFromModel
    #带L1和L2惩罚项的逻辑回归作为基模型的特征选择
    #参数threshold为权值系数之差的阈值
    SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(iris.data, iris.target)
      对于SVM和逻辑回归,参数C控制稀疏性:C越小,被选中的特征越少。对于Lasso,参数alpha越大,被选中的特征越少。
    

    示例:
    Classification of text documents using sparse features: 不同算法使用基于L1的特征选择进行文档分类的对比。

    Note:

    L1恢复和压缩感知 (L1-recovery and compressive sensing)
      对于一个好的alpha值,在满足特定条件下, Lasso 仅使用少量观测值就能够完全恢复出非零的系数。特别地,样本的数量需要足够大,否则L1模型的表现会充满随机性,所谓足够大取决于非零系数的数量,特征数量的对数,噪声的数量,非零系数的最小绝对值以及设计矩阵X的结构。此外,设计矩阵必须拥有特定的属性,比如不能太过相关(correlated) 对于非零系数的恢复,还没有一个选择alpha值的通用规则 alpha值可以通过交叉验证来设置(LassoCV or LassoLarsCV),尽管这也许会导致模型欠惩罚(under-penalized):引入少量非相关变量不会影响分数预测。相反BIC (LassoLarsIC) 更倾向于设置较大的alpha值。
    Reference Richard G. Baraniuk “Compressive Sensing”, IEEE Signal Processing Magazine [120] July 2007

    4.2 随机稀疏模型 (Randomized sparse models)

      基于L1的稀疏模型的局限在于,当面对一组互相关的特征时,它们只会选择其中一项特征。为了减轻该问题的影响可以使用随机化技术,通过_多次重新估计稀疏模型来扰乱设计矩阵_,或通过_多次下采样数据来统计一个给定的回归量被选中的次数_——==稳定性选择 (Stability Selection)==

      RandomizedLasso 实现了使用这项策略的LassoRandomizedLogisticRegression 使用逻辑回归,适用于分类任务。要得到整个迭代过程的稳定分数,你可以使用 lasso_stability_path

      注意到对于非零特征的检测,要使随机稀疏模型比标准F统计量更有效, 那么模型的参考标准需要是稀疏的,换句话说,非零特征应当只占一小部分。

    示例:
    Sparse recovery: feature selection for sparse linear models: 比较了不同的特征选择方法,并讨论了它们各自适用的场合。

    参考文献:
    N. Meinshausen, P. Buhlmann, “Stability selection”, Journal of the Royal Statistical Society, 72 (2010)
    F. Bach, “Model-Consistent Sparse Estimation through the Bootstrap”

    4.3 基于树的特征选择 (Tree-based feature selection)

      基于树的预测模型(见 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)
    示例:
    Feature importances with forests of trees: 从模拟数据中恢复有意义的特征。
    Pixel importances with a parallel forest of trees: 用于人脸识别数据的示例。

    5. 将特征选择过程融入pipeline (Feature selection as part of a 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 相关示例。
      
    关于更多,参见另一个文档:
    《基于模型的特征选择详解 (Embedded & Wrapper)


    小结:

    所属方式

    说明

    VarianceThreshold

    Filter

    方差选择法(移除低方差的特征)

    SelectKBest

    Filter

    可选关联系数、卡方校验、最大信息系数作为得分计算的方法

    RFE

    Wrapper

    递归地训练基模型,将权值系数较小的特征从特征集合中消除

    SelectFromModel

    Embedded

    训练基模型,选择权值系数较高的特征


    参考:
    [1] [1.13. Feature selection](http://scikit-learn.org/stable/modules/feature_selection.html#feature-selection)
    [2] [1.13
    特征选择](http://sklearn.lzjqsdd.com/modules/feature_selection.html#feature-selection)
    [3] [
    干货:结合Scikit-learn介绍几种常用的特征选择方法](http://www.tuicool.com/articles/ieUvaq)
    [4] [
    使用sklearn做单机特征工程](http://www.cnblogs.com/jasonfreak/p/5448385.html#3601031)
    [5] [
    使用sklearn优雅地进行数据挖掘](http://www.cnblogs.com/jasonfreak/p/5448462.html)
    [6] [
    谁动了我的特征?——sklearn特征转换行为全记录](http://www.cnblogs.com/jasonfreak/p/5619260.html)

    注:
      文档[4]实际上是用sklearn实现整个数据挖掘流程,特别是在提高效率上sklearn的并行处理,流水线处理,自动化调参,持久化是使用sklearn优雅地进行数据挖掘的核心。这里是一个简单的总结,具体可查看该文档:

    类或方法

    说明

    sklearn.pipeline

    Pipeline

    流水线处理

    sklearn.pipeline

    FeatureUnion

    并行处理

    sklearn.grid_search

    GridSearchCV

    网格搜索自动化调参

    externals.joblib

    dump

    数据持久化

    externals.joblib

    load

    从文件系统中加载数据至内存

     

     

     

     

    展开全文
  • 三、Sklearn 特征选择

    2019-10-01 16:46:38
    目录 一、概述 ...2、单变量特征选择 (Univariate feature selection) (1)、卡方(Chi2)检验 (2)Pearson相关系数 (Pearson Correlation) 3 、互信息和最大信息系数 (MIC) 4 、距离相关系数 (D...

    目录

    一、概述

    二、Filter

    1. 移除低方差的特征 (Removing features with low variance)

    2、单变量特征选择 (Univariate feature selection)

    (1)、卡方(Chi2)检验

    (2)Pearson相关系数 (Pearson Correlation)

    3 、互信息和最大信息系数 (MIC)

    4 、距离相关系数 (Distance Correlation)

    5、基于模型的特征排序 (Model based ranking)

    二、Wrapper

    1、递归特征消除 (Recursive Feature Elimination)

    三、Embedded

    1、使用SelectFromModel方法特征选择

    (1)基于L1、L2惩罚项的特征选择法

    (2) 随机稀疏模型 (Randomized sparse models)

    (3)基于树的特征选择 (Tree-based feature selection)

    四、将特征选择过程融入pipeline (Feature selection as part of a pipeline)


    一、概述

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

    • 特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。

    • 特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除移除低方差法外,本文介绍的其他方法均从相关性考虑。

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

    • Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。

    • Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。

    • Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

    3、特征选择主要有两个目的:

    • 减少特征数量、降维,使模型泛化能力更强,减少过拟合

    • 增强对特征和特征值之间的理解。

      拿到数据集,一个特征选择方法,往往很难同时完成这两个目的。通常情况下,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的)。本文将结合 Scikit-learn提供的例子 介绍几种常用的特征选择方法,它们各自的优缺点和问题。

    二、Filter

    1. 移除低方差的特征 (Removing features with low variance)

      假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。

    当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用

    而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。

    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]]
    print(X)
    # 移除方差小于 0.16的列
    sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
    X_v = sel.fit_transform(X)
    print(X_v)

    2、单变量特征选择 (Univariate feature selection)

    单变量特征选择的原理是分别单独的计算每个变量的某个统计指标,根据该指标来判断哪些指标重要,剔除那些不重要的指标。

    1)对于分类问题(y离散),可采用:卡方检验f_classif, mutual_info_classif互信息

    (2)对于回归问题(y连续),可采用:皮尔森相关系数f_regression, mutual_info_regression最大信息系数

    (3)优缺点

    优点:比较简单,易于运行,易于理解,通常对于理解数据有较好的效果。

    缺点:对特征优化、提高泛化能力来说不一定有效。这种方法有许多改进的版本、变种。

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

    • SelectKBest 移除得分前 k 名以外的所有特征(取top k),选择排名靠前的K个特征。

    • SelectPercentile 移除得分在用户指定百分比以后的特征(取top k%),选择排名靠前的 k% 比率的特征。

    • 每个特征使用通用的单变量统计检验: 假正率(false positive rate) SelectFpr, 伪发现率(false discovery rate) SelectFdr, 或族系误差率 SelectFwe.

    • GenericUnivariateSelect 可以设置不同的策略来进行单变量特征选择。同时不同的选择策略也能够使用超参数寻优,从而让我们找到最佳的单变量特征选择策略。

    (5)将特征输入到评分函数,返回一个单变量的 f_score(F检验的值) 或 p-values (P值,假设检验中的一个标准,P-value用来和显著性水平作比较),注意 SelectKBest 和 SelectPercentile 只有得分,没有p-value。

    (6)如果你使用稀疏数据(比如,使用稀疏矩阵表示的数据), 卡方检验(chi2)、互信息回归(mutual_info_regression)、互信息分类(mutual_info_classif)在处理数据时可保持其稀疏性.

    (1)、卡方(Chi2)检验

     原理参考:https://mp.csdn.net/postedit/101861846

    经典的卡方检验是检验定性自变量对定性因变量的相关性。比如,我们可以对样本进行一次chi2 测试来选择最佳的两项特征:

    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
    print(X.shape)
    selector = SelectKBest(chi2, k=2)
    X_new = selector.fit_transform(X, y)
    print(X_new.shape)

    (2)Pearson相关系数 (Pearson Correlation)

    原理参考:https://blog.csdn.net/s294878304/article/details/101864801

    皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关。

      Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的 pearsonr 方法能够同时计算 相关系数 和p-value.

    import numpy as np
    from scipy.stats import pearsonr
    
    np.random.seed(0)
    size = 300
    x = np.random.normal(0, 1, size)
    print("Lower noise:", pearsonr(x, x + np.random.normal(0, 1, size)))
    print("Higher noise:", pearsonr(x, x + np.random.normal(0, 10, size)))
    
    from sklearn.feature_selection import SelectKBest
    from sklearn import datasets
    
    iris = datasets.load_iris()
    # 构建相关系数模型
    model = SelectKBest(lambda X, Y: np.array(list(map(lambda x: pearsonr(x, Y), X.T))).T[0], k=2)  
    model.fit_transform(iris.data, iris.target) # 对模型将数据传入
    print('相关系数:',model.scores_)    # 返回所有变量X与Y的相关系数值
    print('P值:',model.pvalues_)   # 返回所有变量X的P值
    # 打印传入数据的话会返回k=2所选择的两个变量的数据的值
    print('所选变量的数值为:\n', model.fit_transform(iris.data, iris.target))

    这个例子中,我们比较了变量在加入噪音之前和之后的差异。当噪音比较小的时候,相关性很强,p-value很低。

    Scikit-learn提供的 f_regrssion 方法能够批量计算特征的f_score和p-value,非常方便,参考sklearn的 pipeline

    Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近0。

    x = np.random.uniform(-1, 1, 100000)
    print pearsonr(x, x**2)[0]
    -0.00230804707612

    更多类似的例子参考 sample plots 。另外,如果仅仅根据相关系数这个值来判断的话,有时候会具有很强的误导性,如 Anscombe’s quartet ,最好把数据可视化出来,以免得出错误的结论。

    3 、互信息和最大信息系数 (MIC)

    经典的互信息(互信息为随机变量X与Y之间的互信息I(X;Y)为单个事件之间互信息的数学期望)也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:

      互信息直接用于特征选择其实不是太方便

    1、它不属于度量方式,也没有办法归一化,在不同数据及上的结果无法做比较;

    2、对于连续变量的计算不是很方便(X和Y都是集合,x,y都是离散的取值),通常变量需要先离散化,而互信息的结果对离散化的方式很敏感。

      最大信息系数克服了这两个问题。它首先寻找一种最优的离散化方式,然后把互信息取值转换成一种度量方式,取值区间在[0,1]。 minepy 提供了MIC功能。

    互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。它既可以做回归也可以做分类

    包含两个类feature_selection.mutual_info_classif(互信息分类)和feature_selection.mutual_info_regression(互信息回归)。

    返回每个特征与目标之间的互信息量的估计,这个估计量在 [0,1] 之间取值,为0则表示两个变量独立,为1则表示两个变量完全相关。以互信息分类为例的代码如下
     

    import numpy as np
    from sklearn.feature_selection import SelectKBest
    from minepy import MINE
    from sklearn import  datasets
    
    iris=datasets.load_iris()
    
    def mic(x, y):
        m = MINE()
        m.compute_score(x, y)
        return (m.mic(), 0.5)
    
    # 构建互信息数模型
    model = SelectKBest(lambda X, Y:np.array(list(map(lambda x: mic(x, Y), X.T))).T[0], k=2)
    model.fit_transform(iris.data, iris.target) #对模型将数据传入
    print('互信息系数:',model.scores_)    #返回所有变量X与Y的相关系数值
    print('P值:',model.pvalues_)   #返回所有变量X的P值
    # 打印传入数据的话会返回k=2所选择的两个变量的数据的值
    print('所选变量的数值为:\n',model.fit_transform(iris.data, iris.target))

    4 、距离相关系数 (Distance Correlation)

    距离相关系数是为了克服Pearson相关系数的弱点而生的。在x和x2这个例子中,即便Pearson相关系数是0,我们也不能断定这两个变量是独立的(有可能是非线性相关)但如果距离相关系数是0,那么我们就可以说这两个变量是独立的。

    x = runif (1000, -1, 1)
    dcor(x, x**2)
    [1] 0.4943864

    尽管有 MIC 和 距离相关系数 在了,但当变量之间的关系接近线性相关的时候,Pearson相关系数仍然是不可替代的

    第一,Pearson相关系数计算速度快,这在处理大规模数据的时候很重要。

    第二,Pearson相关系数的取值区间是[-1,1],而MIC和距离相关系数都是[0,1]。这个特点使得Pearson相关系数能够表征更丰富的关系,符号表示关系的正负,绝对值能够表示强度。当然,Pearson相关性有效的前提是两个变量的变化关系是单调的。

    5、基于模型的特征排序 (Model based ranking)

      这种方法的思路是直接使用你要用的机器学习算法针对 每个单独的特征 和 响应变量建立预测模型。

    假如 特征 和 响应变量 之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者 扩展的线性模型 等。基于树的方法比较易于使用,因为他们对非线性关系的建模比较好,并且不需要太多的调试。但要注意过拟合问题,因此树的深度最好不要太大,再就是运用交叉验证

      在 波士顿房价数据集 上使用sklearn的 随机森林回归 给出一个_单变量选择_的例子(这里使用了交叉验证):

    from sklearn.model_selection import cross_val_score,ShuffleSplit
    from sklearn.datasets import load_boston
    from sklearn.ensemble import  RandomForestRegressor
    import numpy as np
    
    boston = load_boston()
    X = boston['data'] # boston.data
    Y = boston.target
    names = boston['feature_names']
    print(names)
    # 随机森林中树的个数
    rf = RandomForestRegressor(n_estimators=20, max_depth=4)
    scores = []
    # 单独采用每个特征进行建模,并进行交叉验证
    # 遍历每个特征
    for i in range(X.shape[1]):
        score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
                                cv=ShuffleSplit(len(X), 3, .3))
        scores.append((format(np.mean(score), '.3f'), names[i]))
    print(sorted(scores, reverse=True))
    [('-9.347', 'AGE'), ('-6.945', 'TAX'), ('-6.002', 'DIS'), ('-5.200', 'B'), ('-4.456', 
    'NOX'), ('-4.088', 'LSTAT'), ('-37.533', 'INDUS'), ('-3.684', 'RAD'), ('-2.081', 'CHAS'), 
    ('-15.497', 'ZN'), ('-13.884', 'RM'), ('-12.736', 'PTRATIO'), ('-12.229', 'CRIM')]

    二、Wrapper

    1、递归特征消除 (Recursive Feature Elimination)

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

      sklearn官方解释:对特征含有权重的预测模型(例如,线性模型对应参数coefficients),RFE通过递归减少考察的特征集规模来选择特征。首先,预测模型在原始特征上训练,每个特征指定一个权重。之后,那些拥有最小绝对值权重的特征被踢出特征集。如此往复递归,直至剩余的特征数量达到所需的特征数量。

      RFECV 通过交叉验证的方式执行RFE,以此来选择最佳数量的特征:对于一个数量为 d 的 feature 的集合,他的所有的子集的个数是2的d次方减1(包含空集)。指定一个外部的学习算法,比如SVM之类的。通过该算法计算所有子集的validation error。选择error最小的那个子集作为所挑选的特征。

    import  numpy as np
    from sklearn.feature_selection import RFE,RFECV
    from sklearn.linear_model import LogisticRegression
    from sklearn import datasets
    iris = datasets.load_iris()
    X = iris.data
    Y = iris.target
    # FECV()利用交叉验证来选择,不过这里的交叉验证的数据集切割对象不再是 行数据(样本),
    # 而是列数据(特征),但是计算量会大,cv默认是3
    # 构建逻辑回归的递归消除模型
    model=RFE(estimator=LogisticRegression(), n_features_to_select=2)   #构建逻辑回归的递归消除模型
    X_new = model.fit_transform(iris.data, iris.target) #传入数据
    print(X[:1])#  [[5.1 3.5 1.4 0.2]]
    print(X_new[:1]) # [[3.5 0.2]]

    三、Embedded

    1、使用SelectFromModel方法特征选择

    单变量特征选择方法独立的衡量每个特征与响应变量之间的关系,另一种主流的特征选择方法是基于机器学习模型的方法。有些机器学习方法本身就具有对特征进行打分的机制,或者很容易将其运用到特征选择任务中,例如回归模型,SVM,决策树,随机森林等等。其实Pearson相关系数等价于线性回归里的标准化回归系数。

    electFromModel 作为meta-transformer,能够用于拟合后任何拥有coef_feature_importances_ 属性的预测模型。 如果特征对应的coef_feature_importances_ 值低于设定的阈值threshold,那么这些特征将被移除。除了手动设置阈值,也可通过字符串参数调用内置的启发式算法(heuristics)来设置阈值,包括:平均值(“mean”), 中位数(“median”)以及他们与浮点数的乘积,如”0.1*mean”。

    (1)基于L1、L2惩罚项的特征选择法

    使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:

    import  numpy as np
    from sklearn.feature_selection import SelectFromModel
    from sklearn.linear_model import LogisticRegression
    from sklearn import datasets
    iris = datasets.load_iris()
    X = iris.data
    Y = iris.target
    # 带L1惩罚项的逻辑回归作为基模型的特征选择
    model = SelectFromModel(LogisticRegression(penalty="l1", C=0.1), max_features=2)
    model.fit_transform(iris.data, iris.target) # 传入数据
    # 返回模型选择的变量的数据内容
    X_new = model.fit_transform(X, Y)
    print(X[:1])# [[5.1 3.5 1.4 0.2]]
    print(X_new[:1])# [[3.5 1.4]]

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

    (2) 随机稀疏模型 (Randomized sparse models)

    基于L1的稀疏模型的局限在于,当面对一组互相关的特征时,它们只会选择其中一项特征。为了减轻该问题的影响可以使用随机化技术,通过_多次重新估计稀疏模型来扰乱设计矩阵_,或通过_多次下采样数据来统计一个给定的回归量被选中的次数_。——==稳定性选择 (Stability Selection)==

      RandomizedLasso 实现了使用这项策略的Lasso,RandomizedLogisticRegression 使用逻辑回归,适用于分类任务。要得到整个迭代过程的稳定分数,你可以使用 lasso_stability_path

      注意到对于非零特征的检测,要使随机稀疏模型比标准F统计量更有效, 那么模型的参考标准需要是稀疏的,换句话说,非零特征应当只占一小部分。

    示例:
    Sparse recovery: feature selection for sparse linear models: 比较了不同的特征选择方法,并讨论了它们各自适用的场合。

    参考文献:
    N. Meinshausen, P. Buhlmann, “Stability selection”, Journal of the Royal Statistical Society, 72 (2010)
    F. Bach, “Model-Consistent Sparse Estimation through the Bootstrap”

    (3)基于树的特征选择 (Tree-based feature selection)

    基于树的预测模型(见 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
    print(X.shape)
    clf = ExtraTreesClassifier()
    clf = clf.fit(X, Y)
    print(clf.feature_importances_)# [0.14419482 0.05850172 0.41185762 0.38544583]
    model = SelectFromModel(clf, prefit=True)
    X_new = model.transform(X)
    print(X_new.shape)
    
    import numpy as np
    from sklearn.feature_selection import SelectFromModel
    from sklearn.ensemble import GradientBoostingClassifier
    from sklearn import  datasets
    
    iris=datasets.load_iris()
    
    #带L1惩罚项的逻辑回归作为基模型的特征选择
    model=SelectFromModel(GradientBoostingClassifier())
    model.fit_transform(iris.data, iris.target) #传入数据
    print(model.fit_transform(iris.data, iris.target))   #返回模型选择的变量的数据内容

    四、将特征选择过程融入pipeline (Feature selection as part of a pipeline)

    特征选择常常被当作学习之前的一项预处理。在scikit-learn中推荐使用sklearn.pipeline.Pipeline:

    from numpy import log1p
    from sklearn.preprocessing import Imputer
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.preprocessing import FunctionTransformer
    from sklearn.preprocessing import Binarizer
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import chi2
    from sklearn.decomposition import PCA
    from sklearn.linear_model import LogisticRegression
    from sklearn.pipeline import Pipeline
    
    #新建计算缺失值的对象
    step1 = ('Imputer', Imputer())
    #新建将部分特征矩阵进行定性特征编码的对象
    step2_1 = ('OneHotEncoder', OneHotEncoder(sparse=False))
    #新建将部分特征矩阵进行对数函数转换的对象
    step2_2 = ('ToLog', FunctionTransformer(log1p))
    #新建将部分特征矩阵进行二值化类的对象
    step2_3 = ('ToBinary', Binarizer())
    #新建部分并行处理对象,返回值为每个并行工作的输出的合并
    step2 = ('FeatureUnionExt', FeatureUnionExt(transformer_list=[step2_1, step2_2, step2_3], idx_list=[[0], [1, 2, 3], [4]]))
    #新建无量纲化对象
    step3 = ('MinMaxScaler', MinMaxScaler())
    #新建卡方校验选择特征的对象
    step4 = ('SelectKBest', SelectKBest(chi2, k=3))
    #新建PCA降维的对象
    step5 = ('PCA', PCA(n_components=2))
    #新建逻辑回归的对象,其为待训练的模型作为流水线的最后一步
    step6 = ('LogisticRegression', LogisticRegression(penalty='l2'))
    #新建流水线处理对象
    #参数steps为需要流水线处理的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象
    pipeline = Pipeline(steps=[step1, step2, step3, step4, step5, step6])

    在此代码片段中,将 sklearn.svm.LinearSVC 和 sklearn.feature_selection.SelectFromModel 结合来评估特征的重要性,并选择最相关的特征。之后 sklearn.ensemble.RandomForestClassifier 模型使用转换后的输出训练,即只使用被选出的相关特征。你可以选择其它特征选择方法,或是其它提供特征重要性评估的分类器。

    6、参考:

    1. 使用sklearn优雅地进行数据挖掘

    2. 使用sklearn做单机特征工程

    3. 特征选择 (feature_selection)

     

     

     

     

     

     

     

     

    展开全文
  • 本文结合sklearn中的特征选择的方法,讲解相关方法函数及参数的含义。 1. 移除低方差特征  方差越大的特征,可以认为是对目标变量越有影响的特征,是我们需要研究的特征。可以利用 VarianceThreshold,移除方差不...

      本文结合sklearn中的特征选择的方法,讲解相关方法函数及参数的含义。

    1. 移除低方差特征

      方差越大的特征,可以认为是对目标变量越有影响的特征,是我们需要研究的特征。可以利用 VarianceThreshold,移除方差不满足一定阈值的特征。

      class sklearn.feature_selection.VarianceThreshold(threshold=0.0)

      参数 threshold 为设定的方差阈值,小于该值的特征将被移除,默认取值0,即移除方差为0的特征。

      需要注意的是,不同分布的数据,方差的计算方式不同。连续性变量的方差,大家都比较熟悉它的计算方式;但是离散型变量的方差,计算就有所不同了。例如官方文档中的例子,假设一个二元随机变量,它的取值为0、1,服从二项分布,而二项分布的方差计算公式为:D(x) = n*p*q = n*p*(1-p),p为实验“成功”的概率,q为失败的概率,n为试验次数。(注:官方文档中写的方差计算公式少了n,个人认为他是错的,虽然不影响结果。如果我理解错了,也希望博友指正。)。针对二元变量,我们希望取值为0或者1比例不要太大。例如,我们不希望其中一个取值的比例超过80%,那么,此时 threshold 参数的可设置为:threshold = 0.8*(1- 0.8)。

    2. 单变量特征选择

      所谓的单变量特征选择,就是对样本数据中的特征分别进行统计检验,并根据检验结果对特征进行评分,然后按照设定的规则进行筛选。主要有以下四种方法:

    • SelectKBest(score_func,k)

      其中 score_func 传入用于特征评分的统计检验方法,默认是 f_classif,它计算的是单变量与训练 target 间的方差分析F值(Anova F-value);k 传入用户想要根据评分从高到低留下的变量的个数,默认是10。

      注意,当选用默认的 f_classif 方法时,只适用于分类任务,即目标变量为分类变量(因为只有目标变量是分类变量,才好进行方差分析)。

    • SelectPercentile(score_func,percentile)

      其中 score_func 同上;percentile 传入用户想要根据评分从高到低留下的变量个数占总个数的比例,默认10,表示10%。 

    • SelectFpr(score_func,alpha)

      通过控制统计检验中取伪错误发生的概率来选择特征,其中score_func同上;alpha用来控制置信水平,alpha值为保留该变量的最高p值,即p值大于该值,移除对应的变量。

    • GenericUnivariateSelect(score_func,mode,param)

      这是一个整合上述几种方法的广义方法,其中score_func同上;mode 用来指定特征选择的方法,可选项有{‘percentile’, ‘k_best’, ‘fpr’, ‘fdr’, ‘fwe’},与上面几种方法相对应;param的输入取决于mode中指定的方式,即指定方式对应的传入参数。

    3. 递归特征消除法

      class sklearn.feature_selection.RFECV(estimatorstep=1cv=Nonescoring=Noneverbose=0n_jobs=1)

      递归特征消除法(Recursive feature elimination)的基本思想是反复地构建多个模型(如回归模型、支持向量机等),例如,在回归任务中,对n个变量,第一轮构造n个模型,每个模型都对应着剔除掉一个变量,选择出其中效果最佳的模型对应的变量,将其剔除,再进入第二轮,这样通过递归构建模型,最终将剩余的变量控制在最佳的水平,这类似交叉验证(cross validation)的过程,我们使用 sklearn.feature_selection中的RFECV() 来实施这个过程,其具体参数如下: 

      estimator:该参数传入用于递归构建模型的有监督型基学习器,要求该基学习器具有fit方法,且其输出含有coef_或feature_importances_这种结果;

      step:数值型,默认为1,控制每次迭代过程中删去的特征个数,有以下两种情况:

        1.若传入大于等于1的整数,则在每次迭代构建模型的过程中删去对应数量的特征;

        2.若传入介于0.0到1.0之间的浮点数,则在每次第迭代构造模型的过程中删去对应比例的特征。

      cv:控制交叉验证的分割策略,默认是3折交叉验证,有以下几种情况:

        1.None,等价于不传入参数,即使用默认设置的3折交叉验证;

        2.正整数,这时即指定了交叉验证中分裂的子集个数,即k折中的k;

      n_jobs:控制并行运算中利用到的CPU核心数,默认为1,即单核工作,若设置为-1,则启用所有核心进行运算;

      函数返回值: 

      n_features_:通过交叉验证过程最终剩下的特征个数;

      support_:被选择的特征的被选择情况(True表示被选择,False表示被淘汰);

      ranking_:所有特征的评分排名;

      estimator_:利用剩下的特征训练出的模型;

    4. SelectFromModel 选取特征

      SelectFromModel包括:L1-based feature selection (基于 L1 的特征选取)、Tree-based feature selection(基于 Tree(树)的特征选取) 等。

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

    • 有系数的线性模型中,L1正则化可生成一个稀疏矩阵,利于计算,所以可以做特征选择。
    from sklearn.feature_selection import SelectFromModel
    from sklearn.linear_model import Lasso            # 此处以L1正则化的线性模型Lasso为例
    lasso = Lasso()                                   # 可在此步对模型进行参数设置,这里用默认值。
    lasso.fit(X, y)                                   # 训练模型,传入X、y, 数据中不能包含miss_value
    model = SelectFromModel(lasso)
    X_new = model.transform(X)
    • 在无系数的非线性模型中,通过计算得到特征重要性,根据重要性筛选无关特征
    from sklearn.feature_selection import SelectFromModel
    from sklearn.ensemble import RandomForestRegressor        # 获得特征重要度
    rf = RandomForestRegressor()                              # 默认参数
    rf.fit(X, y)
    model = SelectFromModel(rf)
    X_new = model.transform(X)

     

      

    参考: https://www.cnblogs.com/feffery/p/8808398.html#commentform

        https://blog.csdn.net/sscc_learning/article/details/73929038

      

      

    转载于:https://www.cnblogs.com/solong1989/p/9637134.html

    展开全文
  • LassoCV特征选择

    千次阅读 2019-09-23 10:57:33
    from sklearn.linear_model import Lasso from sklearn.preprocessing import StandardScaler from sklearn.datasets import load_boston from sklearn.model_selection import cross_val_score boston = lo...
  • sklearn机器学习:特征选择-Lasso

    千次阅读 2019-10-11 10:42:27
    Lasso的核心作用:特征选择 Lasso类的格式 sklearn.linear_model.Lasso (alpha=1.0, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive...
  • sklearn学习之使用sklearn进行特征选择

    千次阅读 2018-10-27 15:56:12
    在本节中我们将使用sklearn.feature_selection模块中的类在高维度的样本集上进行特征选择、降维来提升估计器的性能。 1. Removing features with low variance方差选择法 sklearn.feature_selection.Variance...
  • 利用sklearn进行特征选择

    千次阅读 2019-12-20 22:27:47
    3种特征选择 Filter 过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。 (先对数据集进行特征选择,然后再训练学习器) Wrapper 包装法,根据目标函数(通常是预测效果...
  • python机器学习库sklearn——特征选择

    千次阅读 2018-04-09 15:23:44
    移除低方差特征VarianceThreshold 是特征选择的一个简单基本方法,它会移除所有那些方差不满足一些阈值的特征。默认情况下,它将会移除所有的零方差特征,即那些在所有的样本上的取值均不变的特征。# ============...
  • Python sklearn学习之特征选择 文章目录Python sklearn学习之特征选择1. 移除低方差特征2. 单变量特征选择2.1 单变量特征选择工具类2.2 score_func参数说明2.2.1 用于回归:2.2.2用于分类:3. 递归式特征消除4. ...
  • Sklearn特征工程

    2018-08-15 22:33:08
    中文文档: http://sklearn.apachecn.org/cn/stable/modules/feature_selection.html 英文文档: http://sklearn.apachecn.org/en/stable/modules/feature_selection.html             官方文档: ...
  • title: sklearn-特征工程之特征选择 date: 2016-11-25 22:49:24 categories: skearn tags: sklearn --- 抄袭/参考资料 使用sklearn做单机特征工程 sckearn中文 周志华《机器学习》 当数据预处理完成后,我们需要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,132
精华内容 2,452
关键字:

lassosklearn特征选择