learn sklearn(二) 特征选取

特征选取

概念:
将数据集中与要预测的值没有因果关系或者因果关系不大,或者冗余的特征去除,选取出对要预测的值关系密切的特征。

好处:
性能提升/提高模型的准确率

sklearn的feature_selection模块

简单特征选取

  • 根据单个特征的在整个数据集中的方差直接选择

    当某个特征在样例中方差越小时,也就是说它的一致性越高,对于整个的分类作用也就越小,当它小于 threshold时,我们就可以去除这个特征。

    在sklearn中用来 VarianceThreshold 来提取。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from sklearn.feature_selection import VarianceThreshold
    #定义特征矩阵(X)
    X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
    #如果一个特征出现的概率小于0.8,则删除其(注意:threshold是方差0.8是概率。根据 variance = p * (1 - p)计算)
    sel = VarianceThreshold(threshold=(0.8 * (1 - 0.8)))

    sel_X = sel.fit_transform(X)
    print(sel_X)
    [[0 1],
    [1 0],
    [0 0],
    [1 1],
    [1 0],
    [1 1]]
  • 单变量特征选择:Univariate feature selection

    上面的根据方差来选择特征显然太naive了,在单变量特征选择中,我们通过一些统计度量方法来选择。

    • SelectKBest:从特征值中选取K个最好的特征
    • SelectPercentile:从特征值中选取一定比例的特征
    • 对每个变量使用常用的单变量统计测试: 假阳性率(false positive rate)SelectFpr,伪发现率(false discovry rate)SelectFdr,或者族系误差(family wise error)SelectFwe

      统计度量方法根据预测值可以分为两类:

    • 回归: f_regression, mutual_info_regression

    • 分类: chi2, f_classif, mutual_info_classif

      以SelectKBest为例:

      1
      2
      3
      4
      5
      6
      7
      8
      from sklearn.feature_selection import SelectKBest,f_classif
      from sklearn import datasets
      #load data
      iris = datasets.load_iris()
      X,Y = iris.data,iris.target
      # 使用SelectKBest函数,统计度量方法为f_classif,选取3个特征值
      Ksel = SelectKBest(f_classif, k=3).fit_transform(X, Y)
      print(Ksel.shape)

      OutPut:

      1
      (150, 3)

      TODO 参考f_classif,f_regression的详细内容

//在接着介绍sklearn的feature_selection模块前,先介绍一下有关特征选取的常用的两个过程。

递归式特征消除:Univariate feature selection

分两个部分介绍:

  • 子集搜索:递归式特征消除选择使用一个额外的估计器(这个估计器必须可以对每个特征赋予一定的权重)
  • 子集评价:通过coef_属性 或者feature_importances_属性获得每个特征的重要性,注意先归一化,去除掉最不重要的属性,知道满足要求。

提供的recursive feature elimination (RFE)函数:

- `RFE`:自动寻找到要求到的feature数量。
- `RFECV`:在一个交叉验证循环中自动找到最优的feature数量。

SelectFromModel:使用模型选取特征

总的来说类似上面的递归式特征消除,不过在子集评价中不是去掉最不重要的特征,而是去掉所有coef_属性 或者feature_importances_属性低于阀值的特征。

  • 基于L1正则选取。

    线性模型的L1正则会产生稀疏解,可以用此选取特征。可以用于此目的的稀疏评估器有用于回归的 linear_model.Lasso , 以及用于分类的 linear_model.LogisticRegressionsvm.LinearSVC

    在 SVM 和逻辑回归中,参数 C 是用来控制稀疏性的:小的 C 会导致少的特征被选择。使用 Lasso,alpha 的值越大,越少的特征会被选择。

  • Tree-based feature selection(基于树的特征选取)

    树可以产生每个feature的重要性,因此也可用于特征选取,与SelectFromModel结合使用。

##