机器学习之特征选择方法

特征选择是一个重要的数据预处理过程,在现实机器学习任务中,获得数据之后通常先进行特征选择,此后在训练学习器,如下图所示:

进行特征选择有两个很重要的原因:

  • 避免维数灾难:能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的
  • 降低学习任务的难度:选取出真正相关的特征简化模型,协助理解数据产生的过程

如流程图所示,特征选择包括两个环节:

  • 子集搜索 (subset search)
  • 子集评价 (subset evaluation)

《机器学习》将特征选择分为了三种方法:分别是过滤式(filter) 、包裹式(wrapper)和嵌入式(embedded)。下面依据sklearn中的特征选择文档来叙述特征选择的几个方法。

过滤式(filter)

这类方法先对数据机进行特征选择,然后再训练学习器,特征选择的过程与后续学习器无关。

移除低方差的特征

VarianceThreshold 是特征选择的一个简单基本方法,它会移除所有那些方差不满足阈值的特征。默认情况下,它将会移除所有的零方差特征,即那些在所有的样本上的取值均不变的特征。

例如,假设我们有一个特征是布尔值的数据集,我们想要移除那些在整个数据集中特征值为0或者为1的比例超过80%的特征。布尔特征是伯努利( Bernoulli )随机变量,变量的方差为\(Var[X]=p(1-p)\)

因此,我们可以使用阈值.8*(1-.8)进行选择

>>> 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 移除了第一列。

单变量特征选择

单变量的特征选择是通过基于单变量的统计测试来选择最好的特征。它可以当做是评估器的预处理步骤。Scikit-learn 将特征选择的内容作为实现了 transform 方法的对象:

  • SelectKBest 移除那些除了评分最高的 K 个特征之外的所有特征
  • SelectPercentile 移除除了用户指定的最高得分百分比之外的所有特征
  • GenericUnivariateSelect 允许使用可配置方法来进行单变量特征选择。它允许超参数搜索评估器来选择最好的单变量特征。

例如下面的实例,我们可以使用 \(\chi^{2}\) (卡方检验)检验样本集来选择最好的两个特征:

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

很明显,上述两种方法都是过滤式特征选择的方法,所以与模型无关的特征权重显得尤为重要。这种权重主要分析特征与target的相关性,这样的分析是与这次学习所使用的模型无关的。与模型无关特征权重分析方法包括(1)交叉熵,(2)Information Gain,(3)Odds ratio,(4)互信息,(5)KL散度(相对熵)等

上述代码用到的是经典的卡方检验,这里简单叙述原理:

经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:

\(\chi^{2} = \sum\frac{(A-E)^{2}}{E}\)

A为实际值, E为理论值,求和值为理论值与实际值的差异程度。

基本思想是根据样本数据推断总体的分布与期望分布是否有显著性差异,或者推断两个分类变量是否相关或者独立。

卡方检验具体可参考这篇博客:卡方分布与卡方检验

包裹式(wrapper)

这类方法选择直接把最终将要使用学习期的性能作为特征子集的评价准则。

递归式特征消除(RFE)

给定一个外部的估计器,该估计起对特征赋予一定的权重(比如,线性模型的系数),recursive feature elimination ( RFE ) 通过处理越来越少的特征集合来递归的选择特征。 首先,评估器在初始的特征集合上面进行训练并且每一个特征的重要程度是通过一个诸如sklearn里的 coef_ 属性 或者 feature_importances_ 属性来获得。 然后,从当前的特征集合中移除最不重要的特征。在特征集合上不断的重复递归这个步骤,直到最终达到所需要的特征数量为止。

下列代码使用RFE抽取5个最informative的特征:

>>> from sklearn.datasets import make_friedman1
>>> from sklearn.feature_selection import RFE
>>> from sklearn.svm import SVR
>>> X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
>>> estimator = SVR(kernel="linear")
>>> selector = RFE(estimator, 5, step=1)
>>> selector = selector.fit(X, y)
>>> selector.support_
array([ True,  True,  True,  True,  True,
        False, False, False, False, False], dtype=bool)
>>> selector.ranking_
array([1, 1, 1, 1, 1, 6, 4, 3, 2, 5])

从最终的学习器性能来看,包裹式特征选择比过滤式特征选择更好。但是另一方面,由于在特征选择过程中需多次训练学习期,因此包裹式特征选择的计算开销通常要大得多。

嵌入式(embedded)

SelectFromModel选取特征

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

SelectFromModel 是一个 meta-transformer(元转换器) ,它可以用来处理任何带有 coef_ 或者 feature_importances_ 属性的训练之后的评估器。 如果相关的coef_ 或者 feature_importances_ 属性值低于预先设置的阈值,这些特征将会被认为不重要并且移除掉。除了指定数值上的阈值之外,还可以通过给定字符串参数来使用内置的启发式方法找到一个合适的阈值。可以使用的启发式方法有 mean 、 median 以及使用浮点数乘以这些(例如,0.1*mean)

Linear models 使用 L1 正则化的线性模型会得到稀疏解:他们的许多系数为 0。 当目标是降低使用另一个分类器的数据集的维度, 它们可以与 feature_selection.SelectFromModel 一起使用来选择非零系数。

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

其实用包装好的库看不出嵌入式的两者兼顾,实际上在fit后,得到coef的过程中,相当于已经做出了特征选择。

另外,基于树的 estimators 也可以用来计算特征的重要性,然后可以消除不相关的特征(当与 sklearn.feature_selection.SelectFromModel 等元转换器一同使用时)

以下是一个使用随机森林进行特征选择的例子:

from sklearn.ensemble import RandomForestClassifier
feat_labels = df_wine.columns[1:]
forest = RandomForestClassifier(n_estimators=500,
                                random_state=1)
forest.fit(X_train, y_train)
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1]
for f in range(X_train.shape[1]):
    print("%2d) %-*s %f" % (f + 1, 30,
                            feat_labels[indices[f]],
                            importances[indices[f]]))
  • Reference:
  1. http://scikit-learn.org/stable/modules/feature_selection.html
  2. http://sklearn.apachecn.org/cn/0.19.0/modules/feature_selection.html
  3. https://www.kaggle.com/bertcarremans/data-preparation-exploration
  4. https://github.com/rasbt/python-machine-learning-book-2nd-edition
  5. https://www.zhihu.com/question/28641663
  6. 《机器学习》.周志华

原文地址:https://www.cnblogs.com/bjwu/p/9103002.html

时间: 2024-08-03 23:24:11

机器学习之特征选择方法的相关文章

结合Scikit-learn介绍几种常用的特征选择方法

作者:Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的).

干货:结合Scikit-learn介绍几种常用的特征选择方法

原文  http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我

机器学习中特征选择概述

1. 背景 1.1 问题 在机器学习的实际应用中,特征数量可能较多,其中可能存在不相关的特征,特征之间也可能存在相关性,容易导致如下的后果: (1) 特征个数越多,分析特征.训练模型所需的时间就越长,模型也会越复杂. (2) 特征个数越多,容易引起"维度灾难",其推广能力会下降. (3) 特征个数越多,容易导致机器学习中经常出现的特征稀疏的问题,导致模型效果下降. (4)对于模型来说,可能会导致不适定的情况,即是解出的参数会因为样本的微小变化而出现大的波动. 特征选择,能剔除不相关.冗

特征选择方法之信息增益

前文提到过,除了开方检验(CHI)以外,信息增益(IG,Information Gain)也是非常有效的特征选择方法.但凡是特征选择,总是在将特征的重要程度量化之后再进行选择,而怎样量化特征的重要性,就成了各种方法间最大的不同.开方检验中使用特征与类别间的关联性来进行这个量化,关联性越强,特征得分越高,该特征越应该被保留. 在信息增益中,重要性的衡量标准就是看特征可以为分类系统带来多少信息,带来的信息越多,该特征越重要. 因此先回顾一下信息论中有关信息量(就是"熵")的定义.说有这么一

特征选择方法

1. TF-IDF的误区 TF-IDF可以有效评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.因为它综合表征了该词在文档中的重要程度和文档区分度.但在文本分类中单纯使用TF-IDF来判断一个特征是否有区分度是不够的. 1)它没有考虑特征词在类间的分布.也就是说该选择的特征应该在某类出现多,而其它类出现少,即考察各类的文档频率的差异.如果一个特征词,在各个类间分布比较均匀,这样的词对分类基本没有贡献:但是如果一个特征词比较集中的分布在某个类中,而在其它类中几乎不出现,这样的词却能够

文本分类入门-特征选择方法之信息增益

http://www.blogjava.net/zhenandaci/archive/2009/03/24/261701.html 前文提到过,除了开方检验(CHI)以外,信息增益(IG,Information Gain)也是很有效的特征选择方法.但凡是特征选择,总是在将特征的重要程度量化之后再进行选择,而如何量化特征的重要性,就成了各种方法间最大的不同.开方检验中使用特征与类别间的关联性来进行这个量化,关联性越强,特征得分越高,该特征越应该被保留. 在信息增益中,重要性的衡量标准就是看特征能够

文本分类特征选择方法

-1. TF-IDF的误区 TF-IDF可以有效评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.因为它综合表征了该词在文档中的重要程度和文档区分度.但在文本分类中单纯使用TF-IDF来判断一个特征是否有区分度是不够的. 1)它没有考虑特征词在类间的分布.也就是说该选择的特征应该在某类出现多,而其它类出现少,即考察各类的文档频率的差异.如果一个特征词,在各个类间分布比较均匀,这样的词对分类基本没有贡献:但是如果一个特征词比较集中的分布在某个类中,而在其它类中几乎不出现,这样的词却能

信息增益的特征选择方法

正如我前面提到的,了开方检验(CHI)以外,信息增益(IG,Information Gain)也是非常有效的特征选择方法. 但凡是特征选择,总是在将特征的重要程度量化之后再进行选择,而怎样量化特征的重要性,就成了各种方法间最大的不同.开方检验中使用特征与类别间的关联性来进行这个量化.关联性越强.特征得分越高.该特征越应该被保留. 在信息增益中,重要性的衡量标准就是看特征可以为分类系统带来多少信息,带来的信息越多.该特征越重要. 因此先回顾一下信息论中有关信息量(就是"熵")的定义.说有

有监督和无监督的特征选择方法

特征选择实质上包括两个部分:特征词的选择和特征词权重的计算. 特征词选择的方法分为有监督的方法和无监督的方法. 有监督的方法包括IG和CHI,无监督的方法包括Document   Frequency (DF),  Term  Strength  (TS)和 Entropy-based  (En). 可以参考https://www.aaai.org/Papers/ICML/2003/ICML03-065.pdf