scikit-learn--Feature selection(

作者: DayDayUp_hhxx | 来源:发表于2017-06-04 18:34 被阅读3704次

    去掉方差较小的特征

    方差阈值(VarianceThreshold)是特征选择的一个简单方法,去掉那些方差没有达到阈值的特征。默认情况下,删除零方差的特征,例如那些只有一个值的样本。
    假设我们有一个有布尔特征的数据集,然后我们想去掉那些超过80%的样本都是0(或者1)的特征。布尔特征是伯努利随机变量,方差为 p(1-p)。

    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。

    单变量特征选择

    单变量特征选择通过单变量统计检验选择特征,可以看作一个估计器的预处理步骤。Sklearn将特征选择视为日常的转换操作:

    • SelectBest 只保留 k 个最高分的特征;
    • 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
    (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值;
          degrees_of_freedom = y.size - (2 if center else 1)
          F = corr ** 2 / (1 - corr ** 2) * degrees_of_freedom
          pv = stats.f.sf(F, 1, degrees_of_freedom)
    

    mutual_info_regression:互信息,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。
    参考:http://www.cnblogs.com/gatherstars/p/6004075.html

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

    递归特征淘汰(RFE)

    给特征赋予一个外部模型产生的权重(例如:线性模型系数),RFE递归地使用越来越少的特征来进行特征选择。首先,在原始数据上建立模型并且给每个特征一个权重;然后,淘汰绝对权重最小的特征,递归地执行这个过程直到达到希望的特征数。
    RFECV使用交叉验证方法发现最优特征数量。

    使用SelectFromModel方法特征选择

    SelectFromModel是一种元转换器,可以与那些有coef_ 或者feature_importances_属性的模型一起使用。如果coef_ 或者feature_importances_小于阈值,我们就认为特征是不重要的。除了指定阈值以外,也可以使用启发式的方式。有效的启发式方法包括均值、中位数或者乘以系数,比如 0.1*均值。

    基于L1范数的特征选择

    使用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正则有众所周知的局限。例如,Lasso将从一组高度相关的特征中选择一个;此外,即使特征间的相关性并不强,L1正则仍然会从中选出一个“好”的特征。
    为了解决这个问题,可以使用sklearn.linear_model中的stability selection这种随机化方法。在stability selection中,使用数据的子集去拟合模型,系数的随机子集的罚项将被缩小( the penalty of a random subset of coefficients has been scaled)。


    其中

    是公平伯努利随机变量的独立试验( independent trials of a fair Bernoulli random variable),0<s<1是缩小因子。通过重复不同的随机子样本和伯努利实验组合,可以统计每个特征被随机过程所选中的概率,然后用这些概率去选择特征。
    RandomizedLasso在 Lasso 回归中使用了这个策略,RandomizedLogisticRegression 可以用来分类。要获得整个过程中的全部得分,可以使用lasso_stability_path。
    随机稀疏模型比标准的 F统计量在探测非零特征方面要有力的多,真实的模型(ground truth model)应该是稀疏的,换句话说,只有少部分是特征是非零的。

    基于决策树的特征选择

    决策树能用来计算特征重要性,反过来也可以用于去除不相关特征。

    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)        
    

    来源:http://scikit-learn.org/stable/modules/feature_selection.html

    相关文章

      网友评论

        本文标题:scikit-learn--Feature selection(

        本文链接:https://www.haomeiwen.com/subject/uviufxtx.html