3.2 数据的特征缩放和特征编码
数据特征建立在高质量的数据基础之上,是抽象出数据关键内容的形态。数据特征是机器学习算法最关注的部分,也是算法能够达成基本业务要求的必要条件。
3.2.1 特征缩放
特征缩放(Feature Scaling)是一种用于规范自变量或数据特征范围的方法,在数据处理中,也称为数据规范化,通常在数据预处理步骤中执行。
由于原始数据的值范围变化很大,因此在某些机器学习算法中,如果没有数据规范化,则目标函数的结果偏差可能会较大。例如,假定在某分类器中通过欧几里得度量计算两点之间的距离,如果其中一个元素的取值范围非常大,则计算的距离将受此元素的影响较大。因此需要对所有特征的范围进行处理,使每个特征都能够成比例地对结果产生影响。
除上述原因外,特征缩放的另一个重要作用是基于特征缩放后的元素,梯度下降收敛速度要快得多。
特征缩放常常以数据标准化(Standardization)和数据归一化(Normalization)的方式进行处理。数据标准化是将数据按比例进行缩放,使得标准化落入一个固定的较小区间;数据归一化是把数据转换为[0,1]或[-1,1]区间的小数。特征缩放的具体方法包括最小最大值归一化、Z-score、非线性归一化等。
1.最小最大值归一化
顾名思义,最小最大值归一化(Min-Max Normalization)是基于最小值和最大值进行归一化处理,通过对数据的每一个维度的值进行重新调节,使得最终的数据向量落在[0,1]区间内,计算公式见式(3-3)。
其中,x′为处理之后的值,x为原始值。显然,根据上述公式,原始数据中的最大值归一化后为1,最小值归一化后为0。
最小最大值归一化适用数据比较集中的情况。倘若最大值和最小值不稳定,则很容易使结果不稳定,导致使用效果也不稳定。在实际使用中,可以用经验常量值替代最大值和最小值。当有新数据加入时,可能会导致最大值或最小值发生变化,因此需要重新定义和计算。
与最小最大值归一化类似的是均值归一化(Mean Normalization),计算公式见式(3-4)。均值归一化的结果相对稳定,但是依然受限于集合中的最小值和最大值:
2.Z-score
Z-score也被称作零—均值标准化,是最为常用的标准化方法之一。经过处理的数据服从标准正态分布,均值为0,标准差为1。计算公式见式(3-5),其中为所有样本的均值,σ为所有样本的标准差。
Z-score适用数据的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。Z-score要求原始数据的分布近似为正态分布,处理后的数据服从标准正态分布。
在分类算法和聚类算法中,常常需要使用距离来度量相似性,此时,Z-score比最小最大值归一化更为优异。在不涉及距离度量、协方差计算、数据不服从正态分布时,可以使用最小最大值归一化。
3.非线性归一化
非线性归一化经常用在数据分化较大的场景,有些数值很大,有些数值很小,所以需要通过一些数学函数对原始值进行映射,如log函数转换、atan函数转换等。具体需要根据数据分布的情况,决定采用的非线性函数。
(1)log函数转换。log函数对于大的x而言增长非常缓慢,所以常使用log函数来压缩大的数据。基于log函数的归一化计算公式见式(3-6)。
例如,对于数值序列(15,21,32,41,54,66,77,78,89),基于log函数转换之后的结果如图3-4所示。如果想让处理结果分布在[0,1]区间,则要求原输入数据不应小于1。
图3-4
(2)atan函数转换。atan函数返回的是反正切值,返回的角度范围在-π/2到π/2之间。基于atan函数的归一化计算公式见式(3-7)。
对于数值序列(15,21,32,41,54,66,77,78,89),通过atan函数转换之后的结果如图3-5所示。如果想让处理结果分布在[0,1]区间,则原始输入数据应大于或等于0,小于0的数据被映射到[-1,0]。
图3-5
非线性的转换方式还有很多,读者可以根据业务场景自定义函数。非线性归一化方法在原始数据保持相对大小的情况下进行了非线性映射,这意味着数据相对大小的差距仍然存在,但绝对差距已经发生了变化,且差距不是成比例变化的,因此适合较为复杂的场景。
最小最大值归一化、Z-score、非线性归一化是目前比较常用的特征缩放方法,此外,缩放至单位长度的特征缩放方法在机器学习领域中也时常被用到,计算公式为x′=x/||x||。通过缩放特征向量的分量,将每个分量除以向量的欧几里得距离,使整个向量的长度为1。
在图像领域有类似的对原始数据处理的方法,例如,对图像的归一化处理,在处理自然图像时,获得的原始图像像素值在[0,255]区间,常用的处理方法是将这些像素值除以255,使它们缩放在[0,1]区间。
3.2.2 特征编码
一般来说,通过各种渠道获得的数据相对杂乱,并且可能带有各种非数字的特殊符号,如中文表述等。但实际上,机器学习模型所需的数据是数值型的,因为只有数值型的数据才会真正被计算。因此,对于非数值型的特征值,需要对其进行相应的编码,使其能够被高效计算。当然,编码过程实际上是另外一种量化过程。根据解决问题的场景,我们可以把数据的特征编码分为标签编码、独热编码和多热编码等。
1.标签编码(Label Encoding)
标签编码主要针对的是离散型特征,适用原始数据是有序离散的场景。例如,(香蕉,车厘子)这样的特征是无法直接被模型使用的,因此需要将这些特征转换为算法模型能理解的编码。一个很容易想到的方法就是把这些特征数字化,即标签编码。比如(香蕉,车厘子)可以用(0,1)表示,(手机,电脑,平板……)可以用(0, 1, 2, …)表示。即对于一个有K个类别的特征,可以用(0, K-1)的连续整数进行标签编码。
2.独热编码(One-hot Encoding)
在很多应用场景中,特征是非连续型的变量,如果需要对这部分变量进行计算,则需要借助其他方法把这些变量数值化,而独热编码非常适合处理离散型的特征值。
例如,性别有两个离散变量,即男和女,而实际上,男、女是无法直接参与计算的,数值化并不是将男和女分别数值为1和-1,因为1和-1依然是离散变量,数值0对离散变量1和-1没有直接意义,类别之间本身也是无序的。
独热编码表示一种特殊的位元组合,一个特征仅允许一个位为1,其他位必须为0。独热向量是机器学习中经独热编码之后产生的向量。在任意维度的独热向量中,仅有一个维度的值是1,其余均为0。例如,向量(00010)中有且仅有一位为1,将离散型数据转换成独热向量的过程被称为独热编码。若情况相反,向量中只有一个0,其余均为1,则称为独冷编码(One-cold Encoding)。例如,某离散型数据“苹果”“梨子”“桃子”,它们的独热向量分别为(1 0 0)、(0 1 0)和(0 0 1)。
在一般的回归问题、分类问题、聚类问题等机器学习算法应用中,特征之间距离的计算或相似度的计算是非常重要的。距离或相似度的计算大部分是通过余弦相似性、欧氏距离等计算的,使用独热编码,将离散特征的取值扩展到欧氏空间,离散特征的某个取值就对应欧氏空间的某个点,距离可以通过欧氏距离计算。例如,香蕉的独热向量为(1 0 0),通过算法计算的某未知水果的向量是(0.8 0.1 0.1),则通过欧氏距离计算可以知道该水果很可能为香蕉。
独热编码解决了分类器不好处理属性数据的问题,在一定程度上起到了扩充特征的作用。当类别的数量较多时,特征空间会变得非常大,在这种情况下,一般可以用主成成分分析来减少维度,且独热编码与主成成分分析这种组合在实际场景中应用得非常广泛。
从运算的角度,独热编码至少带来了三方面的好处:
(1)将离散型的数据转换为离散型数值,有助于算法的处理和计算;
(2)转换成固定维度的独热向量,方便机器学习算法进行线性代数的计算;
(3)在独热向量中,绝大部分数值都是0,如果使用稀疏矩阵的数据结构进行计算,则可以节省计算内存。
3.多热编码(Multi-hot Encoding)
在独热编码中,有且仅有一个位的值为1;而在多热编码中,允许多个位的值为1。多热编码大多出现在存在多个特征属性的场景,而非唯一一个。例如,在水果列表(香蕉,苹果,车厘子)中,某顾客喜欢的水果并非有且只有一个,如果顾客喜欢的是香蕉和苹果,则可以多热编码为(1 1 0)。
● 从技术实现的角度来看,多热编码在神经网络或深度学习的一些输入中较为常见,将复杂的混合特征通过多热编码的形式传递给算法模型。
● 从应用场景的角度来看,多热编码在用户画像中的应用非常多,尤其是通过多热编码表示用户的特征形态、静态属性、行为属性等。
● 从数据的本质的角度来看,对数据的多热编码处理实际上是一种稀疏矩阵的降维压缩过程。