听说最近冒出的大批呱儿子个个都是撑着眼皮也要看书的无眠小青蛙。我们学习Machine Learning的脚步又怎能停下来?动动手指,上滑开始~
今天的内容是
【特征工程—结构化数据】
场景描述
特征工程是指结合问题寻找有效的特征并进行处理成适合模型的输入形式。机器学习中有句经典的话叫做“Garbage in, garbage out”,意思是如果输入的数据是垃圾,那么得到的结果也是垃圾。可以看出模型成败的关键并不仅仅取决于模型的选取,还取决于我们是否有根据特定的问题找到了行之有效的输入。常用的数据可以分为结构化数据和非结构化数据,其中:结构化数据可以看成关系型数据库的一张表,每列都有清晰的定义,包含了数值型、类别型两种基本类型;非结构化数据主要包括文本数据和图像数据,所有信息都是混在一起的,并没有清晰的类别定义,并且每条数据的大小都是不一样的。
问题描述
1. 为什么需要对数值类型的特征做归一化?
2. 怎样处理类别型特征?
3. 怎样处理高维组合特征?
4. 怎样有效地找到组合特征?
解答与分析
1. 为什么需要对数值类型的特征做归一化?
对数值类型的特征做归一化(normalization)可以将所有的特征都统一到一个大致相同的区间内。最常用的归一化是z-score normalization,它会将特征变换映射到以均值为0、标准差为1的正态分布上。准确的来说,假设原始特征的均值为μ、标准差为σ,那么z-score normalization定义为:
为什么通常需要对数值型做归一化呢?我们可以借助随机梯度下降来说明归一化的重要性。假设有两种数值型特征,x1的取值范围为[0, 10],x2的取值范围为[0, 3],可以构造一个目标函数符合以下等值图:
在学习速率相同的情况下,x1的更新速度会大于x2,需要更多的迭代才能找到最优值[1]。如果将x1和x2归一化到相同的区间后,则优化目标的等值图会变成右图的圆形,x1和x2的更新速度会比较一致,能够更快的找到最优值。
那么归一化适用于哪些模型,又对哪些模型是不适用的呢?首先,通过梯度下降法求解的模型是需要归一化的,包括包括线性回归、logistic regression、支持向量机(Support Vector Machine)、神经网络(Neuro Network)。但对于决策树模型则是不适用的,以C4.5为例,决策树在进行节点分裂时主要依据的是x >= threshold 和 x < threshold的信息增益比,而信息增益比跟x是否经过归一化是无关的,因为归一化并不会改变样本在x上的相对顺序。
2. 怎样处理类别型特征?
类别型特征(categorical feature)主要是指性别(男、女)、血型(A、B、AB、O)等类似的在有限选项内取值的特征。通常类别型特征原始输入都是字符串形式,只有决策树等少数模型能直接处理字符串形式的输入。对于Logistic Regression、线性支持向量机等模型来说,类别型特征必须经过处理转换成数值型特征才能正确工作。
本节主要介绍三种常用的转换方法:Ordinal Encoding、One-hot Encoding、Binary Encoding。
Ordinal Encoding通常用于处理类别间具有大小关系的数据,例如成绩可以分为Low、Medium、High三档,并且存在High > Medium > Low的排序关系。Ordinal Encoding会按照大小关系对类别型特征赋予一个数值ID,例如High表示为3、Medium表示为2、Low表示为1,转换后依然保留了大小关系。
One-hot Encoding通常用于处理类别间不具有大小关系的特征,以血型为例,血型一共有四个取值(A、B、AB、O),在One-hot Encoding后血型会变成一个4维稀疏向量:A型血表示为(1, 0, 0, 0),B型血表示为(0, 1, 0, 0),AB型表示为(0, 0, 1, 0),O型血表示为(0, 0, 0, 1)。对于类别取值较多的情况下使用One-hot Encoding需要注意以下问题:
-
使用稀疏向量来节省空间:在One-hot Encoding下,只有某一维取值为1,其他位置取值均为0。因此可以用向量的稀疏表示来有效节省空间,并且目前大部分的算法都会实现接受稀疏向量形式的输入。
-
配合特征选择来降低维度:高维度特征会带来两方面的问题:(1)在K近邻算法中,高纬空间下两点之间的距离很难得到有效的衡量; (2) 在Logistic Regression中,模型的参数的数量会随着维度的增高而增加,容易引起过拟合问题; (3) 通常只有部分维度是对分类、预测有帮助,因此可以考虑配合特征选择来降低维度。
最后介绍Binary Encoding,该方法主要分为两步:用Ordinal Encoding给每个类别赋予一个ID,然后将ID对应的二进制编码作为结果。以血型A、B、AB、O为例,Binary Encoding的过程如下图所示:A型血的Ordinal Encoding为1,二进制表示为(0, 0, 1);B型血的Ordinal Encoding为2,二进制表示为(0, 1, 0),以此类推可以得到AB型血和O型血的二进制表示。可以看出,Binary Encoding本质上是利用二进制编码对ID进行哈希,最终得到了0/1向量维数要少于One-hot Encoding,节省了空间。
除了本章介绍的Encoding方法外,有兴趣的读者还可以参照[2]了解其他的编码方式,包括Helmert Contrast、Sum Contrast、Polynomial Contrast、Backward Difference Contrast。
3. 怎样处理高维组合特征?
为了提高复杂关系的拟合能力,在特征工程中经常会把一阶离散特征两两组合成高阶特征,构成交互特征(Interaction Feature)。以广告点击预估问题为例,如图1所示,原始数据有语言和类型两种离散特征。为了提高拟合能力,语言和类型可以组成二阶特征,如图2所示:
△ 图1
△ 图2
以Logistic Regression为例,假设数据的特征向量X = (x_1, x_2, …, x_k),我们有
其wij的维度等于|xi| * |xj|。在上面的广告点击预测问题当中,w的维度是4(2x2,语言取值为中文或者英文、 类型的取值为电影或者电视剧)。
在上面广告预测的问题看起来特征组合是没有任何问题的,但当引入ID类型的特征时,问题就出现了。以推荐问题为例,原始数据如图3所示,用户ID和物品ID组合成新的特征后的数据如图4所示:
△ 图3
△ 图4
假设用户的数量为m、物品的数量为n,那么需要学习的参数的规模为m × n。在互联网环境下,用户数量和物品数量都可以到达千万量级,几乎无法学习m × n的参数规模。在这种情况下,一种行之有效的方法是将用户和物品分别用k维的低维向量表示(k << m, k << n),
其中wij=xi‘ · xj‘,在这里xi‘和xj‘分别表示对应的低维向量。在上面的推荐问题中,需要学习的参数的规模为m × k + n × k。熟悉推荐算法的同学可以看出来这等于矩阵分解,希望这篇文章提供了另一个理解矩阵分解的思路。
4. 怎样有效地找到组合特征?
在上节中我们介绍了如何利用降维方法来减少两个高维特征进行组合需要学习的参数。但是在很多实际数据当中,我们常常需要面对多种高维特征。如果简单的两两组合,参数过多、容易过拟合的问题依然存在,并且并不是所有的特征组合都是有意义地。因此,我们迫切需要一种有效地方法来帮助我们找到哪些特征应该进行组合。
本节介绍介绍一种基于决策树的特征组合寻找方法[3]。以点击预测问题为例,假设原始输入特征包含年龄、性别、用户类型(试用期、付费)、物品类型(护肤、食品等)四个方面的信息,并且假设我们根据原始输入和标签(点击与否)构造出了两个决策树,那么每一条从根节点到叶子节的路径都可以看成一种特征组合的方式。具体来说,我们可以将“年龄<=35”且“性别=女”看成一个特征组合,将“年龄<=35”且“物品类别=护肤”看出是一个特征组合,将“用户类型=付费”且“物品类型=食品”看成是一种特征组合,将“用户类型=付费”且“年龄<=40”看成是一种特征组合。假设我们有两个样本如下表所示,那么第一行可以编码为(1, 1, 0, 0),因为既满足“年龄<=35”且“性别=女”,也满足“年龄<=35”且“物品类别=护肤”。同理可以看出第二个样本可以编码为(0, 0, 1, 1),因为既满足“用户类型=付费”且“物品类型=食品”,又满足“用户类型=付费”且“年龄<=40”。
最后,那么给定原始输入该如何有效构造多棵决策树呢?在这里我们采用梯度提升决策树 (gradient boosting decision tree),该方法地思想是每次都在之前构建的决策树的残差(residual)上构建下一棵决策树,对GDBT感兴趣的读者可以参考原始文献[4]。
参考文献:
[1] https://www.coursera.org/learn/machine-learning
[2] http://contrib.scikit-learn.org/categorical-encoding/index.html
[3] Practical Lessons from Predicting Clicks on Ads at Facebook, ADKDD’14
[4] J. H. Friedman. Greedy function approximation: A gradient boosting machine. Annals of Statistics, 29:1189–1232, 1999.
下一题预告
【神经网络训练中的批量归一化】
场景描述
深度神经网络的训练中涉及诸多手调参数,如学习率,权重衰减系数,Dropout比例等,这些参数的选择会显著影响模型最终的训练效果。批量归一化(Batch Normalization, BN)方法从数据分布入手,有效减弱了这些复杂参数对网络训练产生的影响,在加速训练收敛的同时也提升了网络的泛化能力。
问题描述
1. BN基本动机与原理是什么?
2. BN的具体实现中怎样恢复前一层学习到的特征分布?
3. 简述BN在卷积神经网络中如何使用?(简述)