机器学习——特征工程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xiao_lxl/article/details/97391338


对于机器学习问题,数据和特征决定了结果的上限,模型和算法的选择及优化则是在逐步靠近达到这个上限值。

特征工程,是对原始数据进行一系列的工程处理,将其提炼为特征,作为输入供算法和模型使用。特征工程是一个表示和展现数据的过程。在实际工作中,特征工程主要是去除原始数据中的杂质和冗余,设计更高效的特征以描述求解的问题和预测模型之间的关系。

1. 为什么需要对数值类型的特征做归一化?

为了消除数据特征之间的量纲影响,我们需要对特征进行归一化,使不同指标之间具有可比性。

对数值类型的特征做归一化(normalization)可以将所有的特征都统一到一个大致相同的区间内。

最常用的归一化方法有两种:

1) 线型数据归一化(Min-Max Scaling)。通过对原始数据进行线性变换,使结果映射到[0,1]之间。实现对原始数据的等比例缩放。

归一化公式为:

X_norm = (X - X_min) / (X_max - X_min)

其中,X为原始数据,X_max, X_min分别为数据集的最大值和最小值

2)另一种最常用的归一化是零均值归一化(z-score normalization),它会将特征变换映射到以均值为0、标准差为1的正态分布上。准确的来说,假设原始特征的均值为μ、标准差为σ,那么z-score normalization定义为:
在这里插入图片描述
为什么通常需要对数值型做归一化呢?我们可以借助随机梯度下降来说明归一化的重要性。假设有两种数值型特征,x1的取值范围为[0, 10],x2的取值范围为[0, 3],可以构造一个目标函数符合以下等值图:
在这里插入图片描述
在学习速率相同的情况下,x1的更新速度会大于x2,需要更多的迭代才能找到最优值[1]。如果将x1和x2归一化到相同的区间后,则优化目标的等值图会变成右图的圆形,x1和x2的更新速度会比较一致,能够更快的找到最优值。

扫描二维码关注公众号,回复: 7204371 查看本文章

那么归一化适用于哪些模型,又对哪些模型是不适用的呢?首先,通过梯度下降法求解的模型是需要归一化的,包括包括线性回归、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所示:

在这里插入图片描述
以Logistic Regression为例,假设数据的特征向量X = (x_1, x_2, …, x_k),我们有
在这里插入图片描述
其wij的维度等于|xi| * |xj|。在上面的广告点击预测问题当中,w的维度是4(2x2,语言取值为中文或者英文、 类型的取值为电影或者电视剧)。
在上面广告预测的问题看起来特征组合是没有任何问题的,但当引入ID类型的特征时,问题就出现了。以推荐问题为例,原始数据如图3所示,用户ID和物品ID组合成新的特征后的数据如图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)上构建下一棵决策树。

猜你喜欢

转载自blog.csdn.net/xiao_lxl/article/details/97391338