机器学习入门系列(2)--如何构建一个完整的机器学习项目,第六篇!html
该系列的前五篇文章:git
这也是特征工程系列最后一篇文章,介绍特征提取、特征选择、特征构建三个工做,一般特征工程被认为分为这三方面的内容,只是我将前面的数据&特征预处理部分都加入到这个系列。程序员
实际上,特征工程实际上是很是须要经过实践才能更好掌握这个技能的,单纯看理论,理解不够深刻,实际应用到项目或者比赛中的时候,才会有更深刻的理解。github
定义:从给定的特征集合中选出相关特征子集的过程称为特征选择(feature selection)。算法
1.对于一个学习任务,给定了属性集,其中某些属性可能对于学习来讲很关键,但有些属性意义就不大。微信
2.特征选择可能会下降模型的预测能力,由于被剔除的特征中可能包含了有效的信息,抛弃这部分信息必定程度上会下降模型的性能。但这也是计算复杂度和模型性能之间的取舍:网络
3.常见的特征选择分为三类方法:数据结构
1.采用特征选择的缘由:app
2.特征选择最重要的是确保不丢失重要的特征,不然就会由于缺乏重要的信息而没法获得一个性能很好的模型。框架
3.在没有任何先验知识,即领域知识的前提下,要想从初始特征集合中选择一个包含全部重要信息的特征子集,惟一作法就是遍历全部可能的特征组合。
但这种作法并不实际,也不可行,由于会遭遇组合爆炸,特征数量稍多就没法进行。
一个可选的方案是:
这里有两个问题:如何根据评价结果获取下一个候选特征子集?如何评价候选特征子集的好坏?
1.子集搜索方法步骤以下:
给定特征集合 A={A1,A2,...,Ad} ,首先将每一个特征看做一个候选子集(即每一个子集中只有一个元素),而后对这 d 个候选子集进行评价。
假设 A2 最优,因而将 A2 做为第一轮的选定子集。
而后在上一轮的选定子集中加入一个特征,构成了包含两个特征的候选子集。
假定 A2,A5 最优,且优于 A2 ,因而将 A2,A5 做为第二轮的选定子集。
....
假定在第 k+1
轮时,本轮的最优的特征子集不如上一轮的最优的特征子集,则中止生成候选子集,并将上一轮选定的特征子集做为特征选择的结果。
2.这种逐渐增长相关特征的策略称做前向 forward
搜索
相似地,若是从完整的特征集合开始,每次尝试去掉一个无关特征,这种逐渐减少特征的策略称做后向backward
搜索
3.也能够将前向和后向搜索结合起来,每一轮逐渐增长选定的相关特征(这些特征在后续迭代中肯定不会被去除),同时减小无关特征,这样的策略被称做是双向bidirectional
搜索。
4该策略是贪心的,由于它们仅仅考虑了使本轮选定集最优。可是除非进行穷举搜索,不然这样的问题没法避免。
1.子集评价的作法以下:
给定数据集 D,假设全部属性均为离散型。对属性子集 A,假定根据其取值将 D 分红了 V 个子集:
能够计算属性子集 A 的信息增益:
其中,表示集合大小,
表示熵。
信息增益越大,代表特征子集 A 包含的有助于分类的信息越多。因此对于每一个候选特征子集,能够基于训练集 D 来计算其信息增益做为评价准则。
2.更通常地,特征子集 A 实际上肯定了对数据集 D 的一个划分规则。
3.将特征子集搜索机制与子集评价机制结合就能获得特征选择方法。
4.常见的特征选择方法分为如下三种,主要区别在于特征选择部分是否使用后续的学习器。
5.最简单的特征选择方法是:去掉取值变化小的特征。
假如某特征只有 0 和 1 的两种取值,而且全部输入样本中,95% 的样本的该特征取值都是 1 ,那就能够认为该特征做用不大。
固然,该方法的一个前提是,特征值都是离散型才使用该方法;若是是连续型,须要离散化后再使用,而且实际上通常不会出现 95% 以上都取某个值的特征的存在。
因此,这个方法简单,但不太好用,能够做为特征选择的一个预处理,先去掉变化小的特征,而后再开始选择上述三种类型的特征选择方法。
该方法先对数据集进行特征选择,而后再训练学习器。特征选择过程与后续学习器无关。
也就是先采用特征选择对初始特征进行过滤,而后用过滤后的特征训练模型。
1.Relief:Relevant Features
是一种著名的过滤式特征选择方法。该方法设计了一个相关统计量来度量特征的重要性。
该统计量是一个向量,其中每一个份量都对应于一个初始特征。特征子集的重要性则是由该子集中每一个特征所对应的相关统计量份量之和来决定的。
最终只须要指定一个阈值 k,而后选择比 k 大的相关统计量份量所对应的特征便可。
也能够指定特征个数 m ,而后选择相关统计量份量最大的 m 个特征。
2.Relief
是为二分类问题设计的,其拓展变体 Relief-F
能够处理多分类问题。
使用方差选择法,先要计算各个特征的方差,而后根据阈值,选择方差大于阈值的特征。
使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的 P 值。
经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于 i 且因变量等于 j 的样本频数的观察值与指望的差距,构建统计量:
不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。
经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息计算公式以下:
为了处理定量数据,最大信息系数法被提出。
1.相比于过滤式特征选择不考虑后续学习器,包裹式特征选择直接把最终将要使用的学习器的性能做为特征子集的评价原则。其目的就是为给定学习器选择最有利于其性能、量身定作的特征子集。
2.LVW:Las Vegas Wrapper
是一个典型的包裹式特征选择方法。它是Las Vegas method
框架下使用随机策略来进行子集搜索,并以最终分类器的偏差做为特征子集的评价标准。
3.因为 LVW
算法中每次特征子集评价都须要训练学习器,计算开销很大,所以它会设计一个中止条件控制参数 T。
可是若是初始特征数量不少、T 设置较大、以及每一轮训练的时间较长, 则极可能算法运行很长时间都不会中止。即:若是有运行时间限制,则有可能给不出解。
5.递归特征消除法:使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
1.在过滤式和包裹式特征选择方法中,特征选择过程与学习器训练过程有明显的分别。
嵌入式特征选择是将特征选择与学习器训练过程融为一体,二者在同一个优化过程当中完成的。即学习器训练过程当中自动进行了特征选择。
经常使用的方法包括:
L_1, L_2
范数,主要应用于如线性回归、逻辑回归以及支持向量机(SVM)等算法;2.引入 L_1
范数除了下降过拟合风险以外,还有一个好处:它求得的 w 会有较多的份量为零。即:它更容易得到稀疏解。
因而基于 L_1
正则化的学习方法就是一种嵌入式特征选择方法,其特征选择过程与学习器训练过程融为一体,两者同时完成。
3.常见的嵌入式选择模型:
Lasso
中,λ 参数控制了稀疏性:
SVM
和 逻辑回归中,参数 C
控制了稀疏性:
C
越小,则稀疏性越大,被选择的特征越少;C
越大, 则稀疏性越小,被选择的特征越多。特征提取通常是在特征选择以前,它提取的对象是原始数据,目的就是自动地构建新的特征,将原始数据转换为一组具备明显物理意义(好比 Gabor、几何特征、纹理特征)或者统计意义的特征。
通常经常使用的方法包括降维(PCA、ICA、LDA等)、图像方面的SIFT、Gabor、HOG等、文本方面的词袋模型、词嵌入模型等,这里简单介绍这几种方法的一些基本概念。
1.PCA(Principal Component Analysis,主成分分析)
PCA 是降维最经典的方法,它旨在是找到数据中的主成分,并利用这些主成分来表征原始数据,从而达到降维的目的。
PCA 的思想是经过坐标轴转换,寻找数据分布的最优子空间。
好比,在三维空间中有一系列数据点,它们分布在过原点的平面上,若是采用天然坐标系的 x,y,z 三个轴表示数据,须要三个维度,但实际上这些数据点都在同一个二维平面上,若是咱们能够经过坐标轴转换使得数据所在平面和 x,y 平面重合,咱们就能够经过新的 x'、y' 轴来表示原始数据,而且没有任何损失,这就完成了降维的目的,并且这两个新的轴就是咱们须要找的主成分。
所以,PCA 的解法通常分为如下几个步骤:
W1, W2, ..., Wn
,这样将原来 m 维的样本下降到 n 维。经过 PCA ,就能够将方差较小的特征给抛弃,这里,特征向量能够理解为坐标转换中新坐标轴的方向,特征值表示在对应特征向量上的方差,特征值越大,方差越大,信息量也就越大。这也是为何选择前 n 个最大的特征值对应的特征向量,由于这些特征包含更多重要的信息。
PCA 是一种线性降维方法,这也是它的一个局限性。不过也有不少解决方法,好比采用核映射对 PCA 进行拓展获得核主成分分析(KPCA),或者是采用流形映射的降维方法,好比等距映射、局部线性嵌入、拉普拉斯特征映射等,对一些 PCA 效果很差的复杂数据集进行非线性降维操做。
2.LDA(Linear Discriminant Analysis,线性判别分析)
LDA 是一种有监督学习算法,相比较 PCA,它考虑到数据的类别信息,而 PCA 没有考虑,只是将数据映射到方差比较大的方向上而已。
由于考虑数据类别信息,因此 LDA 的目的不只仅是降维,还须要找到一个投影方向,使得投影后的样本尽量按照原始类别分开,即寻找一个能够最大化类间距离以及最小化类内距离的方向。
LDA 的优势以下:
相应的,也有以下缺点:
3.ICA(Independent Component Analysis,独立成分分析)
PCA特征转换降维,提取的是不相关的部分,ICA独立成分分析,得到的是相互独立的属性。ICA算法本质寻找一个线性变换 z = Wx
,使得 z 的各个特征份量之间的独立性最大。
一般先采用 PCA 对数据进行降维,而后再用 ICA 来从多个维度分离出有用数据。PCA 是 ICA 的数据预处理方法。
具体能够查看知乎上的这个问题和回答独立成分分析 ( ICA ) 与主成分分析 ( PCA ) 的区别在哪里?。
图像的特征提取,在深度学习火起来以前,是有不少传统的特征提取方法,比较常见的包括如下几种。
1.SIFT 特征
SIFT 是图像特征提取中很是普遍应用的特征。它包含如下几种优势:
SIFT 对图像局部特征点的提取主要包括四个步骤:
SIFT 的缺点是不借助硬件加速或者专门的图像处理器很难实现。
2.SURF 特征
SURF 特征是对 SIFT 算法的改进,下降了时间复杂度,而且提升了鲁棒性。
它主要是简化了 SIFT 的一些运算,如将 SIFT 中的高斯二阶微分的模型进行了简化,使得卷积平滑操做仅须要转换成加减运算。而且最终生成的特征向量维度从 128 维减小为 64 维。
3.HOG 特征
方向梯度直方图(HOG)特征是 2005 年针对行人检测问题提出的直方图特征,它经过计算和统计图像局部区域的梯度方向直方图来实现特征描述。
HOG 特征提取步骤以下:
4.LBP 特征
局部二值模式(LBP)是一种描述图像局部纹理的特征算子,它具备旋转不变性和灰度不变性的优势。
LBP 特征描述的是一种灰度范围内的图像处理操做技术,针对的是输入为 8 位或者 16 位的灰度图像。
LBP 特征经过对窗口中心点与邻域点的关系进行比较,从新编码造成新特征以消除对外界场景对图像的影响,所以必定程度上解决了复杂场景下(光照变换)特征描述问题。
根据窗口领域的不一样分为两种,经典 LBP 和圆形 LBP。前者的窗口是 3×3 的正方形窗口,后者将窗口从正方形拓展为任意圆形领域。
更详细的能够参考这篇文章--图像特征检测描述(一):SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现
固然上述特征都是比较传统的图像特征提取方法了,如今图像基本都直接利用 CNN(卷积神经网络)来进行特征提取以及分类。
1.词袋模型
最基础的文本表示模型是词袋模型。
具体地说,就是将整段文本以词为单位切分开,而后每篇文章能够表示成一个长向量,向量的每个维度表明一个单词,而该维度的权重反映了该单词在原来文章中的重要程度。
一般采用 TF-IDF 计算权重,公式为 TF-IDF(t, d) = TF(t,d) × IDF(t)
其中 TF(t, d) 表示单词 t 在文档 d 中出现的频率,IDF(t) 是逆文档频率,用来衡量单词 t 对表达语义所起的重要性,其表示为:
直观的解释就是,若是这个单词在多篇文章都出现过,那么它极可能是比较通用的词汇,对于区分文章的贡献比较小,天然其权重也就比较小,即 IDF(t) 会比较小。
2.N-gram 模型
词袋模型是以单词为单位进行划分,但有时候进行单词级别划分并非很好的作法,毕竟有的单词组合起来才是其要表达的含义,好比说 natural language processing(天然语言处理)
、computer vision(计算机视觉)
等。
所以能够将连续出现的 n 个词 (n <= N) 组成的词组(N-gram)做为一个单独的特征放到向量表示中,构成了 N-gram 模型。
另外,同一个词可能会有多种词性变化,但却具备相同含义,因此实际应用中还会对单词进行词干抽取(Word Stemming)处理,即将不一样词性的单词统一为同一词干的形式。
3.词嵌入模型
词嵌入是一类将词向量化的模型的统称,核心思想是将每一个词都映射成低维空间(一般 K=50~300 维)上的一个稠密向量(Dense Vector)。
经常使用的词嵌入模型是 Word2Vec。它是一种底层的神经网络模型,有两种网络结构,分别是 CBOW(Continues Bag of Words) 和 Skip-gram。
CBOW 是根据上下文出现的词语预测当前词的生成几率;Skip-gram 是根据当前词来预测上下文中各个词的生成几率。
词嵌入模型是将每一个词都映射成一个 K 维的向量,若是一篇文档有 N 个单词,那么每篇文档就能够用一个 N×K 的矩阵进行表示,但这种表示过于底层。实际应用中,若是直接将该矩阵做为原文本的特征表示输入到模型中训练,一般很可贵到满意的结果,通常还须要对该矩阵进行处理,提取和构造更高层的特征。
深度学习模型的出现正好提供了一种自动进行特征工程的方法,它的每一个隐含层都至关于不一样抽象层次的特征。卷积神经网络(CNN)和循环神经网络(RNN)在文本表示中都取得了很好的效果,这是由于它们能够很好地对文本进行建模,抽取出一些高层的语义特征。
特征提取与特征选择都是为了从原始特征中找出最有效的特征。
它们之间的区别是特征提取强调经过特征转换的方式获得一组具备明显物理或统计意义的特征;
而特征选择是从特征集合中挑选一组具备明显物理或统计意义的特征子集。
二者都能帮助减小特征的维度、数据冗余,特征提取有时能发现更有意义的特征属性,特征选择的过程常常能表示出每一个特征的重要性对于模型构建的重要性。
特征构建是指从原始数据中人工的构建新的特征。须要花时间去观察原始数据,思考问题的潜在形式和数据结构,对数据敏感性和机器学习实战经验能帮助特征构建。
特征构建须要很强的洞察力和分析能力,要求咱们可以从原始数据中找出一些具备物理意义的特征。假设原始数据是表格数据,通常你可使用混合属性或者组合属性来建立新的特征,或是分解或切分原有的特征来建立新的特征。
特征构建很是须要相关的领域知识或者丰富的实践经验才能很好构建出更好的有用的新特征,相比于特征提取,特征提取是经过一些现成的特征提取方法来将原始数据进行特征转换,而特征构建就须要咱们本身人为的手工构建特征,好比组合两个特征,或者分解一个特征为多个新的特征。
特征工程这个内容加上本文总共写了四篇文章,从数据预处理,处理缺失值、异常值,类别不平衡和数据扩充问题,到特征缩放、特征编码,以及本文的特征选择、特征提取和特征构造,基本包含了特征工程涉及的内容,固然可能还有少数内容没有包含。
其实是恰好对于《》第二章的总结,涉及到特征工程内容,打算好好作个总结,没想到这部份内容真的很多,而对于特征工程,个人经验其实不算很丰富,以前只是参加过一次比赛,算是简单涉猎了其中的部份内容,因此这几篇文章的内容主要都是整理收集网上文章的内容,加上少部分我的的经验心得,写做起来确实有些费劲,不少内容都只能简单总结下基本概念和使用步骤,但很难再深刻介绍了。
因此推荐你们看完后,能够找些实际的项目或者参加比赛,在实践中运用特征工程的理论和方法,会有更深的体会。
比赛的话,最有名的就是 Kaggle,国内的有天池、DataFountain等。
接下来会这个如何构建一个完整的机器学习项目就会进入算法模型选择和评估部分了,这里我也打算先简单总结机器学习比较经常使用的经典算法。
参考:
欢迎关注个人微信公众号--机器学习与计算机视觉,或者扫描下方的二维码,你们一块儿交流,学习和进步!