scikit-learn--Feature selection(特征选择)

去掉方差较小的特征

方差阈值(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)。

《scikit-learn--Feature selection(特征选择)》

其中
《scikit-learn--Feature selection(特征选择)》

是公平伯努利随机变量的独立试验( 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

    原文作者:zhilaizhiwang
    原文地址: https://www.jianshu.com/p/b3056d10a20f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞