原文:第1章 特征工程
俗话说,“巧妇难为无米之炊”。在机器学习中,数据和特征便是“米”,模型和算法则是“巧妇”。没有充足的数据、合适的特征,再强大的模型结构也无法得到满意的输出。正如一句业界经典的话所说,“Garbage in, garbage out”。对于一个机器学习问题,数据和特征往往决定了结果的上限,而模型、算法的选择及优化则是在逐步接近这个上限。
特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。从本质上来讲,特征工程是一个表示和展现数据的过程。在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系。
本章主要讨论以下两种常用的数据类型。
- 结构化数据。结构化数据类型可以看作关系型数据库的一张表,每列都有清晰的定义,包含了数值型、类别型两种基本类型;每一行数据表示一个样本的信息。
- 非结构化数据。非结构化数据主要包括文本、图像、音频、视频数据,其包含的信息无法用一个简单的数值表示,也没有清晰的类别定义,并且每条数据的大小各不相同。
01 特征归一化
为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使得不同指标之间具有可比性。例如,分析一个人的身高和体重对健康的影响,如果使用米(m)和千克(kg)作为单位,那么身高特征会在1.61.8m的数值范围内,体重特征会在50100kg的范围内,分析出来的结果显然会倾向于数值差别比较大的体重特征。想要得到更为准确的结果,就需要进行特征归一化 (Normalization) 处理,使各指标处于同一数值量级,以便进行分析。
知识点
- 特征归一化
问题 为什么需要对数值类型的特征做归一化?
难度: ★☆☆☆☆
分析与解答
对数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间内。最常用的方法主要有以下两种。
-
线性函数归一化(Min-Max Scaling)。它对原始数据进行线性变换,使结果映射到 [0,1][0,1] 的范围,实现对原始数据的等比缩放。归一化公式如下
Xnorm =X−Xmin Xmax −Xmin Xnorm =Xmax −Xmin X−Xmin
其中 XX 为原始数据,Xmax、XminXmax、Xmin 分别为数据最大值和最小值。
-
零均值归一化(Z-Score Normalization)。它会将原始数据映射到均值为 0、标准差为 1 的分布上。具体来说,假设原始特征的均值为 μμ 、标准差为 σσ ,那么归一化公式定义为
z=x−μσ.z=σx−μ.
为什么需要对数值型特征做归一化呢? 我们不妨借助随机梯度下降的实例来说明归一化的重要性。假设有两种数值型特征,X1X1 的取值范围为 [0,10],X2[0,10],X2 的取值范围为 [0,3][0,3] ,于是可以构造一个目标函数符合图1.1 (a) 中的等值图。
在学习速率相同的情况下,x1x1 的更新速度会大于 x2x2 ,需要较多的迭代才能找到最优解。如果将 x1x1 和 x2x2 归一化到相同的数值区间后,优化目标的等值图会变成图 1.1 (b) 中的圆形,x1x1 和 x2x2 的更新速度变得更为一致,容易更快地通过梯度下降找到最优解。
图1.1 数据归一化对梯度下降收敛速度产生的影响
当然,数据归一化并不是万能的。在实际应用中,通过梯度下降法求解的模型通常是需要归一化的,包括线性回归、逻辑回归、支持向量机、神经网络等模型。但对于决策树模型则并不适用,以C4.5为例,决策树在进行节点分裂时主要依据数据集 DD 关于特征 xx 的信息增益比(详见第 3 章第 3 节),而信息增益比跟特征是否经过归一化是无关的,因为归一化并不会改变样本在特征 xx 上的信息增益。
02 类别型特征
2场景描述
类别型特征(Categorical Feature)主要是指性别(男、女)、血型(A、B、 AB、O)等只在有限选项内取值的特征。类别型特征原始输入通常是字符串形式,除了决策树等少数模型能直接处理字符串形式的输入,对于逻辑回归、支持向量机等模型来说,类别型特征必须经过处理转换成数值型特征才能正确工作。
知识点
- 序号编码(Ordinal Encoding)
- 独热编码(One-hot Encoding)
- 二进制编码 (Binary Encoding)
问题 在对数据进行预处理时,应该怎样处理类别型特征?
难度: ★★☆☆☆
分析与解答
序号编码
序号编码通常用于处理类别间具有大小关系的数据。例如成绩,可以分为低、中、高三档,并且存在“高>中>低”的排序关系。序号编码会按照大小关系对类别型特征赋予一个数值ID,例如高表示为3、中表示为2、低表示为1,转换后依然保留了大小关系。
独热编码
独热编码通常用于处理类别间不具有大小关系的特征。例如血型,一共有4个取值(A型血、B型血、AB型血、O型血),独热编码会把血型变成一个4维稀疏向量,A型血表示为(1,0,0,0),B型血表示为(0,1,0,0),AB型表示为 (0,0(0,0 ,1,0),O1,0),O 型血表示为(0,0,0,1)。对于类别取值较多的情况下使用独热编码需要注意以下问题。
- 使用稀疏向量来节省空间。在独热编码下,特征向量只有某一维取值为 1 ,其他位置取值均为 0 。因此可以利用向量的稀疏表示有效地节省空间,并且目前大部分的算法均接受稀疏向量形式的输入。
- 配合特征选择来降低维度。高维度特征会带来几方面的问题。一是在K 近邻算法中,高维空间下两点之间的距离很难得到有效的衡量;二是在逻辑回归模型中,参数的数量会随着维度的增高而增加,容易引起过拟合问题;三是通常只有部分维度是对分类、预测有帮助,因此可以考虑配合特征选择来降低维度。
二进制编码
二进制编码主要分为两步,先用序号编码给每个类别赋予一个类别ID,然后将类别ID对应的二进制编码作为结果。以A、B、AB、O血型为例,表1.1是二进制编码的过程。A型血的ID为1,二进制表示为001;B型血的ID为2,二进制表示为 010;以此类推可以得到AB型血和O型血的二进制表示。可以看出,二进制编码本质上是利用二进制对ID进行哈希映射,最终得到0/1 特征向量,且维数少于独热编码,节省了存储空间。
表 1.1 二进制编码和独热编码
血型 | 类别ID | 二进制表示 | 独热编码 |
---|---|---|---|
A | 1 | 0 0 1 | 1 0 0 0 |
B | 2 | 0 1 0 | 0 1 0 0 |
AB | 3 | 0 1 1 | 0 0 1 0 |
O | 4 | 1 0 0 | 0 0 0 1 |
除了本章介绍的编码方法外,有兴趣的读者还可以进一步了解其他的编码方式,比如Helmert Contrast、Sum Contrast、Polynomial Contrast、Backward Difference Contrast等。
03 高维组合特征的处理
知识点
- 组合特征
问题 什么是组合特征? 如何处理高维组合特征?
难度: ★★☆☆☆
分析与解答
为了提高复杂关系的拟合能力,在特征工程中经常会把一阶离散特征两两组合,构成高阶组合特征。以广告点击预估问题为例,原始数据有语言和类型两种离散特征,表 1.2 是语言和类型对点击的影响。为了提高拟合能力,语言和类型可以组成二阶特征,表 1.3 是语言和类型的组合特征对点击的影响。
表 1.2 语言和类型对点击的影响
是否点击 | 语言 | 类型 |
---|---|---|
0 | 中文 | 电影 |
1 | 英文 | 电影 |
1 | 中文 | 电视剧 |
英文 | 电视剧 |
表 1.3 语言和类型的组合特征对点击的影响
是否点击 | 语言=中文类型=电影 | 语言=英文类型=电影 | 语言=中文类型=电视剧 | 语言=英文类型=电视剧 |
---|---|---|---|---|
0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
以逻辑回归为例,假设数据的特征向量为 X=(x1,x2,…,xk)X=(x1,x2,…,xk) ,则有,
Y=sigmoid(∑i∑jwij<xi,xj>)Y=sigmoid(i∑j∑wij<xi,xj>)
其中 <xi,xj><xi,xj> 表示 xixi 和 xjxj 的组合特征,wijwij 的维度等于 ∣xi∣⋅∣xj∣,∣xi∣∣xi∣⋅∣xj∣,∣xi∣ 和 ∣xj∣∣xj∣ 分别代表第 ii 个特征和第j个特征不同取值的个数。在表1.3的广告点击预测问题中,ww 的维度是 2×2=42×2=4 (语言取值为中文或英文两种、类型的取值为电影或电视剧两种)。这种特征组合看起来是没有任何问题的,但当引入ID类型的特征时,问题就出现了。以推荐问题为例,表1.4是用户ID和物品ID对点击的影响,表1.5是用户ID和物品ID的组合特征对点击的影响。
表 1.4 用户ID和物品ID对点击的影响
是否点击 | 用户ID | 物品ID |
---|---|---|
0 | 1 | 1 |
1 | 2 | 1 |
... | ... | |
1 | mm | 1 |
1 | 1 | 2 |
0 | 2 | 2 |
... | ... | |
1 | mm | nn |
表 1.5 用户ID和物品ID的组合特征对点击的影响
是否点击 | 用户ID=1 物品 ID=1 | 用户ID=2 物品 ID=1 | ... | 用户ID=m 物品 ID=1 | 用户ID=1 物品 ID=2 | 用户ID=2 物品 ID=2 | ... | 用户ID=m 物品 ID=n |
---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | ... | 0 | 0 | 0 | ... | 0 |
若用户的数量为 mm 、物品的数量为 nn ,那么需要学习的参数的规模为 m×nm×n 。在互联网环境下,用户数量和物品数量都可以达到千万量级,几乎无法学习 m×nm×n 规模的参数。在这种情况下,一种行之有效的方法是将用户和物品分别用k维的低维向量表示 (k<<m,k<<n)(k<<m,k<<n) ,
Y=sigmoid(∑i∑jwij<xi,xj>)Y=sigmoid(i∑j∑wij<xi,xj>)
其中 wij=x′i⋅x′j,x′iwij=x′i⋅x′j,x′i 和 x′jx′j 分别表示 xixi 和 xixi 对应的低维向量。在表1.5的推荐问题中,需要学习的参数的规模变为 m×k+n×km×k+n×k 。熟悉推荐算法的同学很快可以看出来,这其实等价于矩阵分解。所以,这里也提供了另一个理解推荐系统中矩阵分解的思路。
04 组合特征
4场景描述
上一节介绍了如何利用降维方法来减少两个高维特征组合后需要学习的参数。但是在很多实际问题中,我们常常需要面对多种高维特征。如果简单地两两组合,依然容易存在参数过多、过拟合等问题,而且并不是所有的特征组合都是有意义的。因此,需要一种有效的方法来帮助我们找到应该对哪些特征进行组合。
知识点
- 组合特征
问题 怎样有效地找到组合特征?
难度: ★★☆☆☆
分析与解答
本节介绍一种基于决策树的特征组合寻找方法 [1][1] (关于决策树的详细内容可见第3章第3节)。以点击预测问题为例,假设原始输入特征包含年龄、性别、用户类型(试用期、付费)、物品类型(护肤、食品等)4个方面的信息,并且根据原始输入和标签(点击/未点击)构造出了决策树,如图1.2所示。
于是,每一条从根节点到叶节点的路径都可以看成一种特征组合的方式。具体来说,就有以下4种特征组合的方式。
- “年龄<=35”且“性别=女”。
- “年龄<=35”且“物品类别=护肤”。
- “用户类型=付费”且“物品类型=食品”。
- "用户类型=付费"且“年龄<=40”。
图1.2 基于决策树的特征组合方法
表1.6 两个样本信息
是否点击 | 年龄 | 性别 | 用户类型 | 物品类型 |
---|---|---|---|---|
是 | 28 | 女 | 免费 | 护肤 |
否 | 36 | 男 | 付费 | 食品 |
给定原始输入该如何有效地构造决策树呢? 可以采用梯度提升决策树,该方法的思想是每次都在之前构建的决策树的残差上构建下一棵决策树。对梯度提升决策树感兴趣的读者可以参考第12章的具体内容,也可以阅读参考文献[2]。
05 文本表示模型
5场景描述
文本是一类非常重要的非结构化数据,如何表示文本数据一直是机器学习领域的一个重要研究方向。
知识点
- 词袋模型 (Bag of Words)
- TF-IDF (Term Frequency-Inverse Document Frequency)
- 主题模型(Topic Model)
- 词嵌入模型(Word Embedding)
问题 有哪些文本表示模型? 它们各有什么优缺点?
难度: ★★☆☆☆
分析与解答
词袋模型和N-gram模型
最基础的文本表示模型是词袋模型。顾名思义,就是将每篇文章看成一袋子词,并忽略每个词出现的顺序。具体地说,就是将整段文本以词为单位切分开,然后每篇文章可以表示成一个长向量,向量中的每一维代表一个单词,而该维对应的权重则反映了这个词在原文章中的重要程度。常用TF-IDF来计算权重,公式为
TF-IDF(t,d)=TF(t,d)×IDF(t),TF-IDF(t,d)=TF(t,d)×IDF(t),
其中 TF(t,d)TF(t,d) 为单词 tt 在文档 dd 中出现的频率,IDF(t)IDF(t) 是逆文档频率,用来衡量单词 tt 对表达语义所起的重要性,表示为
IDF(t)=log 文章总数 包含单词 t 的文章总数 +1.IDF(t)=log 包含单词 t 的文章总数 +1 文章总数 .
直观的解释是,如果一个单词在非常多的文章里面都出现,那么它可能是一个比较通用的词汇,对于区分某篇文章特殊语义的贡献较小,因此对权重做一定惩罚。
将文章进行单词级别的划分有时候并不是一种好的做法,比如英文中的natural language processing(自然语言处理)一词,如果将natural, language, processing这 3个词拆分开来,所表达的含义与三个词连续出现时大相径庭。通常,可以将连续出现的 nn 个词 (n≤N)(n≤N) 组成的词组 ( NN -gram) 也作为一个单独的特征放到向量表示中去,构成N-gram模型。另外,同一个词可能有多种词性变化,却具有相似的含义。在实际应用中,一般会对单词进行词干抽取 (Word Stemming) 处理,即将不同词性的单词统一成为同一词干的形式。
主题模型
主题模型用于从文本库中发现有代表性的主题 (得到每个主题上面词的分布特性),并且能够计算出每篇文章的主题分布,具体细节参见第6章第5节。
词嵌入与深度学习模型
词嵌入是一类将词向量化的模型的统称,核心思想是将每个词都映射成低维空间(通常K=50~300维)上的一个稠密向量(Dense Vector)。K维空间的每一维也可以看作一个隐含的主题,只不过不像主题模型中的主题那样直观。
由于词嵌入将每个词映射成一个 KK 维的向量,如果一篇文档有 NN 个词,就可以用一个 N×KN×K 维的矩阵来表示这篇文档,但是这样的表示过于底层。在实际应用中,如果仅仅把这个矩阵作为原文本的表示特征输入到机器学习模型中,通常很难得到令人满意的结果。因此,还需要在此基础之上加工出更高层的特征。在传统的浅层机器学习模型中,一个好的特征工程往往可以带来算法效果的显著提升。而深度学习模型正好为我们提供了一种自动地进行特征工程的方式,模型中的每个隐层都可以认为对应着不同抽象层次的特征。从这个角度来讲,深度学习模型能够打败浅层模型也就顺理成章了。卷积神经网络和循环神经网络的结构在文本表示中取得了很好的效果,主要是由于它们能够更好地对文本进行建模,抽取出一些高层的语义特征。与全连接的网络结构相比,卷积神经网络和循环神经网络一方面很好地抓住了文本的特性,另一方面又减少了网络中待学习的参数,提高了训练速度,并且降低了过拟合的风险。
06 WordsVec
6场景描述
谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构,分别是CBOW (Continues Bag of Words)和Skip-gram。
知识点
- Word2Vec
- 隐狄利克雷模型(LDA)
- CBOW
- Skip-gram
问题 Word2Vec是如何工作的? 它和LDA有什么区别与联系?
难度: ★★★☆☆
分析与解答
CBOW的目标是根据上下文出现的词语来预测当前词的生成概率,如图 1.3(a)所示;而Skip-gram是根据当前词来预测上下文中各词的生成概率,如图 1.3 (b) 所示。
图1.3 Word2Vec的两种网络结构
其中 w(t)w(t) 是当前所关注的词,w(t−2)、w(t−1)、w(t+1)、w(t+2)w(t−2)、w(t−1)、w(t+1)、w(t+2) 是上下文中出现的词。这里前后滑动窗口大小均设为2。
CBOW和Skip-gram都可以表示成由输入层(Input)、映射层(Projection)和输出层 (Output) 组成的神经网络。
输入层中的每个词由独热编码方式表示,即所有词均表示成一个 NN 维向量,其中 NN 为词汇表中单词的总数。在向量中,每个词都将与之对应的维度置为 1,其余维度的值均设为 0 。
在映射层(又称隐含层)中,KK 个隐含单元(Hidden Units)的取值可以由 NN 维输入向量以及连接输入和隐含单元之间的 N×KN×K 维权重矩阵计算得到。在CBOW 中,还需要将各个输入词所计算出的隐含单元求和。
同理,输出层向量的值可以通过隐含层向量( KK 维),以及连接隐含层和输出层之间的 K×NK×N 维权重矩阵计算得到。输出层也是一个 NN 维向量,每维与词汇表中的一个单词相对应。最后,对输出层向量应用Softmax激活函数,可以计算出每个单词的生成概率。Softmax激活函数的定义为
P(y=wn∣x)=exn∑k=1NexkP(y=wn∣x)=k=1∑Nexkexn
其中 xx 代表 NN 维的原始输出向量,xnxn 为在原始输出向量中,与单词 wnwn 所对应维度的取值。
接下来的任务就是训练神经网络的权重,使得语料库中所有单词的整体生成概率最大化。从输入层到隐含层需要一个维度为 N×KN×K 的权重矩阵,从隐含层到输出层又需要一个维度为 K×NK×N 的权重矩阵,学习权重可以用反向传播算法实现,每次迭代时将权重沿梯度更优的方向进行一小步更新。但是由于Softmax激活函数中存在归一化项的缘故,推导出来的迭代公式需要对词汇表中的所有单词进行遍历,使得每次迭代过程非常缓慢,由此产生了Hierarchical Softmax和Negative Sampling两种改进方法,有兴趣的读者可以参考Word2Vec的原论文 [3][3] 。训练得到维度为 N×KN×K 和 K×NK×N 的两个权重矩阵之后,可以选择其中一个作为 NN 个词的 KK 维向量表示。
谈到Word2Vec与LDA的区别和联系,首先,LDA是利用文档中单词的共现关系来对单词按主题聚类,也可以理解为对“文档-单词”矩阵进行分解,得到“文档- 主题”和“主题-单词”两个概率分布。而Word2Vec其实是对“上下文-单词”矩阵进行学习,其中上下文由周围的几个单词组成,由此得到的词向量表示更多地融入了上下文共现的特征。也就是说,如果两个单词所对应的Word2Vec向量相似度较高,那么它们很可能经常在同样的上下文中出现。需要说明的是,上述分析的是 LDA与Word2Vec的不同,不应该作为主题模型和词嵌入两类方法的主要差异。主题模型通过一定的结构调整可以基于“上下文-单词”矩阵进行主题推理。同样地,词嵌入方法也可以根据“文档-单词”矩阵学习出词的隐含向量表示。主题模型和词嵌入两类方法最大的不同其实在于模型本身,主题模型是一种基于概率图模型的义在网络的输出之上,需要通过学习网络的权重以得到单词的稠密向量表示。
07 图像数据不足时的处理方法
7场景描述
在机器学习中,绝大部分模型都需要大量的数据进行训练和学习(包括有监督学习和无监督学习),然而在实际应用中经常会遇到训练数据不足的问题。比如图像分类,作为计算机视觉最基本的任务之一,其目标是将每幅图像划分到指定类别集合中的一个或多个类别中。当训练一个图像分类模型时,如果训练样本比较少,该如何处理呢?
知识点
- 迁移学习 (Transfer Learning)
- 生成对抗网络
- 图像处理
- 上采样技术
- 数据扩充
问题 在图像分类任务中,训练数据不足会带来什么问题? 如何缓解数据量不足带来的问题?
难度: ★★☆☆☆
分析与解答
一个模型所能提供的信息一般来源于两个方面,一是训练数据中蕴含的信息;二是在模型的形成过程中(包括构造、学习、推理等),人们提供的先验信息。当训练数据不足时,说明模型从原始数据中获取的信息比较少,这种情况下要想保证模型的效果,就需要更多先验信息。先验信息可以作用在模型上,例如让模型采用特定的内在结构、条件假设或添加其他一些约束条件; 先验信息也可以直接施加在数据集上,即根据特定的先验假设去调整、变换或扩展训练数据,让其展现出更多的、更有用的信息,以利于后续模型的训练和学习。
具体到图像分类任务上,训练数据不足带来的问题主要表现在过拟合方面,即模型在训练样本上的效果可能不错,但在测试集上的泛化效果不佳。根据上述讨论,对应的处理方法大致也可以分两类,一是基于模型的方法,主要是采用降低过拟合风险的措施,包括简化模型 (如将非线性模型简化为线性模型)、添加约束项以缩小假设空间(如L1/L2正则项)、集成学习、Dropout超参数等;二是基于数据的方法,主要通过数据扩充 (Data Augmentation),即根据一些先验知识,在保持特定信息的前提下,对原始数据进行适当变换以达到扩充数据集的效果。具体到图像分类任务中,在保持图像类别不变的前提下,可以对训练集中的每幅图像进行以下变换。
- 一定程度内的随机旋转、平移、缩放、裁剪、填充、左右翻转等,这些变换对应着同一个目标在不同角度的观察结果。
- 对图像中的像素添加噪声扰动,比如椒盐噪声、高斯白噪声等。
- 颜色变换。例如,在图像的RGB颜色空间上进行主成分分析,得到3个主成分的特征向量 p1,p2,p3p1,p2,p3 及其对应的特征值 λ1,λ2,λ3λ1,λ2,λ3 ,然后在每个像素的RGB值上添加增量 [p1,p2,p3]∙∙[α1λ1,α2λ2,α3λ3]T[p1,p2,p3]∙∙[α1λ1,α2λ2,α3λ3]T ,其中 α1,α2,α3α1,α2,α3 是均值为 0 、方差较小的高斯分布随机数。
- 改变图像的亮度、清晰度、对比度、锐度等。
图1.4 图像数据扩充样例
除了直接在图像空间进行变换,还可以先对图像进行特征提取,然后在图像的特征空间内进行变换,利用一些通用的数据扩充或上采样技术,例如 SMOTE(Synthetic Minority Over-sampling Technique)算法。抛开上述这些启发式的变换方法,使用生成模型也可以合成一些新样本,例如当今非常流行的生成式对抗网络模型。
此外,借助已有的其他模型或数据来进行迁移学习在深度学习中也十分常见。例如,对于大部分图像分类任务,并不需要从头开始训练模型,而是借用一个在大规模数据集上预训练好的通用模型,并在针对目标任务的小数据集上进行微调 (fine-tune),这种微调操作就可以看成是一种简单的迁移学习。