《百面机器学习--算法工程师带你去面试》-- 第 1 章

《百面机器学习–算法工程师带你去面试》

第 1 章 特征工程

        对于一个机器学习问题,数据和特征往往决定了结果的上限,而模型、算法的选择及优化则是在逐步接近这个上限。“巧妇难为无米之炊”,在机器学习中,数据和特征是“米”,模型和算法则是“巧妇”。没有充足的数据、合适的特征,再强大的模型结构也无法得到满意的输出。正如一句业界经典的话所说,“Garbage in, Garbage out”。

特征工程: 顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。从本质上来讲,特征工程是一个表示和展现数据的过程。在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系。

结构化数据:结构化数据类型可以看作关系型数据库中的一张表,每列都有清晰的定义,包含了数值型、类别型两种基本类型;每一行数据表示一个样本的信息。

非结构化数据:非结构化数据主要包括文本、图像、音频、视频数据,其包含的信息无法用一个简单的数值表示,也没有清晰的类别定义,并且每条数据的大小也各不相同。

1. 特征归一化

场景描述:

为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使得不同指标之间具有可比性。
        例如:分析一个人的身高和体重对健康的影响,如果使用米(m)和千克(kg)作为单位,那么身高特征会在1.6–1.8m的数值范围内,体重特征会在50–100kg的范围内,分析出来的结果显然会倾向于数值差别比较大的体重特征。想要得到更为准确的结果,就需要进行特征归一化(Normalization)处理,使得各指标处于同一数值量级,以便进行分析。

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

分析与解答:

对于数值型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间内。最常用的方法主要有以下两种:

(1)线性函数归一化(Min-Max Scaling): 它对原始数据进行线性变换,使结果映射到[0, 1]的范围,实现对原始数据的等比缩放。

归一化公式如下:

Xnorm=XXminXmaxXmin                      (1.1)

其中 X 为原始数据, X、X分别为数据最大值和最小值。

(2)零均值归一化(Z-Score Normalization): 它会将原始数据映射到均值0、标准差为 1 的分布上。具体来说,假设原始特征的均值为μ、标准差为σ.
归一化公式定义为:

z=xμσ                       (1.2)

为什么需要对数值型特征做归一化呢?

        我们不妨借助随机梯度下降的实例来说明归一化的重要性。假设有两种数值型特征,x1 的取值范围为[0, 10], x2 的取值范围为 [0, 3],于是可以构造一个目标函数符合图1.1(a)中的等值图。
        在学习率相同的情况下, x1 的更新速度会大于 x2 ,需要较多的迭代才能找到最优解。如果将 x1x2 归一化到相同的数值区间后,优化目标的等值图会变成图1.1(b)中的圆形, x1x2 的更新速度变得更为一致,容易更快地通过梯度下降找到最优解。

《百面机器学习--算法工程师带你去面试》-- 第 1 章
                        (a)未归一化数据的梯度下降过程                                           (b)归一化数据的梯度下降过程

图1.1 数据归一化对梯度下降收敛速度产生的影响

        当然,数据归一化并不是万能的。在实际应用中,通过梯度下降法求解的模型通常需要归一化处理,包括线性回归、逻辑回归、支持向量机、神经网络等模型。但是对于决策树模型则并不适用,以C4.5为例,决策树在进行节点分裂时主要依据数据集D关于特征 x 的信息增益比,而信息增益比跟特征是否经过归一化是无关的,因为归一化并不会改变样本在特征 x 上的信息增益。

2. 类别型特征

场景描述:

类别型特征(Categorical Feature) 主要是指性别(男、女)、血型(A、B、AB、O)等只在有限选项内取值的特征。类别型特征原始输入通常是字符串形式,除了决策树等少数模型能直接处理字符串形式的输入,对于逻辑回归、支持向量机等模型来说,类别型特征必须经过处理转换成数值型特征才能正确工作。

知识点:

序号编码(Ordinal Encoding)、独热编码(One-hot Encoding)、二进制编码(Binary Encoding)

Question 1: 在对数据进行预处理时,应该怎样处理类别型特征?

分析与解答:

序号编码(Ordinal Encoding):

        序号编码通常用于处理类别间具有大小关系的数据。例如成绩,可以分为低、中、高三档,并且存在“高 > 中 > 低”的排序关系。序号编码会按照大小关系对类别型特征赋予一个数值ID,例如高表示为3、中表示为2、低表示为1,转换后依然保留了大小关系。

One-hot编码(One-hot Encoding):

        One-hot编码通常用于处理类别间不具有大小关系的特征。例如血型,一共有4个取值(A型、B型、AB型、O型),One-hot编码会把血型编程一个4维稀疏向量,A型血表示为(1,0,0,0),B型血表示为(0,1,0,0),AB型血表示为(0,0,1,0),O型血表示为(0,0,0,1)。

对于类别取值较多的情况下使用One-hot编码需要注意以下问题:

(1)使用稀疏向量来节省空间。在One-hot编码下,特征向量只有某一维取值为1,其他位置取值均为0.因此可以利用向量的稀疏表示有效地节省空间,并且目前大部分的算法均接受稀疏向量形式的输入。

(2)配合特征选择来降低维度。高维度特征会带来几方面的问题。一是在K近邻算法中,高维空间下两点之间的距离很难得到有效的衡量;二是在逻辑回归模型中,参数的数量会随着维度的增高而增加,容易引起过拟合的问题;三是通常只有部分维度是对分类、预测有帮助的,因此可以考虑配合特征选择来降低维度。

二进制编码(Binary Encoding):

        二进制编码主要分为两步,先用序号编码给每个类别赋予一个类别ID,然后将类别ID对应的二进制编码作为结果。以A、B、AB、O血型为例,表1.1是二进制编码的过程。A型血的ID为1,二进制表示为001;B型血的ID为2,二进制表示为010;以此类推可以得到AB型血和O型血的二进制表示。可以看出,二进制编码本质上是利用二进制对ID进行哈希映射,最终得到0/1特征向量,且维数少于One-hot编码,节省了存储空间。

表1.1 二进制编码和 One-hot 编码

血型 类别ID 二进制表示 One-hot编码
A 1 0 0 1 1 0 0 0
B 2 0 1 0 0 1 0 0
AB 3 1 0 0 0 0 1 0
O 4 1 0 0 0 0 0 1

        除了本章介绍的编码方法外,有兴趣的还可以进一步了解其他的编码方式,比如Helmert Contrast、Sum Contrast、Polynomial Contrast、Backward Difference Contrast等。