特征选择 订阅
特征选择( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ),或属性选择( Attribute Selection )。是指从已有的M个特征(Feature)中选择N个特征使得系统的特定指标最优化,是从原始特征中选择出一些最有效特征以降低数据集维度的过程,是提高学习算法性能的一个重要手段,也是模式识别中关键的数据预处理步骤。对于一个学习算法来说,好的学习样本是训练模型的关键。 [1]  此外,需要区分特征选择与特征提取。特征提取 ( Feature extraction )是指利用已有的特征计算出一个抽象程度更高的特征集,也指计算得到某个特征的算法。特征选择过程一般包括产生过程,评价函数,停止准则,验证过程,这4个部分。 展开全文
特征选择( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ),或属性选择( Attribute Selection )。是指从已有的M个特征(Feature)中选择N个特征使得系统的特定指标最优化,是从原始特征中选择出一些最有效特征以降低数据集维度的过程,是提高学习算法性能的一个重要手段,也是模式识别中关键的数据预处理步骤。对于一个学习算法来说,好的学习样本是训练模型的关键。 [1]  此外,需要区分特征选择与特征提取。特征提取 ( Feature extraction )是指利用已有的特征计算出一个抽象程度更高的特征集,也指计算得到某个特征的算法。特征选择过程一般包括产生过程,评价函数,停止准则,验证过程,这4个部分。
信息
外文名
FSS ;Feature Subset Selection;
拼    音
tè zhēng xuǎn zé
用    途
提高学习算法
中文名
特征选择
特征选择四要素
一般而言,特征选择可以看作一个搜索寻优问题。对大小为n 的特征集合, 搜索空间由2n-1 种可能的状态构成。Davies 等证明最小特征子集的搜索是一个NP 问题,即除了穷举式搜索,不能保证找到最优解。但实际应用中,当特征数目较多的时候, 穷举式搜索因为计算量太大而无法应用,因此人们致力于用启发式搜索算法寻找次优解。一般特征选择算法必须确定以下4 个要素:1)搜索起点和方向;2)搜索策略;3)特征评估函数;4)停止准则。 [2]  搜索起点是算法开始搜索的状态点,搜索方向是指评价的特征子集产生的次序。搜索的起点和搜索方向是相关的,它们共同决定搜索策略。一般的,根据不同的搜索起点和方向,有以下4 种情况:1)前向搜索搜索起点是空集S,依据某种评价标准,随着搜索的进行,从未被包含在S 里的特征集中选择最佳的特征不断加入S。2)后向搜索搜索起点是全集S,依据某种评价标准不断从S 中剔除最不重要的特征,直到达到某种停止标准。3)双向搜索双向搜索同时从前后两个方向开始搜索。一般搜索到特征子集空间的中部时,需要评价的子集将会急剧增加。当使用单向搜索时,如果搜索要通过子集空间的中部就会消耗掉大量的搜索时间,所以双向搜索是比较常用的搜索方法。 [2]  4)随机搜索随机搜索从任意的起点开始,对特征的增加和删除也有一定的随机性。假设原始特征集中有n 个特征(也称输入变量),那么存在2n-1 个可能的非空特征子集。搜索策略就是为了从包含2n-1 个候选解的搜索空间中寻找最优特征子集而采取的搜索方法。搜索策略可大致分为以下3 类:1)穷举式搜索它可以搜索到每个特征子集。缺点是它会带来巨大的计算开销,尤其当特征数较大时,计算时间很长。分支定界法(Branch and Bound, BB)通过剪枝处理缩短搜索时间。 [2]  2)序列搜索它避免了简单的穷举式搜索,在搜索过程中依据某种次序不断向当前特征子集中添加或剔除特征,从而获得优化特征子集。比较典型的序列搜索算法如:前向后向搜索、浮动搜索、双向搜索、序列向前和序列向后算法等。序列搜索算法较容易实现,计算复杂度相对较小,但容易陷入局部最优。3)随机搜索由随机产生的某个候选特征子集开始,依照一定的启发式信息和规则逐步逼近全局最优解。例如:遗传算法(Genetic Algorithm, GA)、模拟退火算法(SimulatedAnnealing, SA)、粒子群算法(Particl Swarm Optimization,PSO)和免疫算法(Immune Algorithm, IA)等。 [2]  评价标准在特征选择过程中扮演着重要的角色,它是特征选择的依据。评价标准可以分为两种:一种是用于单独地衡量每个特征的预测能力的评价标准;另一种是用于评价某个特征子集整体预测性能的评价标准。在Filte方法中,一般不依赖具体的学习算法来评价特征子集,而是借鉴统计学、信息论等多门学科的思想,根据数据集的内在特性来评价每个特征的预测能力,从而找出排序较优的若干个特征组成特征子集。通常,此类方法认为最优特征子集是由若干个预测能力较强的特征组成的。相反,在Wrapper 方法中,用后续的学习算法嵌入到特征选择过程中,通过测试特征子集在此算法上的预测性能来决定它的优劣,而极少关注特征子集中每个特征的预测性能如何。因此,第二种评价标准并不要求最优特征子集中的每个特征都是优秀的。 [2]  停止标准决定什么时候停止搜索, 即结束算法的执行。它与评价准则或搜索算法的选择以及具体应用需求均有关联。常见的停止准则一般有:1)执行时间即事先规定了算法执行的时间,当到达所制定的时间就强制终止算法运行,并输出结果。2)评价次数即制定算法需要运算多少次,通常用于规定随机搜索的次数, 尤其当算法运行的结果不稳定的情况下,通过若干次的运行结果找出其中稳定的因素。3) 设置阈值一般是给算法的目标值设置一个评价阈值,通过目标与该阈值的比较决定算法停止与否。不过,要设置一个合适的阈值并不容易,需要对算法的性能有十分清晰的了解。否则,设置阈值过高会使得算法陷入死循环,阈值过小则达不到预定的性能指标。 [2] 
收起全文
精华内容
下载资源
问答
  • 特征选择-MATLAB

    2017-11-28 19:49:43
    模式识别-特征选择-几种算法的matlab实现。
  • 特征选择

    千次阅读 2020-03-15 22:37:40
    本文关注于特征选择部分。后面还有两篇会关注于特征表达和特征预处理。 1. 特征的来源  在做数据分析的时候,特征的来源一般有两块,一块是业务已经整理好各种特征数据,我们需要去找出适合我们问题需要的特征;...

    特征工程是数据分析中最耗时间和精力的一部分工作,它不像算法和模型那样是确定的步骤,更多是工程上的经验和权衡。因此没有统一的方法。这里只是对一些常用的方法做一个总结。本文关注于特征选择部分。后面还有两篇会关注于特征表达和特征预处理。

    1. 特征的来源

        在做数据分析的时候,特征的来源一般有两块,一块是业务已经整理好各种特征数据,我们需要去找出适合我们问题需要的特征;另一块是我们从业务特征中自己去寻找高级数据特征。我们就针对这两部分来分别讨论。

    2.  选择合适的特征

        我们首先看当业务已经整理好各种特征数据时,我们如何去找出适合我们问题需要的特征,此时特征数可能成百上千,哪些才是我们需要的呢?

        第一步是找到该领域懂业务的专家,让他们给一些建议。比如我们需要解决一个药品疗效的分类问题,那么先找到领域专家,向他们咨询哪些因素(特征)会对该药品的疗效产生影响,较大影响的和较小影响的都要。这些特征就是我们的特征的第一候选集。

        这个特征集合有时候也可能很大,在尝试降维之前,我们有必要用特征工程的方法去选择出较重要的特征结合,这些方法不会用到领域知识,而仅仅是统计学的方法。

        最简单的方法就是方差筛选。方差越大的特征,那么我们可以认为它是比较有用的。如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。在实际应用中,我们会指定一个方差的阈值,当方差小于这个阈值的特征会被我们筛掉。sklearn中的VarianceThreshold类可以很方便的完成这个工作。

        特征选择方法有很多,一般分为三类:第一类过滤法比较简单,它按照特征的发散性或者相关性指标对各个特征进行评分,设定评分阈值或者待选择阈值的个数,选择合适特征。上面我们提到的方差筛选就是过滤法的一种。第二类是包装法,根据目标函数,通常是预测效果评分,每次选择部分特征,或者排除部分特征。第三类嵌入法则稍微复杂一点,它先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小来选择特征。类似于过滤法,但是它是通过机器学习训练来确定特征的优劣,而不是直接从特征的一些统计学指标来确定特征的优劣。下面我们分别来看看3类方法。

    2.1 过滤法选择特征

        上面我们已经讲到了使用特征方差来过滤选择特征的过程。除了特征的方差这第一种方法,还有其他一些统计学指标可以使用。

        第二个可以使用的是相关系数。这个主要用于输出连续值的监督学习算法中。我们分别计算所有训练集中各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。

        第三个可以使用的是假设检验,比如卡方检验。卡方检验可以检验某个特征分布和输出值分布之间的相关性。个人觉得它比比粗暴的方差法好用。如果大家对卡方检验不熟悉,可以参看这篇卡方检验原理及应用,这里就不展开了。在sklearn中,可以使用chi2这个类来做卡方检验得到所有特征的卡方值与显著性水平P临界值,我们可以给定卡方值阈值, 选择卡方值较大的部分特征。

        除了卡方检验,我们还可以使用F检验和t检验,它们都是使用假设检验的方法,只是使用的统计分布不是卡方分布,而是F分布和t分布而已。在sklearn中,有F检验的函数f_classif和f_regression,分别在分类和回归特征选择时使用。

        第四个是互信息,即从信息熵的角度分析各个特征和输出值之间的关系评分。在决策树算法中我们讲到过互信息(信息增益)。互信息值越大,说明该特征和输出值之间的相关性越大,越需要保留。在sklearn中,可以使用mutual_info_classif(分类)和mutual_info_regression(回归)来计算各个输入特征和输出值之间的互信息。

        以上就是过滤法的主要方法,个人经验是,在没有什么思路的 时候,可以优先使用卡方检验和互信息来做特征选择

    2.2 包装法选择特征

        包装法的解决思路没有过滤法这么直接,它会选择一个目标函数来一步步的筛选特征。

        最常用的包装法是递归消除特征法(recursive feature elimination,以下简称RFE)。递归消除特征法使用一个机器学习模型来进行多轮训练,每轮训练后,消除若干权值系数的对应的特征,再基于新的特征集进行下一轮训练。在sklearn中,可以使用RFE函数来选择特征。

        我们下面以经典的SVM-RFE算法来讨论这个特征选择的思路。这个算法以支持向量机来做RFE的机器学习模型选择特征。它在第一轮训练的时候,会选择所有的特征来训练,得到了分类的超平面wx˙+b=0wx˙+b=0后,如果有n个特征,那么RFE-SVM会选择出ww中分量的平方值w2iwi2最小的那个序号i对应的特征,将其排除,在第二类的时候,特征数就剩下n-1个了,我们继续用这n-1个特征和输出值来训练SVM,同样的,去掉w2iwi2最小的那个序号i对应的特征。以此类推,直到剩下的特征数满足我们的需求为止。

    2.3 嵌入法选择特征

        嵌入法也是用机器学习的方法来选择特征,但是它和RFE的区别是它不是通过不停的筛掉特征来进行训练,而是使用的都是特征全集。在sklearn中,使用SelectFromModel函数来选择特征。

        最常用的是使用L1正则化和L2正则化来选择特征。在之前讲到的用scikit-learn和pandas学习Ridge回归第6节中,我们讲到正则化惩罚项越大,那么模型的系数就会越小。当正则化惩罚项大到一定的程度的时候,部分特征系数会变成0,当正则化惩罚项继续增大到一定程度时,所有的特征系数都会趋于0. 但是我们会发现一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的。也就是说,我们选择特征系数较大的特征。常用的L1正则化和L2正则化来选择特征的基学习器是逻辑回归。

        此外也可以使用决策树或者GBDT。那么是不是所有的机器学习方法都可以作为嵌入法的基学习器呢?也不是,一般来说,可以得到特征系数coef或者可以得到特征重要度(feature importances)的算法才可以做为嵌入法的基学习器。

    3.  寻找高级特征

        在我们拿到已有的特征后,我们还可以根据需要寻找到更多的高级特征。比如有车的路程特征和时间间隔特征,我们就可以得到车的平均速度这个二级特征。根据车的速度特征,我们就可以得到车的加速度这个三级特征,根据车的加速度特征,我们就可以得到车的加加速度这个四级特征。。。也就是说,高级特征可以一直寻找下去。

        在Kaggle之类的算法竞赛中,高分团队主要使用的方法除了集成学习算法,剩下的主要就是在高级特征上面做文章。所以寻找高级特征是模型优化的必要步骤之一。当然,在第一次建立模型的时候,我们可以先不寻找高级特征,得到以后基准模型后,再寻找高级特征进行优化。

        寻找高级特征最常用的方法有:

        若干项特征加和: 我们假设你希望根据每日销售额得到一周销售额的特征。你可以将最近的7天的销售额相加得到。
        若干项特征之差: 假设你已经拥有每周销售额以及每月销售额两项特征,可以求一周前一月内的销售额。
        若干项特征乘积: 假设你有商品价格和商品销量的特征,那么就可以得到销售额的特征。
        若干项特征除商: 假设你有每个用户的销售额和购买的商品件数,那么就是得到该用户平均每件商品的销售额。

        当然,寻找高级特征的方法远不止于此,它需要你根据你的业务和模型需要而得,而不是随便的两两组合形成高级特征,这样容易导致特征爆炸,反而没有办法得到较好的模型。个人经验是,聚类的时候高级特征尽量少一点,分类回归的时候高级特征适度的多一点。

    4. 特征选择小结

        特征选择是特征工程的第一步,它关系到我们机器学习算法的上限。因此原则是尽量不错过一个可能有用的特征,但是也不滥用太多的特征。

    展开全文
  • 文章目录机器学习中的特征特征的重要性特征提取和特征选择去除方差较小的特征单变量特征选择 (Univariate feature selection)F检验与互信息其他特征选择方法重复性特征删除:用模型选择:并入pipeline 机器学习中的...

    机器学习中的特征

    在机器学习和模式识别中,特征是在观测现象中的一种独立、可测量的属性。选择信息量大的、有差别性的、独立的特征是模式识别、分类和回归问题的关键一步。
    最初的原始特征数据集可能太大,或者信息冗余,因此在机器学习的应用中,一个初始步骤就是选择特征的子集,或构建一套新的特征集,减少功能来促进算法的学习,提高泛化能力和可解释性。
    在机器视觉中,一幅图像是一个观测,但是特征可能是图中的一条线;在自然语言处理中,一个文本是一个观测,但是其中的段落或者词频可能才是一种特征;在语音识别中,一段语音是一个观测,但是一个词或者音素才是一种特征。

    特征的重要性

    在特征选择时, 经常根据重要性, 将重要的特征选择出来放入训练集合. 相关系数和独立变量方法是常用的方法。
    在构建模型的过程中, 有时候也会用到一些复杂的预测模型进行特征的重要性评价和选择, 例如多元自适应回归样条法( Multivariate Adaptive Regression Splines, MARS), 随机森林( Random Forest), 梯度提升机( Gradient Boosted Machines)等.

    特征提取和特征选择

    • 特征提取
      对原始观测进行降维以便于建模的过程, 对于表格式的数据, 可以用主成分分析PCA, 聚类等方法; 对于图像数据, 可以用线(line)/边缘(edge)提取, 对于视频, 音频数据, 很多数字信号处理的方法都可以用于特征提取.
    • 特征选择
      特征选择是自动地选择出对于问题最重要的特征子集的过程. 由于不同特征对模型准确度的影响程度不同, 特征选择算法用评分排序, 或者用反复实验来搜索出特征子集, 自动创建并评估模型得到最佳特征子集. 另外还有一些方法将特征选择作为模型的附加功能, 例如逐步回归法( stepwise regression)
      sklearn的feature_selection模块在特征选择和样本集合降维上, 用来提高模型的正确率或者提高他们在高维度数据上的表现.

    特征选择的方法可以大致分为:

    1. Filter: 过滤法, 按照方差或者相关性对特征评分, 根据阈值选择特征
    2. Wrapper: 包装法, 根据目标函数(预测效果评分), 选择/排除若干特征

    特征选择的目的:

    1. 降维, 增强模型泛化能力, 减少过拟合
    2. 便于理解特征和标签之间的关系

    去除方差较小的特征

    VarianceThreshold是一个简单的特征选择基准方法, 该方法就是去除所有没有达到指定阈值的特征. 默认是去除所有零方差的数据, 例如那些在所有样本中都一样的特征.

    举例来说, 我们有一个数据集合, 所有的数据都是布尔值, 我们想去掉80%的概率上不是0就是1的特征维度, 对于布尔型的数据来说, 服从伯努利分布, 理论方差为:
    Var[X]=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=(0.8*(1-0.8)))
    sel.fit_transform(X)
    
    

    单变量特征选择 (Univariate feature selection)

    单变量特征选择是对每个变量单独做统计分析, 之后再根据统计指标来判断变量是否重要.

    问题类型统计指标
    分类问题卡方检验, f_classif, 互信息( mutual_info_classif)
    回归问题皮尔逊相关系数(f_regression), 互信息回归(mutual_info_regression)

    其他形式:

    • SelectKBest: 仅保留得分K名以内的所有特征(TOP k)
    • SelectPercentile 仅保留指定前k百分比的数据(TOP k%)
    • 单变量检验, 例如假阳性比例SelectFpr, 伪发现率 SelectFdr, 族系误差率SelectFwe.
    • GenericUnivariateSelect 允许设置特征选择参数, 不同的选择策略可以使用超参数调优, 从而找到最佳单变量特征选择策略.

    总的来说, 基于F检验的算法是用F检验估计来计算不同变量之间的线性依赖度(degree of linear dependency), 基于互信息的算法可以捕获到任意一种统计依赖关系, 但是作为一种非参数检验方法, 需要大量的样本才能得到比较准确的结果.

    如果数据的稀疏性很强, 可以选择chi2, mutual_info_regression, mutual_info_classif 这些特征选择方法.

    F检验与互信息

    sklearn的官方教程给出了关于F检验和互信息区别的说明. 假设有3个特征 x1, x2, x3 都服从[0,1]正态分布,
    目标函数如下:
    y=x_1+sin(6pix_2)+0.1*N(0,1)
    显然, y的取值与x_3完全不相关. 下面这段代码用了F检验和互信息两种方法给出了x与y之间的依赖关系.

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.feature_selection import f_regression, mutual_info_regression
    
    np.random.seed(0)
    X = np.random.rand(1000, 3)
    y = X[:, 0] + np.sin(6*np.pi*X[:,1]) + 0.1*np.random.randn(1000)
    
    f_test, _ = f_regression(X, y)
    f_test /= np.max(f_test)
    
    mi = mutual_info_regression(X, y)
    mi = mi/np.max(mi)
    
    plt.figure(figsize=(15,15))
    for ii in range(3):
    	plt.subplot(1, 3, ii+1)
    	plt.scatter(X[:,ii], y, edgecolor=’black’, s=20)
    	plt.xlabel(“$x_{}$”.format(ii+1), fontsize=14)
    	if ii in range(3):
    		plt.ylabel(“$y$”, fontsize=14)
    	plt.title(“F-test={:.2f}, mi={:.2f}.format(f_test[i], mi[i]), fontsize=16)
    plt.show()
    

    在这里插入图片描述

    图中依次绘制了x_1, x_2, x_3与y之间的依赖关系, 图上标题是对应特征的统计指数(F-score和互信息), 可以看到, F-test更适合与线性关系的特征, 而互信息系数在非线性
    F检验得到的是数据之间的线性关系, 因此, F-test将x_1标记为最具有识别力的参数(discriminative), 互信息可以识别变量之间任意形式(非线性的)依赖关系, 因此互信息将x_2标记为最具有识别力的参数(或者说重要特征).

    下面给出了一个F 检验(ANOVA 方差检验) 与SVM的例子, 在SVM之前, 先用anova对数据做了降维.

    """
    =================================================
    SVM-Anova: SVM with univariate feature selection
    =================================================
    
    This example shows how to perform univariate feature selection before running a
    SVC (support vector classifier) to improve the classification scores.
    """
    print(__doc__)
    
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import svm, datasets, feature_selection
    from sklearn.cross_validation import cross_val_score
    from sklearn.pipeline import Pipeline
    
    ###############################################################################
    # Import some data to play with
    digits = datasets.load_digits()
    y = digits.target
    # Throw away data, to be in the curse of dimension settings
    y = y[:200]
    X = digits.data[:200]
    n_samples = len(y)
    X = X.reshape((n_samples, -1))
    # add 200 non-informative features
    X = np.hstack((X, 2 * np.random.random((n_samples, 200))))
    
    ###############################################################################
    # Create a feature-selection transform and an instance of SVM that we
    # combine together to have an full-blown estimator
    #feature_selection.f_classif:计算所提供样本的方差分析F-值anova:方差分析
    #feature_selection.SelectPercentile(k):只留下k值最高的一组特征,返回最终的估计器
    transform = feature_selection.SelectPercentile(feature_selection.f_classif)
    #anova:Analysis of Variance(方差分析)
    clf = Pipeline([('anova', transform), ('svc', svm.SVC(C=1.0))])
    
    ###############################################################################
    # Plot the cross-validation score as a function of percentile of features
    score_means = list()
    score_stds = list()
    percentiles = (1, 3, 6, 10, 15, 20, 30, 40, 60, 80, 100)
    
    for percentile in percentiles:
        #clf.set_params:设置此估计器的参数。
        #使用网格搜索(grid search)和交叉验证(cross validation)来选择参数.
        #对方差分析中的参数percentile进行调节,实现多重比较检验
        #用于确定控制变量的不同水平对观测变量的影响程度如何
        clf.set_params(anova__percentile=percentile)
        # Compute cross-validation score using 1 CPU
        #http://scikit-learn.org/dev/modules/generated/sklearn.model_selection.
        #cross_val_score.html#sklearn.model_selection.cross_val_score
        #cross_val_score:最简单的交叉验证方法,cv选择折数,默认是3折交叉验证
        this_scores = cross_val_score(clf, X, y, n_jobs=1)
        score_means.append(this_scores.mean())
        score_stds.append(this_scores.std())
    #plt.errorbar以折线形式画出均值和方差
    plt.errorbar(percentiles, score_means, np.array(score_stds))
    
    plt.title(
        'Performance of the SVM-Anova varying the percentile of features selected')
    plt.xlabel('Percentile')
    plt.ylabel('Prediction rate')
    
    plt.axis('tight')
    

    其他特征选择方法

    重复性特征删除:

    from sklearn.feature_selection import RFE

    print(__doc__)
    
    from sklearn.svm import SVC
    from sklearn.datasets import load_digits
    from sklearn.feature_selection import RFE
    import matplotlib.pyplot as plt
    
    # Load the digits dataset
    digits = load_digits()
    X = digits.images.reshape((len(digits.images), -1))
    y = digits.target
    
    # Create the RFE object and rank each pixel
    svc = SVC(kernel="linear", C=1)
    rfe = RFE(estimator=svc, n_features_to_select=1, step=1)
    rfe.fit(X, y)
    ranking = rfe.ranking_.reshape(digits.images[0].shape)
    
    # Plot pixel ranking
    plt.matshow(ranking, cmap=plt.cm.Blues)
    plt.colorbar()
    plt.title("Ranking of pixels with RFE")
    plt.show()
    

    神经影像分析中常用的searchlight方法,本质上也是一种recursive feature selection方法.

    用模型选择:

    from sklearn.feature_selection import 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)
    

    并入pipeline

    特征选择可以作为数据处理pipeline中的一个环节, 在核心模型之前进行数据降维和特征提取.

    clf = Pipeline([
      ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
      ('classification', RandomForestClassifier())
    ])
    clf.fit(X, y)
    
    

    参考:
    特征工程: https://blog.csdn.net/jasonding1354/article/details/47171115
    https://blog.csdn.net/sqiu_11/article/details/58719935
    scikit learn 文档: https://scikit-learn.org/stable/modules/feature_selection.html

    展开全文
  • 特征选择是面试中一个非常受欢迎的问题。 这篇文章能带你了解这方面相关的知识。 为什么要使用特征选择 你熟悉鸢尾花的数据集吗?(sklearn自带小型数据集)即使是最简单的算法也能得到如此美妙的结果,这难道不令人...

    特征选择是面试中一个非常受欢迎的问题。 这篇文章能带你了解这方面相关的知识。

    为什么要使用特征选择

    你熟悉鸢尾花的数据集吗?(sklearn自带小型数据集)即使是最简单的算法也能得到如此美妙的结果,这难道不令人惊叹吗?

    很抱歉让你失望了,但这是不现实的。大多数情况下,特征的数量§比样本的数量(N)要多得多(p>>N)——这也被称为维数诅咒。但是,为什么这是个问题呢

    高维数据可能导致以下情况:

    • 训练时间长
    • 过度拟合

    即使不是p>>N,有一长串机器学习算法可以假设自变量。采用特征选择方法去除相关特征。此外,将特征空间的维数降至相关特征的子集,可以减少训练的计算量,提高模型的泛化性能。

    特征选择是从数据集中删除无关和冗余特征的过程。反过来,该模型将降低复杂性,因此更易于解释。

    “有时候,越少越好!”

    过滤方法

    根据特征与目标变量的关系选择特征子集。选择不依赖于任何机器学习算法。相反,过滤方法通过统计检验来衡量特征与输出的“相关性”。你可以参考下表:

    皮尔森的相关性

    度量两个连续变量之间线性相关性的统计量。从-1到+1,+1为正线性相关,0为无线性相关,-1为负线性相关。

    数据集:波士顿房屋房价数据集(sklearn自带)。它包括13个连续特征和业主自住房屋在$1000s的中值(目标变量)。

    在这里插入图片描述

    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from sklearn.datasets import load_boston
    
    X, y = load_boston(return_X_y=True)
    feature_names = load_boston().feature_names
    
    data = pd.DataFrame(X, columns=feature_names)
    data['MEDV'] = y
    
    # compute pearson's r
    target_correlation = data.corr()[['MEDV']]
    
    # we only care about the target variable
    plt.figure(figsize=(7,5))
    sns.heatmap(target_correlation, annot=True, cmap=plt.cm.Reds)
    plt.show()
    

    # extract the most correlated features with the output variable
    target_correlation[abs(target_correlation)>0.5].dropna()
    

    相关系数的大小在0.5 - 0.7之间,表示可以认为是中度相关的变量,因此我们将阈值设为0.5。

    从13个特征中,只有3个与目标有很强的相关性(相关特征);RM, PTRATIO, LSTAT。但是,我们只检查了每个单独特征与输出变量的相关性。由于许多算法,比如线性回归,假设输入特征是不相关的,我们必须计算前3个特征之间的皮尔森r值。

    sns.heatmap(data.corr().loc[['RM', 'PTRATIO', 'LSTAT'], ['RM', 'PTRATIO', 'LSTAT']], annot=True, cmap=plt.cm.Reds)
    
    plt.show()
    

    RM和LSTAT是相互关联的,所以我们选择其中一个(去掉RM就等于去掉冗余特征)。由于LSTAT与目标变量MEDV的相关性高于RM,所以我们选择LSTAT。

    LDA

    线性判别分析是一种有监督的线性算法,它将数据投影到更小的子空间k (k < N-1)中,同时最大化类间的分离。更具体地说,该模型找到的特征的线性组合,实现最大的可分离性,在每个类内的方差最小。

    数据集:乳腺癌威斯康辛(诊断)数据集,包括569个记录,每个由30个特征描述。这项任务是将肿瘤分类为恶性或良性。

    import pandas as pd
    from sklearn.linear_model import LogisticRegression
    from sklearn.preprocessing import LabelEncoder
    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
    from sklearn.model_selection import StratifiedKFold, cross_val_score
    from sklearn.pipeline import Pipeline
    
    df = pd.read_csv('breast_cancer.csv').iloc[:,1:-1]
    X = df.drop(['diagnosis'], axis=1)
    
    le = LabelEncoder()
    y = le.fit_transform(df.diagnosis)
    labels = le.classes_
    
    steps = [('lda', LinearDiscriminantAnalysis()), ('m', LogisticRegression(C=10))]
    model = Pipeline(steps=steps)
    
    # evaluate model
    cv = StratifiedKFold(n_splits=5)
    n_scores_lda = cross_val_score(model, X, y, scoring='f1_macro', cv=cv, n_jobs=-1)
    
    model = LogisticRegression(C=10)
    n_scores = cross_val_score(model, X, y, scoring='f1_macro', cv=cv, n_jobs=-1)
    
    # report performance
    print('f1-score (macro)\n')
    print('With LDA: %.2f' % np.mean(n_scores_lda))
    print('Without LDA: %.2f' % np.mean(n_scores))
    

    使用LDA作为预处理步骤,性能提高了4%。

    ANOVA

    方差分析(Analysis of Variance )是检验不同输入类别对输出变量是否有显著差异的一种统计方法。来自sklearn的f_classifmethod允许对多个数据组进行分析,以确定样本之间和样本内部的可变性,从而获得关于独立变量和从属变量之间的关系的信息。例如,我们可能想测试两种程序,看看哪一种在收入方面比另一种表现更好。

    from sklearn.feature_selection import f_classif, SelectKBest
    
    fs = SelectKBest(score_func=f_classif, k=5)
    
    X_new = fs.fit(X, y)
    

    注意:之前,我们只设k=5。如果不是5而是4呢?我们可以通过k-fold交叉验证执行网格搜索来微调所选特征的数量

    from sklearn.model_selection import StratifiedKFold, GridSearch
    from sklearn.pipeline import Pipeline
    from sklearn.linear_model import LinearRegression
    
    
    cv = StratifiedKFold(n_splits=5)
    
    pipeline = Pipeline(steps=[('anova',fs), ('lr', LinearRegression(solver='liblinear'))])
    params = {['anova__k']: [i+1 for i in range(X.shape[1])]}
    
    search = GridSearchCV(pipeline, params, scoring='accuracy', n_jobs=-1, cv=cv)
    
    results = search.fit(X, y)
    print('Best k: %s' % results.best_params_)
    

    χ²卡方

    卡方检验特定特征和特定类的出现是否使用它们的频率分布是独立的。零假设是两个变量是独立的。但是,如果方差值大,则应拒绝原假设。在选择特征时,我们希望提取那些高度依赖于输出的特征。

    数据集: Dream Housing Finance公司处理所有住房贷款,并希望自动化贷款资格流程。 数据集包含11个分类和数字特征,用于描述客户的个人资料。 目标变量是二元的-客户是否有资格获得贷款

    from sklearn.feature_selection import chi2, SelectKBest
    
    loan = pd.read_csv('loan_data_set.csv')
    loan = loan.drop('Loan_ID', axis=1) # irrelevant feature
    
    #Transform the numerical feature into categorical feature
    loan['Loan_Amount_Term'] = loan['Loan_Amount_Term'].astype('object')
    loan['Credit_History'] = loan['Credit_History'].astype('object')
    
    #Dropping all the null value
    loan.dropna(inplace = True)
    
    #Retrieve all the categorical columns except the target
    categorical_columns = loan.select_dtypes(exclude='number').drop('Loan_Status', axis=1).columns
    
    
    #Retrieve all the categorical columns except the target
    categorical_columns = loan.select_dtypes(exclude='number').drop('Loan_Status', axis=1).columns
    
    fs = SelectKBest(score_func=chi2, k=5)
    X_kbest = fs.fit_transform(X, y)
    

    非线性关系呢?

    到目前为止,我们一直在讨论假设两个元素X,Y之间存在线性关系的方法。这些方法无法捕获除此以外的任何关系。 为了解决这个问题,我们可以看一下特征与目标变量之间的互信息(MI)。 MI的范围是0(无互信息)和1(完全相关)。 Sklearn为回归和分类任务提供实施。

    from sklearn.feature_selection import mutual_info_regression, mutual_info_classif, SelectKBest
    
    fs = SelectKBest(score_func=mutual_info_classif, k=5) 
    
    # top 5 features
    X_subset = fs.fit_transform(X, y)
    

    可以使用主成分分析吗?

    当然可以。 但是请不要将特征提取与特征选择混淆。 PCA是一种无监督的线性变换技术。 这是减少维数的另一种方法-但是要小心,尽管在这种方法中我们不选择特征,而是通过将数据投影到较低维的空间中同时保留最大方差来变换特征空间。 该技术导致不相关的变量(主要成分)是旧变量的线性组合。 不幸的是,您并不真正了解这些新功能代表什么,因此尽管降低了维度,但您肯定会丧失可解释性。

    注意:不要犯年轻的ML从业人员最常见的错误之一:在非连续特征上应用PCA。 我知道在离散变量上运行PCA时代码不会中断,但这并不意味着您应该这样做。

    注意事项

    尽管我们已经看到了很多进行特征选择的方法(还有更多方法),但总会有答案“我不会做”。 我知道这听起来可能很奇怪,尤其是当它来自本文的作者时,但是我需要给出所有可能的答案,这就是其中之一。

    “特征选择”需要时间,您可能不考虑既不花费时间也不花费精力。 您必须始终牢记两件事:1.由于您正在放弃特征,所以肯定会丢失信息; 2.即使您尝试了所有技术,也可能看不到模型性能的重大改进。

    作者:Elli Tzini

    deephub翻译组

    展开全文
  • 特征选择-过滤式选择

    千次阅读 多人点赞 2019-05-28 23:09:11
    过滤式方法先按照某种规则对数据集进行特征选择,然后再训练学习器,特征选择过程与后续学习器无关,这相当于先用特征选择过程对初始特征进行“过滤”,再用过滤后的特征来训练模型。 【某种规则】:按照发散性或...

    过滤式方法先按照某种规则对数据集进行特征选择,然后再训练学习器,特征选择过程与后续学习器无关,这相当于先用特征选择过程对初始特征进行“过滤”,再用过滤后的特征来训练模型。

    【某种规则】:按照发散性或相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,从而选择满足条件的特征。

    • 特征的发散性:如果一个特征不发散,例如方差接近于 0,也就是说样本在该特征上基本没有差异,那么这个特征对于样本的区分并没有什么用。
    • 特征与目标的相关性:特征与目标的相关性越高说明特征的变动对目标的影响较大,因此我们应当优先选择与目标相关性高的特征。

    在后续所讲的方法中除方差选择法是基于特征发散性,其余方法均是从相关性考虑。

    思维导图

    方差选择法

    计算各个特征的方差,然后根据阈值选择方差大于阈值的特征,或者指定待选择的特征数 k,然后选择 k 个最大方差的特征。

    方差选择的依据是什么?举个极端的例子,在多分类问题中,如果某特征只有一个取值,那么该特征对分类结果没有任何意义,因为不管取什么值都为 1,单凭该特征是无法区分样本的分类。

    需要注意的是,方差选择法只有在特征是离散型时才适用,如果是连续型则需要离散化后才能使用。此外,该方法在实际问题中效果并非很好,参考如下数据集:

    A B Y
    1 1 0
    2 1 0
    3 1 0
    1 2 1
    2 2 1
    3 2 1
    

    特征 A 的方差 4 要大于特征 B 的方差 1.5,但特征 A 对最终分类结果 Y 的区分度明显没有特征 B 好。单看这 6 条数据,特征 A 几乎没有办法区分 Y 是 0 还是 1。因此我们需要明确一个概念,特征值的方差越大不一定对分类结果有更好的区分。关键原因是特征值的方差仅仅只考虑自身的取值,而没有结合最终的分类结果。

    【代码实现】:sklearn。

    >>> from sklearn.preprocessing import VarianceThreshold
    >>> X = [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]
    >>> selector = VarianceThreshold()
    >>> selector.fit_transform(X)
    array([[2, 0],
           [1, 4],
           [1, 1]])
    

    若不传给 VarianceThreshold() 阈值,则默认移除方差为 0 的特征。同样,我们也可以给 VarianceThreshold() 传递阈值:

    >>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
    >>> sel = VarianceThreshold(threshold=(0.16))
    >>> sel.fit_transform(X)
    array([[0, 1],
           [1, 0],
           [0, 0],
           [1, 1],
           [1, 0],
           [1, 1]])
    

    关于 VarianceThreshold() 的实现可参考官方 API 传送门

    不借助 sklearn 自行实现方差选择法,那么该如何编写代码呢?思路非常简单,先计算每一个特征的方差值,然后依次比对方差值与阈值,选择方差值大于阈值的特征。

    >>> def variance_select(data, threshold=0):
    ...     variance_list = np.var(data, axis=0)
    ...     result, ind = [], 0
    ...     for variance in variance_list:
    ...         if variance > threshold:
    ...             result.append(ind)
    ...             ind += 1
    ...     return np.array(data)[:, result]
    ...    
    >>> variance_select(X, 0.16)
    array([[0, 1],
           [1, 0],
           [0, 0],
           [1, 1],
           [1, 0],
           [1, 1]])
    

    相关系数法

    计算各个特征对目标值的相关系数及相关系数的 P 值。

    在机器学习中我们一般采用皮尔逊相关系数来测量两个序列的线性关系,也就是说皮尔逊相关系数只能检测出线性关系,那么对于分类问题的适用性就远低于回归问题,因此相关系数法常用于回归问题。

    为什么皮尔逊相关系数只能测量线性关系呢?具体解释可参考这篇博文 传送门

    【代码实现】:我们以 sklearn.datasets 中的波士顿房价数据集为例。

    import numpy as np
    import pandas as pd
    from sklearn.datasets import load_boston
    
    
    dataset_boston = load_boston()
    dataset = dataset_boston.data
    labels = dataset_boston.target
    
    # 我们把 label 也加到 dataset 中
    dataset_all = np.column_stack((dataset, labels))
    columns = [name for name in dataset_boston.feature_names]
    columns.append('label')
    
    df_dataset = pd.DataFrame(data=dataset_all, columns=columns)
    df_dataset.corr(method='pearson')
    

    波士顿房价皮尔逊相关系数表.png

    通过 df_dataset.corr(method=‘pearson’) 这句指令,我们可以看到各特征两两之间的皮尔逊相关系数。当然我们更关注的是特征与最终要预测的对象(房价)的相关系数。

    除了使用 pandas 的 corr(method=‘pearson’) 方法之外,我们还可以使用 scipy.stats.pearsonr() 方法。

    >>> from scipy.stats import pearsonr
    >>> pearsonr(dataset[:, 0], labels)
    (-0.38830460858681154, 1.1739870821945733e-19)
    >>> pearsonr(dataset[:, 1], labels)
    (0.3604453424505432, 5.713584153081686e-17)
    

    上述代码分别计算 CRIM、ZN 和 label 之间的相关系数,可以看到输出结果的第一项与 corr(method=‘pearson’) 计算的结果相同,不同的是 pearsonr() 方法还多输出了一项 1.1739870821945733e-19 和 5.713584153081686e-17。

    scipy.stats.pearsonr() 对给定两个数据序列会返回相关系数值和 p 值所组成的元组。也就是说 1.1739870821945733e-19 和 5.713584153081686e-17 就是这个 p 值,那么 p 值有什么用呢?p 值是该数据序列产生于一个不相关系统的概率,p 值越高,我们越不能信任这个相关系数。

    不使用已有的方法自行实现相关系数的计算,依据相关系数的计算公式:
    ρ = Cov ⁡ ( X , Y ) σ X σ Y C o v ( X , Y ) = ∑ ( x − m x ) ( y − m y ) \rho=\frac{\operatorname{Cov}(X, Y)}{\sigma_{X} \sigma_{Y}} \quad Cov(X, Y) = \sum\left(x-m_{x}\right)\left(y-m_{y}\right) ρ=σXσYCov(X,Y)Cov(X,Y)=(xmx)(ymy)
    其中, m x m_x mx m y m_y my 分别是向量 x 和 y 的均值。

    【代码实现】:

    def corr(vector_A, vector_B):
        if vector_A.shape[0] != vector_B.shape[0]:
            raise Exception('The Vector must be the same size')
            
        vector_A_mean, vector_B_mean = np.mean(vector_A), np.mean(vector_B)
        vector_A_diff, vector_B_diff = vector_A - vector_A_mean, vector_B - vector_B_mean
        molecule = np.sum(vector_A_diff * vector_B_diff)
        denominator = np.sqrt(np.sum(vector_A_diff**2) * np.sum(vector_B_diff**2))
        return molecule / denominator
    

    相关系数的取值在 -1 到 1 之间,-1 代表负相关、1 代表正相关、0 代表不相关。

    >>> corr(np.array([1, 2, 3, 4, 5]), np.array([1, 4, 7, 10, 13]))
    1.0
    >>> corr(np.array([1, 2, 3, 4, 5]), np.array([13, 10, 7, 4, 1]))
    -1.0
    >>> corr(np.array([1, 2, 3, 4, 5]), np.array([7, 10, 4, 13, 1]))
    -0.3
    

    通过上述示例可以发现,特征与预测值的相关系数值越接近 -1 或 1 时,特征的变化趋势与预测值的变化趋势具有高度的一致性(反向或同向),也就是说这些特征对预测值产生的影响也越大,因此,我们优先选择相关系数绝对值大的特征。

    卡方检验法

    检验定性自变量对定性因变量的相关性。关于卡方检验的介绍可参考这篇文章 卡方检验原理及应用。需要注意的是,卡方检验适用于分类问题。

    【代码实现】:因为卡方检验适用于分类问题,因此以 sklearn.datasets 中的鸢尾花数据集为例。

    from sklearn.datasets import load_iris
    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import chi2
    
    
    dataset_iris = load_iris()
    dataset = dataset_iris.data
    labels = dataset_iris.target
    
    model_sk = SelectKBest(score_func=chi2, k=3)
    model_sk.fit(dataset, labels)
    print(model_sk.scores_)
    # 输出:array([ 10.81782088,   3.7107283 , 116.31261309,  67.0483602 ])
    print(model_sk.pvalues_)
    # 输出:array([4.47651499e-03, 1.56395980e-01, 5.53397228e-26, 2.75824965e-15])
    

    卡方值越大,表明特征与预测结果的相关性也越大,同时 p 值也相应较小,因此我们优先选择卡方值大的特征。

    互信息法

    互信息法与卡方检验法相同,都是评价定性自变量对定性因变量的相关性。互信息用以计算两个特征或自变量与因变量之间所共有的信息。

    【区别】:

    • 相关性:与相关性不同,互信息计算的不是数据序列,而是数据的分布,因此互信息可以用于检测特征间的非线性关系。

    【互信息量计算公式】:离散随机变量 X 和 Y。
    I ( X ; Y ) = ∑ y ∈ Y ∑ x ∈ X p ( x , y ) log ⁡ ( p ( x , y ) p ( x ) p ( y ) ) I(X ; Y)=\sum_{y \in Y} \sum_{x \in X} p(x, y) \log \left(\frac{p(x, y)}{p(x) p(y)}\right) I(X;Y)=yYxXp(x,y)log(p(x)p(y)p(x,y))
    其中 p(x, y) 是 X 和 Y 的联合概率分布函数,P(x) 和 p(y) 分别是 X 和 Y 的边缘概率分布函数。

    【互信息量计算公式】:连续随机变量 X 和 Y。
    I ( X ; Y ) = ∫ Y ∫ X p ( x , y ) log ⁡ ( p ( x , y ) p ( x ) p ( y ) ) d x d y I(X ; Y)=\int_{Y} \int_{X} p(x, y) \log \left(\frac{p(x, y)}{p(x) p(y)}\right) d x d y I(X;Y)=YXp(x,y)log(p(x)p(y)p(x,y))dxdy
    其中 p(x, y) 是 X 和 Y 的联合概率密度函数,p(x) 和 p(y) 分别是 X 和 Y 的边缘概率密度函数。

    根据公式可以看出,若 X 与 Y 完全独立,则 p(X, Y) = p(X)p(Y),I(X, Y) = 0。也就是说 I(X, Y) 越大,则表明 X 与 Y 的相关性越大。

    互信息 I(X, Y) 可以解释为由 X 引入而使 Y 的不确定度减小的量,这个减小的量为 H(Y|X)。所以,X 和 Y 关系越密切,I(X, Y) 就越大。

    sklearn 提供依据互信息来挑选特征的方法,并且既可以解决分类问题,也可以解决回归问题。

    【代码实现】:回归问题

    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import mutual_info_regression
    from sklearn.datasets import load_boston
    
    dataset_boston = load_boston()
    data_boston = dataset_boston.data
    target_boston = dataset_boston.target
    
    model_sk = SelectKBest(score_func=mutual_info_regression, k=4)
    model_sk.fit(data_boston, target_boston)
    print(model_sk.scores_)
    # 输出
    array([0.34945217, 0.18259661, 0.47229519, 0.0209894 , 0.46333988,
           0.52746991, 0.31724869, 0.29427874, 0.22223963, 0.35585112,
           0.45497479, 0.16204564, 0.66418786])
    

    【代码实现】:分类问题

    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import mutual_info_classif
    from sklearn.datasets import load_iris
    
    dataset_iris = load_iris()
    data_iris = dataset_iris.data
    target_iris = dataset_iris.target
    
    model_sk = SelectKBest(score_func=mutual_info_classif, k=2)
    model_sk.fit(data_iris, target_iris)
    print(model_sk.scores_)
    # 输出
    array([0.48850984, 0.25341124, 0.9957628 , 0.97604533])
    

    基于模型的特征排序

    该方法的思路同包裹式选择,直接使用后续要用的机器学习算法,针对每个单独的特征和预测值建立预测模型。

    【步骤】:

    1. 判断特征和预测值之间的关系,若为线性则考虑线性算法;若为非线性,则考虑非线性算法,例如基于树模型的方法;
    2. 单独采用每个特征进行建模,并进行交叉验证;
    3. 选择指定个数评分最高的特征,组成特征子集。

    【代码实现】:以鸢尾花数据集为例,模型以决策树为例。

    from sklearn.datasets import load_iris
    from sklearn.model_selection import cross_val_score
    from sklearn.model_selection import KFold
    from sklearn.tree import DecisionTreeClassifier
    
    
    dataset_iris = load_iris()
    data_iris = dataset_iris.data
    target_iris = dataset_iris.target
    feature_iris = dataset_iris.feature_names
    
    model_dtc = DecisionTreeClassifier()
    kfold = KFold(n_splits=10, random_state=7)
    scores = []
    for i in range(data_iris.shape[1]):
        score = cross_val_score(model_dtc, data_iris[:, i:i+1], target_iris, cv=kfold, scoring='mutual_info_score')
        scores.append((format(score.mean(), '.3f'), feature_iris[i]))
    print(scores)
    # 输出
    [('0.059', 'sepal length (cm)'),
     ('0.024', 'sepal width (cm)'),
     ('0.127', 'petal length (cm)'),
     ('0.127', 'petal width (cm)')]
    

    当然我们也可以指定不同的评分标准:

    score = cross_val_score(model_dtc, data_iris[:, i:i+1], target_iris, cv=kfold, scoring='adjusted_mutual_info_score')
    # 输出
    [('0.043', 'sepal length (cm)'),
     ('0.007', 'sepal width (cm)'),
     ('0.472', 'petal length (cm)'),
     ('0.600', 'petal width (cm)')]
    

    最终,根据评分标准选择最优的特征,组成特征子集。

    Relief

    Relief(Relevant Features)是一种著名的过滤式特征选择方法,该方法设计了一个“相关统计量”来度量特征的重要性。该统计量是一个向量,其每个分量分别对应于一个初始特征,而特征子集的重要性则是由子集中每个特征所对应的相关统计量分量之和来决定。

    【选择方式】:

    • 指定一个阈值 r,然后选择比 r 大的相关统计量分量所对应的特征即可;
    • 指定要选取的特征个数 k,然后选择相关统计量分量最大的 k 个特征。

    【关键】:如何确定相关统计量。

    给定训练集 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x n , y n ) } \{(x_1, y_1), (x_2, y_2), \cdots, (x_n, y_n)\} {(x1,y1),(x2,y2),,(xn,yn)},对每个实例 x i x_i xi,Relief 先在 x i x_i xi 的同类样本中寻找其最近邻 x i , n h x_{i,nh} xi,nh,称为“猜中近邻”(near-hit),再从 x i x_i xi 的异类样本中寻找其最近邻 x i , n m x_{i,nm} xi,nm 称为“猜错近邻”(near-miss),然后,相关统计量对应于特征 j 的分量为
    δ j = ∑ i = 1 n − d i f f ( x i j , x i , n h j ) 2 + d i f f ( x i j , x i , n m j ) 2 \delta^j = \sum_{i=1}^n -diff(x_i^j, x_{i,nh}^j)^2 + diff(x_i^j, x_{i, nm}^j)^2 δj=i=1ndiff(xij,xi,nhj)2+diff(xij,xi,nmj)2
    其中 x a j x_a^j xaj 表示样本 x a x_a xa 在特征 j 上的取值, d i f f ( x a j , x b j ) diff(x_a^j, x_b^j) diff(xaj,xbj) 取决于特征 j 的类型:

    • 若特征 j 为离散型,则 x a j = x b j x_a^j = x_b^j xaj=xbj 时, d i f f ( x a j , x b j ) = 0 diff(x_a^j, x_b^j) = 0 diff(xaj,xbj)=0,否则为 1;
    • 若特征 j 为连续型,则 d i f f ( x a j , x b j ) = ∣ x a j − x b j ∣ diff(x_a^j, x_b^j) = |x_a^j - x_b^j| diff(xaj,xbj)=xajxbj,注意 x a j , x b j x_a^j, x_b^j xaj,xbj 已规范化到 [0, 1] 区间。

    从上式中可以看出,若 x i x_i xi 与其猜中近邻 x i , n h x_{i,nh} xi,nh 在特征 j 上的距离小于 x i x_i xi 与其猜错近邻 x i , n m x_{i, nm} xi,nm 的距离,则说明特征 j 对区分同类与异类样本是有益的,于是增大特征 j 所对应的统计量分量;反之,若则说明特征 j 起负面作用,于是减小特征 j 所对应的统计量分量。

    最后,对基于不同样本得到的估计结果进行平均,就得到各特征的相关统计量分量,分量值越大,则对应特征的分类能力就越强。

    实际上 Relief 只需在数据集的采样上而不必在整个数据集上估计相关统计量。Relief 的时间开销随采样次数以及原始特征数呈线性增长,因此是一个运行效率很高的过滤式特征选择算法。

    Relief 是为二分类问题设计的,其扩展变体 Relief-F 能处理多分类问题。

    【Relief-F】:假定数据集 D 中的样本来自 |Y| 个类别。对实例 x i x_i xi,若它属于第 k 类,则 Relief-F 先在第 k 类的样本中寻找 x i x_i xi 的最近邻实例 x i , n h x_{i, nh} xi,nh 并将其作为猜中近邻,然后在第 k 类之外的每个类中找到一个 x i x_i xi 的最近邻实例走位猜错近邻,记为 x i , l , n m ( l = 1 , 2 , ⋯   , ∣ Y ∣ ; l ≠ k ) x_{i,l,nm}(l = 1, 2, \cdots, |Y|; l \neq k) xi,l,nm(l=1,2,,Y;l=k)。于是,相关统计量对应于特征 j 的分量为
    δ j = ∑ i = 1 n − d i f f ( x i j , x i , n h j ) 2 + ∑ l ≠ k ( p l × d i f f ( x i j , x i , l , n m j ) 2 ) \delta^j = \sum_{i=1}^n -diff(x_i^j, x_{i,nh}^j)^2 + \sum_{l \neq k}(p_l \times diff(x_i^j, x_{i,l,nm}^j)^2) δj=i=1ndiff(xij,xi,nhj)2+l=k(pl×diff(xij,xi,l,nmj)2)
    其中, p l p_l pl 为第 l 类样本在数据集 D 中所占的比例。

    参考

    • 《机器学习》周志华
    • 《百面机器学习》
    • 特征选择:https://blog.csdn.net/shingle_/article/details/51725054
    • 特征选择 (feature_selection):https://www.cnblogs.com/stevenlk/p/6543628.html#%E7%A7%BB%E9%99%A4%E4%BD%8E%E6%96%B9%E5%B7%AE%E7%9A%84%E7%89%B9%E5%BE%81-removing-features-with-low-variance
    • SelectKBest:https://blog.csdn.net/weixin_33962923/article/details/87837426
    • 如何通俗易懂地解释「协方差」与「相关系数」的概念?:https://www.zhihu.com/question/20852004
    • 卡方检验原理及应用:https://segmentfault.com/a/1190000003719712
    • 互信息:https://www.cnblogs.com/gatherstars/p/6004075.html
    展开全文
  • 特征选择-嵌入式选择

    千次阅读 2019-05-28 15:37:56
    嵌入式特征选择是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动地进行了特征选择。 基于惩罚项的特征选择法 给定数据集 D={(x1,y1),(x2,y2),⋯&ThinSpace;,...
  • 如何使用方差阈值进行特征选择

    千次阅读 2021-04-11 11:14:02
    基于方差阈值的特征选择介绍 今天,数据集拥有成百上千个特征是很常见的。从表面上看,这似乎是件好事——每个样本的特征越多,信息就越多。但通常情况下,有些特征并没有提供太多价值,而且引入了不必要的复杂性。 ...
  • 利用sklearn进行特征选择

    千次阅读 2019-12-20 22:27:47
    3种特征选择 Filter 过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。 (先对数据集进行特征选择,然后再训练学习器) Wrapper 包装法,根据目标函数(通常是预测效果...
  • 特征选择/筛选方法总结

    万次阅读 多人点赞 2019-03-30 14:51:16
    1.特征选择介绍 1)特征分类 相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果; 无关特征:对于我们的算法没有任何帮助,不会给算法的效果带来任何提升; 冗余特征:不会对我们的算法...
  • Python之特征选择实战(转载)

    千次阅读 多人点赞 2019-07-04 14:42:48
    转载自... 目录 1 特征工程是什么? 2 数据预处理  2.1 无量纲化  2.1.1 标准化  2.1.2 区间缩放法  2.1.3 标准化与归一化的区别  2.2 对定量特征二值化 ...3 特征选择  3....
  • 特征选择 Python代码

    千次阅读 2019-12-12 20:38:57
    一、特征选择 对与机器学习建模。在海量特征时,特征工程选择是必要的。特征工程很大程度上决定了模型的效果和模型的稳定性。特征工程中包函内容很多,包括数据分析,特征组合变换,特征选择和特征降维等等的技术。...
  • 虽然 scikit-learn 中有许多众所周知的特征选择方法,但特征选择方法还有很多,并且远远超出了scikit-learn 提供的方法。特征选择是机器学习的关键方面之一。 但是因为技术的快速发展,现在是信息大爆炸的时代,有...
  • 特征选择 (feature_selection) Filter 1. 移除低方差的特征 (Removing features with low variance) 2. 单变量特征选择 (Univariate feature selection) Wrapper 3. 递归特征消除 (Recursive...
  • 特征选择的几种方法

    千次阅读 多人点赞 2020-02-08 23:53:56
    目录 1 过滤法(Filter) 1.1 方差选择法 1.2 相关系数法 1.3 卡方检验 1.4 互信息法 1.5 relief算法 2 包裹法(Wrapper) 2.1 递归特征消除法 2.2 特征干扰法 3 嵌入法(Embedded) ...4 特征选择方法的优...
  • 基于信息论的特征选择算法综述

    千次阅读 2019-09-03 17:31:45
    特征选择的目标是从样本数据集的原始特征F中寻找一个子集S,使得它包含尽可能多的类区分信息,即包含更多与类别C有关的知识,同时又使得子集内部的冗余程度尽量小。定义信息度量函数J(f),其目的是在原始特征集F内...
  • 特征选择的探索

    千次阅读 2018-07-24 01:16:25
    特征选择(feature selection),又称为变量选择,属性选择,或者变量子集选择。它指的是从原始特征集中选取最优特征子集的过程。筛选后得到的最优特征子集训练出来的模型具有更强的预测能力。特征选择的主要解决...
  • 特征选择与降维

    万次阅读 2018-07-17 14:18:12
    特征选择与降维 【直接从word复制过来的...格式真是惨不忍睹....阿西吧以后再改吧...o(╥﹏╥)o】 参考资料: 西瓜书《机器学习》 Sklearn官方文档(中文版:https://www.cnblogs.com/stevenlk/p/6543628.html)...
  • 当我们执行一项监督任务时,我们面临的问题是在我们的机器学习管道中加入适当的特征选择。只需在网上搜索,我们就可以访问讨论特征选择过程的各种来源和内容。 总而言之,有不同的方法来进行特征选择。文献中最著名...
  • 特征选择方法总结

    千次阅读 2018-09-18 18:59:25
    特征选择:从给定的特征集合中选取出相关特征子集的过程成为“特征选择”。 通过这一操作,不仅能够减少特征的维度,也能得到更能体现目标值的几个特征。在周志华的《机器学习》中第十一章对于特征选择也是有所...
  • 文章目录前言1.数据集选择2.feature-selector用法3.具有高missing-values百分比的特征4....从数据集去除选择特征9.结论 前言        FeatureSelector是用于降低机器学习数...
  • 关于机器学习特征选择的方法总结

    千次阅读 2019-09-12 14:51:46
    机器学习特征选择的方法总结 1.特征选择的重要性 随着深度学习的发展, 大大缩减了特征提取和设计的任务。 不过, 特征工程依然是各种机器学习应用领域的重要组成部分。其中对于特征选择(排序)的研究对于数据科学...
  • 特征筛选作为一个老生常谈的问题,但自身一直缺乏一个较为完整的梳理,现结合现有资料,总结于此。
  • 特征选择-包裹式选择

    千次阅读 2019-05-28 21:18:00
    包裹式选择与过滤式选择不考虑后续学习器不同,直接把最终使用的学习器的性能作为特征子集的评价准则。...但另一方面,由于在特征选择过程中需多次训练学习器,因此包裹式选择的计算开销通常比过滤式选择...
  • 特征选择(Feature Selection)

    万次阅读 多人点赞 2018-07-04 17:00:56
    为什么要进行特征选择? 什么是特征选择? 怎么进行特征选择 特征选择: 在现实生活中,一个对象往往具有很多属性(以下称为特征),这些特征大致可以被分成三种主要的类型: 相关特征:对于学习任务(例如分类...
  • 特征选择方法

    千次阅读 2018-09-05 18:47:07
    转载自:...链接:https://www.zhihu.com/question/29316149/answer/110159647 特征工程到底是什么? - 城东的回答 目录 1 特征工程是什么? 2 数据预处理  2.1 无量纲化  2.1.1 标准化  2.1....
  • 如何进行特征选择

    万次阅读 2017-12-15 14:59:56
    如何进行特征选择 原文地址:http://blog.csdn.net/u010670689/article/details/73196546 特征选择对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 630,757
精华内容 252,302
关键字:

特征选择