机器学习之特征选择方法(代码片段)

ByronNG ByronNG     2022-11-18     189

关键词:

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

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

  • 避免维数灾难:能剔除不相关(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)^2E\)

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. 《机器学习》.周志华




机器学习之决策树(代码片段)

1、C4.5算法介绍C4.5算法与ID3算法不同的是采用了信息增益比作为特征的选择,原因是:信息增益在选择属性时偏向于选择取值较多的属性。2、信息增益比特征A对训练数据集D的信息增益比定义为其信息增益g(D,A)与特征A的熵HA(D)之... 查看详情

机器学习之数据处理与可视化鸢尾花数据分类|特征属性比较(代码片段)

@[toc]一,前言1.1本文基于原理大部分的机器学习模型所处理的都是特征,特征通常是输入变量所对应的可用于模型的数值表示。大部分情况下,收集得到的数据需要经过处理后才能够为算法所使用。通常情况下,一个数据集当中... 查看详情

机器学习之特征选择和降维的理解

在机器学习中,特征选择和降维感觉好像差不多,维度都降低了,今天和其他同学交流学习才知道其实不然,区别很大。 一般情况下,我们不会使用原始数据直接去进行训练,因为原始数据的特征明显,信息丰富,我们训练... 查看详情

系统学习机器学习之特征工程--分箱总结(代码片段)

...wiki给出一个标准的连续特征离散化的定义:在统计和机器学习中,离散化是指将连续属性,特征或变量转换或划分为离散或标称属性/特征/变量/间隔的过程。这在创建概率质量函数时非常有用-正式地,在密度估... 查看详情

机器学习之决策树(代码片段)

1、算法介绍决策树是一种基本的分类和回归方法,决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。决策树学习通常包括三个步骤:特征选择、决策树的生成和决策树的修剪。决策树的本质是从训... 查看详情

机器学习之主成分分析(pca&特征选择)

...身的含义:1、特征选择  特征选择对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。特征选择主要... 查看详情

机器学习之决策树(decisiontree)(代码片段)

 Contents 理论基础熵信息增益算法实现Python模型的保存与读取总结理论基础决策树(DecisionTree,DT):决策树是一种基本的分类与回归方法。由于模型呈树形结构,可以看做是if-then规则的集合,具有一定的可读性,可视化效果... 查看详情

机器学习之数据清洗与特征提取

...技术实践干货哦~作者:汪毅雄导语:本文详细的解释了机器学习中,经常会用到数据清洗与特征提取的方法PCA,从理论、数据、代码三个层次予以分析。 机器学习,这个名词大家都耳熟能详。虽然这个概念很早就被人提出... 查看详情

机器学习之五:神经网络反向传播算法(代码片段)

一、逻辑回归的局限在逻辑回归一节中,使用逻辑回归的多分类,实现了识别20*20的图片上的数字。但所使用的是一个一阶的模型,并没有使用多项式,为什么?可以设想一下,在原有400个特征的数据样本中,增加二次、三次、... 查看详情

机器学习之特征选择

用过滤法对以下数据进行特征选择:                            [[0,2,0,3],            &... 查看详情

机器学习之特征工程简介

简介特征工程非常重要。对于模型的效果起大了极大的作用。实际开发中,大部分的时间都花费在特征工程上面。特征工程最重要的是对具体业务的深刻理解。减少数据存储和输入的代价,降低数据的维度发现更多深入... 查看详情

机器学习之决策树(代码片段)

目录1、决策树2、决策树的构建2.1特征选择2.2特征树的生成2.3特征树的剪枝1、决策树树:是由节点和边两种元素组成的结构。其中节点包括根结点、父节点、子节点和叶子节点。决策树:利用树结构进行决策,每一个非叶子节点... 查看详情

机器学习之——正规方程法

1.梯度下降法(1)需要选择学习率a(2)需要多次迭代优点:梯度下降法在特征变量很多的情况下也能运行地相当好2.正规方程法(1)不需要选择学习率a(2)不需要迭代(3)正规方程法不需要做特征缩放 缺点:当正规方程法的特征矩阵维... 查看详情

机器学习之线性回归(代码片段)

文章目录评价方法一元线性回归np.polyfit求解带入公式求解化简公式求解lstsq求解多元线性回归代码实现一元多项式回归代码实现参考评价方法回归问题有很多的评价方法。这里主要想写一下R^2的计算方法。需要计算R^2需要先弄清... 查看详情

机器学习之推荐算法(代码片段)

1、知识点"""推荐系统1、相似度计算:1、欧几里德距离2、皮尔逊相关系数3、Cosin距离2、推荐相似度选择:1、固定数量的邻居2、基于相似度门槛的邻居3、基于用户的协同过滤:根据用户和其他用户之间的相关系数值,选择值越... 查看详情

机器学习之knn鸢尾花分类(代码片段)

KNN简介邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。kNN算法的核... 查看详情

浅谈机器学习之深度学习(代码片段)

...资料,学习建议1.1.4深度学习之“深度”深度学习是机器学习的一个分支领域:它是从数据中学习表示的一种新方法,强调从连续的层(layer)中进行学习,这些层对应于越来越有意义的表示。“深度学习... 查看详情

机器学习之特征工程简介

简介特征工程非常重要。对于模型的效果起大了极大的作用。实际开发中,大部分的时间都花费在特征工程上面。特征工程最重要的是对具体业务的深刻理解。减少数据存储和输入的代价,降低数据的维度发现更多深入... 查看详情