机器学习特征处理笔记概要
在特征工程之前,数据的特征需要经过哪些必要的预处理(preprocessing)?
其中最广为人知的预处理技巧可能就是特征缩放(feature scaling),它的目的是保证所有的特征数值具有相同的数量级。在有些情况下,数据中的某些特征会具有不同的尺度,比如在电商上买衣服时,身高和体重就是不同尺度的特征。
举个简单例子来说:
假设我的身高 / 体重是 1.85 米 /64 公斤,而买了同款衣服的两个朋友,1.75 米 /80 公斤的穿 L 号合适,1.58 米 /52 公斤的穿 S 号正好。直观判断的话,L 码应该更合适我。可如果把(身高,体重)的二元组看作二维空间上的点的话,代表我自己的点显然和代表 S 码的点之间的欧式距离更近。如果电商不开眼的话,保不齐就会把 S 码推荐给我。
实际上,不会有电商做出这么弱智的推荐,因为他们都会进行特征缩放。在上面的例子中,由于体重数据比身高数据高出了一个数量级,因此在计算欧式距离时,身高的影响相比于体重是可以忽略不计的,起作用的相当于只有体重一个特征,这样的算法自然就会把体重相近的划分到同一个类别。
特征缩放的作用就是消除特征的不同尺度所造成的偏差,具体的变换方法有以下这两种:
不难看出,标准化的方法用原始数据减去均值再除以标准差,不管原始特征的取值范围有多大,得到的每组新数据都是均值为 0,方差为 1,这意味着所有数据被强行拉到同一个尺度之上;归一化的方法则是用每个特征的取值区间作为一把尺子,再利用这把尺将不同的数据按比例进行转换,让所有数据都落在 [0, 1] 这个范围之内。虽然实现方式不同,但两者都能够对数据做出重新标定,以避免不同尺度的特征产生不一致的影响,可谓殊途同归。
除了尺度之外,数据的偏度也是值得关注的一个问题。偏度(skewness)是用于描述概率分布非对称性的一个指标。数据服从有偏分布意味着数据当中可能存在着异常点(outlier)。
面对偏度较大的数据,第一反应就应该是检查是否有异常点存在。一般来说,如果少量数据点和其他数据点有明显区别,就可以认为是异常点。在处理异常点时,首先要检测这些数据的可靠性,判断异常取值是不是由错误或者失误导致。如果异常点本身并没有问题,需要考虑的下一个问题就是异常点和正常点是否来源于不同的生成机制,从而具有不同的概率分布。如果对异常点所在的分布的采样数据较少,就不足以体现出分布的特性,导致单个数据点看起来显得突兀。
对于像决策树这类对异常点比较敏感的算法来说,不管来源如何,异常点都需要被处理。最直接的处理办法就是将异常点移除,但当数据集容量较小时,这种一刀切的方式会进一步减少可用的数据,造成信息的丢失,这时就需要采用名为**“空间标识”(spatial sign)**的数值处理方法。
空间标识方法先对所有的数据点进行前面提到的标准化处理,再用样本向量的 2 范数对样本中的所有特征进行归一化,其数学表达式可以写成
式中的 N 是数据的维度。显然,空间标识算法将所有的数据点都映射到高维空间的球面上,这个映射和标准化或者归一化的不同之处在于它处理的对象并不是所有样本的同一个特征,而是同一个样本的所有特征,让所有样本呈现一致的尺度。
当然,即使在没有异常点的情况下,数据依然可能呈现出有偏的分布,这在数字图像处理中并不罕见。有偏分布的一个明显特点是最大值和最小值之间相差较大,通常可以达到20 倍或者更高。
这种数据尺度的不一致即使出现在单个特征上也不是一件好事情,对它进行修正,也就是**对数据进行去偏度处理的常用方法就是取对数变换(log transformation),也就是对特征取值取对数。**最大值和最小值之间的 20 倍差距经过对数变换后变为 log220=4.3,这就在一个可以接受的范围内了。除了对数之外,求平方根和求倒数也是移除偏度的常见处理方式。
异常点也好,尺度不一致的数据也好,它们至少还都是完整的数据。可有些时候,一个样本里的某些特征会压根儿没有取值,而是一片空白,这种情况被称为缺失值(missing values)。解决其较好的方法为给这些缺失值进行人为的赋值(imputation)。
人为赋值相当于在机器学习中又嵌套了一层机器学习,里层的机器学习被用于估计未知的属性值,也要使用训练数据。最常用的赋值算法是K 近邻算法:选取离具有缺失值的样本最近的 K 个样本,并以它们对应特征的平均值为缺失值赋值。此外,线性回归也可以用来对缺失值进行拟合。但可以确定的是,不管采用什么方法,人为赋值都会引入额外的不确定性,给模型带来的性能造成影响。