zoukankan      html  css  js  c++  java
  • 【特征工程】特征选择与特征学习

    http://www.jianshu.com/p/ab697790090f

    特征选择与特征学习

    在机器学习的具体实践任务中,选择一组具有代表性的特征用于构建模型是非常重要的问题。特征选择通常选择与类别相关性强、且特征彼此间相关性弱的特征子集,具体特征选择算法通过定义合适的子集评价函数来体现。
    在现实世界中,数据通常是复杂冗余,富有变化的,有必要从原始数据发现有用的特性。人工选取出来的特征依赖人力和专业知识,不利于推广。于是我们需要通过机器来学习和抽取特征,促进特征工程的工作更加快速、有效。

    特征选择

    特征选择的目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。另一方面,选取出真正相关的特征简化模型,协助理解数据产生的过程。
    特征选择的一般过程如下图所示:


     


    图中,(1)子集产生:按照一定的搜索策略产生候选特征子集;(2)子集评估:通过某个评价函数评估特征子集的优劣;(3)停止条件:决定特征选择算法什么时候停止;(4)子集验证:用于验证最终所选的特征子集的有效性。

    特征选择的搜索策略

    特征选择的搜索策略分为:完全搜索策略、启发式策略以及随机搜索策略。
    特征选择本质上是一个组合优化问题,求解组合优化问题最直接的方法就是搜索,理论上可以通过穷举法来搜索所有可能的特征组合,选择使得评价标准最优的特征子集作为最后的输出,但是n个特征的搜索空间为2n,穷举法的运算量随着特征维数的增加呈指数递增,实际应用中经常碰到几百甚至成千上万个特征,因此穷举法虽然简单却难以实际应用。其他的搜索方法有启发式的搜索和随机搜索,这些搜索策略可以在运算效率和特征子集质量之间寻找到一个较好的平衡点,而这也是众多特征选择算法努力的目标。

    • 完全搜索(Complete)
      • 广度优先搜索( Breadth First Search )
        广度优先遍历特征子空间。枚举所有组合,穷举搜索,实用性不高。
      • 分支限界搜索( Branch and Bound )
        穷举基础上加入分支限界。例如:剪掉某些不可能搜索出比当前最优解更优的分支。
        其他,如定向搜索 (Beam Search ),最优优先搜索 ( Best First Search )等
    • 启发式搜索(Heuristic)
      • 序列前向选择(SFS,Sequential Forward Selection)
        从空集开始,每次加入一个选最优。
      • 序列后向选择(SBS,Sequential Backward Selection)
        从全集开始,每次减少一个选最优。
      • 增L去R选择算法 (LRS,Plus-L Minus-R Selection)
        从空集开始,每次加入L个,减去R个,选最优(L>R)或者从全集开始,每次减去R个,增加L个,选最优(L<R)。
        其他如双向搜索(BDS,Bidirectional Search),序列浮动选择(Sequential Floating Selection)等
    • 随机搜索(Random)
      • 随机产生序列选择算法(RGSS, Random Generation plus Sequential Selection)
        随机产生一个特征子集,然后在该子集上执行SFS与SBS算法。
      • 模拟退火算法( SA, Simulated Annealing )
        以一定的概率来接受一个比当前解要差的解,而且这个概率随着时间推移逐渐降低
      • 遗传算法( GA, Genetic Algorithms )
        通过交叉、突变等操作繁殖出下一代特征子集,并且评分越高的特征子集被选中参加繁殖的概率越高。
        随机算法共同缺点:依赖随机因素,有实验结果难重现。

    特征选择算法

    特征选择和机器学习算法两者存在紧密的联系,根据特征选择中子集评价标准和后续学习算法的结合方式可分为嵌入式(Embedded)、过滤式(Filter)和封装式(Wrapper)式三种。


     

    嵌入式特征选择
    在嵌入式特征选择中,特征选择算法本身作为组成部分嵌入到学习算法里。最典型的即决策树算法,如ID3、C4.5以及CART算
    法等,决策树算法在树增长过程的每个递归步都必须选择一个特征,将样本集划分成较小的子集,选择特征的依据通常是划分后子节点的纯度,划分后子节点越纯,则说明划分效果越好,可见决策树生成的过程也就是特征选择的过程。

    过滤式特征选择
    过滤式特征选择的评价标准从数据集本身的内在性质获得,与特定的学习算法无关,因此具有较好的通用性。通常选择和类别相关度大的特征或者特征子集。过滤式特征选择的研究者认为,相关度较大的特征或者特征子集会在分类器上可以获得较高的准确率。过滤式特征选择的评价标准分为四种,即距离度量、信息度量、关联度度量以及一致性度量。
    过滤式特征选择算法的优缺点分别是:

    优点:算法的通用性强;省去了分类器的训练步骤,算法复杂性低,因而适用于大规模数据集;可以快速去除大量不相关的特征,作为特征的预筛选器非常合适。
    缺点:由于算法的评价标准独立于特定的学习算法,所选的特征子集在分类准确率方面通常低于Wrapper方法。

    封装式特征选择
    封装式特征选择是利用学习算法的性能来评价特征子集的优劣。因此,对于一个待评价的特征子集,Wrapper方法需要训练一个分类器,根据分类器的性能对该特征子集进行评价。Wrapper方法中用以评价特征的学习算法是多种多样的,例如决策树、神经网络、贝叶斯分类器、近邻法以及支持向量机等等。
    封装式特征选择算法的优缺点分别是:

    优点:相对于Filter方法,Wrapper方法找到的特征子集分类性能通常更好。
    缺点:Wrapper方法选出的特征通用性不强,当改变学习算法时,需要针对该学习算法重新进行特征选择;由于每次对子集的评价都要进行分类器的训练和测试,所以算法计算复杂度很高,尤其对于大规模数据集来说,算法的执行时间很长。

    有效性分析

    对特征的有效性进行分析,得到各个特征的特征权重,根据是否与模型有关可以分为:
    1.与模型相关特征权重,使用所有的特征数据训练出来模型,看在模型中各个特征的权重,由于需要训练出模型,模型相关的权重与此次学习所用的模型比较相关。不同的模型有不同的模型权重衡量方法。例如线性模型中,特征的权重系数等。
    2.与模型无关特征权重。主要分析特征与label的相关性,这样的分析是与这次学习所使用的模型无关的。
    与模型无关特征权重分析方法包括(1)交叉熵,(2)Information Gain,(3)Odds ratio,(4)互信息,(5)KL散度等。

    特征学习

    特征学习可以分为监督特征学习和无监督特征学习:
    监督特征学习包括监督字典学习、神经网络、多层感知机;无监督特征学习包括无监督字典学习、主成分分析、独立成分分析、自编码器、矩阵分解和各种形式的聚类算法。


     

    监督特征学习

    监督字典学习
    字典学习是从输入数据中学习一组代表元素的字典,其中每个数据都可以表示为代表元素的加权和。通过最小化带有L1正则项的平均误差来确定字典元素和权重,并保证权重稀疏。
    监督字典学习利用输入数据和标签的隐含结构来优化字典元素。

    神经网络
    神经网络是用来描述一系列学习算法,通过相互关联的节点构成的多层网络。它是受神经系统的启发,其中节点可以看做是神经元,边可以看成是突触。每个边都有相对应的权重,网络定义了计算规则,将数据从输入层传递到输出层。
    多层神经网络可以用来进行特征学习,因为它们可以学习在隐藏层中的输出的表示。

    非监督特征学习

    非监督特征学习的目标是捕捉高维数据中的底层结构,挖掘出低维的特征。
    K-means聚类
    K-means聚类是一种矢量量化的方法,给定一组向量,K-means算法将这些数据组织成k个子集,使得每个向量属于最近的均值所在的子集。
    在特征学习中,K-means算法可以将一些没有标签的输入数据进行聚类,然后使用每个类别的质心来生成新的特征。
    最简单的方法是在每个输入样本中加入K个二元特征,其中当且仅当第j个质心距离采样数据最近时,第j个特征置为1。另一种方式是利用到子集的距离作为特征,或者是经过径向基函数进行转换的子集距离。

    主成分分析(Principal component analysis)
    主成分分析主要用于降维。给定无标签的数据集,PCA生成p个奇异值向量(p远远小于数据的维度),对应数据矩阵中p个最大的奇异值。这p个奇异值向量是从输入数据中学习的特征向量,它们代表了数据具有最大方差的方向。
    PCA是一种线性特征学习方法,因为p个奇异指向量是数据矩阵的线性方程。
    PCA有几点局限:首先,它假设最大方差的方向是最感兴趣的,而实际上很多应用中可能不是。PCA依赖于原始数据的正交变换,它只挖掘了数据的一阶、二阶矩,这并没有很好的表征数据分布。最后,PCA只有在输入数据向量是相关的情况下才能很好地降维。

    局部线性嵌入(Local linear embedding)
    局部线性嵌入(LLE)是一种非线性的非监督学习方法,用来从未标注的高维输入中生成低维的近邻保持表征。
    LLE的一般思想是,通过保持原有数据集的部分集合特性的低维数据来重构原始高维数据。LLE包含两个主要步骤,第一步是近邻保持(neighbor-preserving),其中每个输入数据Xi通过K近邻数据点的加权和重构,并且通过最小化平均平方重构误差(average squared reconstruction error)找到最优权重;第二步是降维(dimension reduction),在低维空间中寻找向量,该向量使用第一步的权重可以最小化表示误差。
    相比PCA,LLE对于利用数据的隐含结构能力更强大。

    独立成分分析(Independent component analysis)
    独立成分分析是利用独立非高斯成分的加权和学习数据表示的技术。非高斯前提的强制条件是因为当所有成分满足高斯分布时权重无法唯一确定。

    无监督字典学习(Unsupervised dictionary learning)
    与监督字典学习不同的是,非监督字典学习不利用数据的标签,只是利用数据的潜在结构来优化字典元素。无监督字典学习的例子是稀疏编码,它用来重无标签数据中学习用于数据表示的基函数(即字典元素)。稀疏编码可以用来学习超完备字典(overcomplete dictionary),其中字典元素的数目要远远大约输入数据的维度。K-SVD是用于从无标记数据中学习数据稀疏表示的字典。

    深度学习

    分层结构的神经系统启发了由简单学习模块构成的多层深度学习架构来进行特征学习。
    在深度学习体系中每个中间层的输出可以看做是原始输入数据的一种表示,每层利用上一层中产生的表示作为输入,生成新的表示作为输出,提供给更高层。输入的底层是原始数据,而最终层输出的是最后的低维特征或表征。

    受限玻尔兹曼机(Restricted Boltzmann Machine)
    首先玻尔兹曼常常用来构建多层学习结构。它可以用包含一组二元隐含变量、一组可见变量、连接隐含节点和可见节点的边的无向二分图(undirected bipartite graph)来表示,它是无内节点连接的广义玻尔兹曼机的特例。RBM的每个边有一个权重,这些权重联系在一起定义了一个能量方程,该方程基于可见和隐含节点的联合分布。基于RBM的拓扑学,隐含变量和可见变量是条件独立的,这一特性便于RBM的计算。
    RBM可以看做是无监督特征学习的一层,可见变量对应输入数据,隐含变量对应特征探测器(feature detectors)。利用对比散度算法(contrastive divergence)来最大可见变量的概率,训练权重。
    一般而言,上述RBM的训练问题得到的是非稀疏的表示,而稀疏RBM,作为RBM的一种修正版本,是通过在数据似然的目标函数中添加正则化方法,来惩罚小常量中期望隐含变量的偏差。

    自编码器(Autoencoder)
    自编码器有编码器和解码器组成。编码器使用原始数据作为输入,生成特征或表征,解码器利用编码器抽取的特征来作为输入,重建原始输入数据并输出。编码器和解码器是由多层RBM构成。结构中的参数通过层与层的贪婪方式训练得到:在一层特征探测器学习之后,它们被提供给上层作为可见变量用于响应RBM的训练,该过程一直重复直到停止条件满足方结束。

    转载请注明作者Jason Ding及其出处
    Github博客主页(http://jasonding1354.github.io/)
    GitCafe博客主页(http://jasonding1354.gitcafe.io/)
    CSDN博客(http://blog.csdn.net/jasonding1354)
    简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
    Google搜索jasonding1354进入我的博客主页



    文/JasonDing(简书作者)
    原文链接:http://www.jianshu.com/p/ab697790090f
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    CPU 常识(计算机组成原理)
    设置动态网站,要求访问端口 8998
    未知高宽的div在其父级div中垂直居中显示
    ES6 学习 -- Generator函数
    ES6 学习 -- Class继承
    ES6 学习 -- Class
    ES6 学习 -- 字符串模板
    ES6 学习 -- 字符串新增方法
    ES6 学习 -- Promise对象
    ES6 学习 -- Set和Map数据结构
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/6212254.html
Copyright © 2011-2022 走看看