Python sklearn 特征选择 feature selection

By | 2018年7月10日

目录:

  1. 单变量特征选择 Univariate feature selection
  2. 循环特征选择 Recursive feature elimination
  3. L1-based feature selection
  4. 决策树特征选择 Tree-based feature selection

 

1、单变量特征选择 Univariate feature selection

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

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

单变量特征选择基于单变量的统计测试来选择最佳特征,它可以看作预测模型的一项预处理、scoring函数使用,不作为单独的特征选择过程。

sklearn.feature_selection模块中主要有以下几个方法:

  1. SelectKBest 选择排名排在前n个的变量,需要额外指定通过什么指标来给变量排名;
  2. SelectPercentile 选择排名排在前n%的变量,需要额外指定通过什么指标来给变量排名;
  3. 对每个特征使用通用的单变量统计检验: 假正率(false positive rate) SelectFpr,伪发现率(false discovery rate) SelectFdr,或族系误差率 SelectFwe
  4. 对于regression问题,可以使用f_regression、mutual_info_regression;
  5. 对于classification问题,可以使用chi2、f_classif、mutual_info_classif;
  6. GenericUnivariateSelect 可以设置不同的策略来进行单变量特征选择。同时不同的选择策略也能够使用超参数寻优,从而让我们找到最佳的单变量特征选择策略。
from sklearn.feature_selection import SelectPercentile, f_classif
selector = SelectPercentile(f_classif, percentile=10)

1.1  f_regression

  1. 计算每个特征与标签之间的相关性:((X[:, i] – mean(X[:, i])) * (y – mean_y)) / (std(X[:, i]) * std(y))
  2. 返回 F-score 及该 F-score 的 p-value值。F-score越大,特征与标签之间的相关性就越大,据此做特征选择。

传统统计学中f值是用于方差分析的,具体例子可以参考 jetFlow的博客。(文中有对f值的统计意义做介绍)

也就是说,在药物疗效检验的这个例子中,是为了检验:在不同的药剂量下,血压差是不是有显著的差异。那么我们再抽象一下,方差分析的目的是:在随机变量Y的不同水平下,检验某个变量X是不是有显著的变化。 这似乎是在说变量X和Y之间的相关性对吧?

from sklearn.feature_selection import f_regression

def F_regression(features, ImputeCols, labels):

    f, pval = f_regression(features, labels)     # 这里的features和labels均为dataframe
    f_regression_dict = dict(zip(ImputeCols, f))
    # f_pval_dict = dict(zip(ImputeCols, pval))
    # f_regression_list = sorted(f_regression_dict.iteritems(), key=lambda d: d[0])
    # f_regression_list_new = []
    # for each in f_regression_list:
        # f_regression_list_new.append(each.add(f_pval_dict[each[0]]))

    return f_regression_dict

 1.2 mutual_info_regression

from sklearn.feature_selection import mutual_info_regression

def Mutual_info_regression(features, ImputeCols, labels):

    mi = mutual_info_regression(features, labels)    # 返回一个值
    mutual_info_regression_dict = dict(zip(ImputeCols, mi))
    # mutual_info_regression_list = sorted(mutual_info_regression_dict.iteritems(), key=lambda d: d[0])
    return mutual_info_regression_dict

 

1.3 pearson_correlation

这里再加一个皮尔逊相关系数。

from scipy.stats import pearsonr

def Pearson_correlation(features, ImputeCols, Labels):

    feature_pearson_dict = defaultdict(list)
    for col in ImputeCols:
        # print features[col].values.tolist()
        # print Labels['diff'].values.tolist()
        feature_list = map(float, features[col].values.tolist())
        label_list = Labels['diff'].values.tolist()
        # feature_pearson_dict[col] = pearsonr(feature_list, label_list)
        feature_pearson_dict[col] = pearsonr(feature_list, label_list)[0]

    feature_pearson_list = sorted(feature_pearson_dict.iteritems(), key=lambda d: d[0])

    return feature_pearson_list

 

2、循环特征选择 Recursive feature elimination

不单独的检验某个变量的价值,而是将其聚集在一起检验。

基本思想是:对于一个数量为d的feature的集合,其所有子集的个数是2的d次方减1(包含空集)。指定一个外部的学习算法,比如SVM之类的,通过该算法计算所有子集的validation error,最后选择error最小的那个子集作为所挑选的特征。

sklearn.feature_selection模块中主要有以下几个方法:

  1. RFE
  2. RFECV

 

3、L1-based feature selection

基本原理是:在linear regression模型中,有时候会得到sparse solution,意思是说很多变量前面的系数都等于0或者接近于0。这说明这些变量不重要,那么可以将这些变量去除。

4、决策树特征选择 Tree-based feature selection

基于决策树算法做出特征选择。

 

参考文献:

  1. Python scikit-learn机器学习工具包学习笔记:feature_selection模块
  2. Sklearn中的f_classif和f_regression
  3. 特征选择 (feature_selection)
  4. 基于模型的特征选择详解 (Embedded & Wrapper)
  5. sklearn.feature_selection.f_regression
  6. sklearn.feature_selection.mutual_info_regression
  7. scikit-learn–Feature selection(特征选择)

发表评论

电子邮件地址不会被公开。 必填项已用*标注