2019年第 19 篇文章,总第 43 篇文章 本文大约 9600 字,建议收藏慢慢阅读
机器学习入门系列(2)--如何构建一个完整的机器学习项目
第六篇
该系列的前五篇文章:
这也是特征工程系列最后一篇文章,介绍特征提取、特征选择、特征构建三个工作,通常特征工程被认为分为这三方面的内容,只是我将前面的数据&特征预处理部分都加入到这个系列。
实际上,特征工程其实是非常需要通过实践才能更好掌握这个技能的,单纯看理论,理解不够深入,实际应用到项目或者比赛中的时候,才会有更深入的理解。
由于微信公众号不支持外链,可以点击文末"阅读原文"来访问外部链接。
定义:从给定的特征集合中选出相关特征子集的过程称为特征选择(feature selection)。
1.对于一个学习任务,给定了属性集,其中某些属性可能对于学习来说很关键,但有些属性意义就不大。
2.特征选择可能会降低模型的预测能力,因为被剔除的特征中可能包含了有效的信息,抛弃这部分信息一定程度上会降低模型的性能。但这也是计算复杂度和模型性能之间的取舍:
3.常见的特征选择分为三类方法:
1.采用特征选择的原因:
2.特征选择最重要的是确保不丢失重要的特征,否则就会因为缺少重要的信息而无法得到一个性能很好的模型。
3.在没有任何先验知识,即领域知识的前提下,要想从初始特征集合中选择一个包含所有重要信息的特征子集,唯一做法就是遍历所有可能的特征组合。
但这种做法并不实际,也不可行,因为会遭遇组合爆炸,特征数量稍多就无法进行。
一个可选的方案是:
这里有两个问题:如何根据评价结果获取下一个候选特征子集?如何评价候选特征子集的好坏?
1.子集搜索方法步骤如下:
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
是一种著名的过滤式特征选择方法。该方法设计了一个相关统计量来度量特征的重要性。
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 ) 的区别在哪里?
https://www.zhihu.com/question/28845451
图像的特征提取,在深度学习火起来之前,是有很多传统的特征提取方法,比较常见的包括以下几种。
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代码实现
https://blog.csdn.net/wenhao_ir/article/details/52046569
当然上述特征都是比较传统的图像特征提取方法了,现在图像基本都直接利用 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)在文本表示中都取得了很好的效果,这是因为它们可以很好地对文本进行建模,抽取出一些高层的语义特征。
特征提取与特征选择都是为了从原始特征中找出最有效的特征。
它们之间的区别是特征提取强调通过特征转换的方式得到一组具有明显物理或统计意义的特征;
而特征选择是从特征集合中挑选一组具有明显物理或统计意义的特征子集。
两者都能帮助减少特征的维度、数据冗余,特征提取有时能发现更有意义的特征属性,特征选择的过程经常能表示出每个特征的重要性对于模型构建的重要性。
特征构建是指从原始数据中人工的构建新的特征。需要花时间去观察原始数据,思考问题的潜在形式和数据结构,对数据敏感性和机器学习实战经验能帮助特征构建。
特征构建需要很强的洞察力和分析能力,要求我们能够从原始数据中找出一些具有物理意义的特征。假设原始数据是表格数据,一般你可以使用混合属性或者组合属性来创建新的特征,或是分解或切分原有的特征来创建新的特征。
特征构建非常需要相关的领域知识或者丰富的实践经验才能很好构建出更好的有用的新特征,相比于特征提取,特征提取是通过一些现成的特征提取方法来将原始数据进行特征转换,而特征构建就需要我们自己人为的手工构建特征,比如组合两个特征,或者分解一个特征为多个新的特征。
特征工程这个内容加上本文总共写了四篇文章,从数据预处理,处理缺失值、异常值,类别不平衡和数据扩充问题,到特征缩放、特征编码,以及本文的特征选择、特征提取和特征构造,基本包含了特征工程涉及的内容,当然可能还有少数内容没有包含。
实际上是在对于《hands-on-ml-with-sklearn-and-tf》第二章数据准备部分的总结,刚好涉及到特征工程内容,所以打算好好做个总结,没想到这部分内容真的不少,而对于特征工程,我的经验其实不算很丰富,之前只是参加过一次比赛,算是简单涉猎了其中的部分内容,所以这几篇文章的内容主要都是整理收集网上文章的内容,加上少部分个人的经验心得,写作起来确实有些费劲,很多内容都只能简单总结下基本概念和使用步骤,但很难再深入介绍了。
所以推荐大家看完后,可以找些实际的项目或者参加比赛,在实践中运用特征工程的理论和方法,会有更深的体会。
比赛的话,最有名的就是 Kaggle,国内的有天池、DataFountain等。
接下来会这个如何构建一个完整的机器学习项目就会进入算法模型选择和评估部分了,这里我也打算先简单总结机器学习比较常用的经典算法。
以及,如果觉得这个系列对你有帮助的,可以帮忙点个好看,或者转发分享支持下,谢谢!
参考: