数据预处理及常用处理方法

作为互联网上最著名的数据科学竞赛平台之一,Kaggle 无疑是数据从业者和爱好者最喜欢的社区之一。最近,Kaggle 发布了 2017 用户调查报告,共有 16000 余名用户参与的这份调查可以让我们对数据工作者的各类信息有一个了解。

其中,对于“工作中遇到的障碍主要是什么?”这个问题,有 49.4% 的被调查者选择了“脏数据(dirty data)”这一项,占该问题所有选项的第一位。也就是说,数据科学家一般最常见的困扰就是要对手头的数据进行大量的预处理工程。

在业界有一句广泛流传的话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。从这句话可以看出,数据的好坏对于机器学习模型的最终效果有着极大的影响。

然而,现实世界中数据大体上都是不完整、不一致、含噪声的脏数据,无法直接使用,或结果差强人意。为了提高数据的质量,数据预处理技术应运而生。实际上,在一个基于机器学习模型的实际应用中,对于数据的预处理工作所需的时间和精力可能远大于模型和算法的选择和应用。

数据预处理的概念

数据预处理是指对所收集数据进行分类或分组前所做的审核、筛选、排序、变换、规约、汇总等必要的处理。

数据预处理针对的问题

通过数据获取,我们能够得到未经处理的数据,这时的数据可能存在一些问题。在解决这些问题后,我们才能选择和提取合适的特征进行模型的训练。

这里简述了一部分问题及其解决方法,还有一些问题的解决方案会在下节展开讨论:

  • 不属于同一量纲:特征的规格不同,不能放在一起比较。后文提到的无量纲化可以解决这一问题。

  • 信息不规整:由于数据收集或存储时的错误、技术问题或漏洞,以及软硬件故障等因素,可能存在一些不规整数据。这些不规整的数据需要被过滤掉。

  • 数据点缺失:缺失或不规整的数据需要根据其他数据进行填充,方法包括用零值、全局期望或中值,或是根据相邻或类似的数据点来做插值等。需要根据数据、应用场景和个人经验来选择正确的方式。

  • 异常值问题:异常值的主要问题在于即使它们是极值也不一定就是错的,对错非常难以分辨。异常值可被移除或是填充,但鲁棒回归等统计技术可用于处理异常值或是极值。另外,利用如对数或高斯核对异常值进行转换也有利于降低值跳跃的影响。

  • 数据类型不合要求:对于某些类型的特征,我们可能希望将其转换为另一类型进行使用。比如,我们可以将考试分数这个数值特征转换为是否及格这个二元特征,这个可以通过二值化(设定一个阀值)实现。其他的转换也可以通过自己定义的函数实现。

  • 数据不能直接使用:对于例如文本特征、类别特征等特定类别的特征,机器学习算法和模型不能直接使用,那么需要对其做一些转化。对于文本特征,可以使用词袋(bag-of-word)表示法;而对于类别特征,可以使用 One-hot 编码进行处理。这些方法的核心都是编码,会在下一节再出现。

数据预处理的常用方法

除开过滤、填充等方法之外,下列方法在实际问题的数据预处理中也比较常用。

无量纲化

无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化归一化

标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。

归一化利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。

标准化

标准化也叫 z-score 规范化(零均值规范化)。公式如下:

标准化.png

其中 μ 是样本数据的均值(mean), σ 是样本数据的标准差(std)

通过标准化,样本数据被变为一个均值为 0,方差为 1 的分布。对于梯度下降,标准化可以达到加速收敛的效果,且不改变原始数据的几何分布。

归一化

归一化一般是将数据按比例缩放到指定的范围,用于去除不同维度数据的量纲以及量纲单位

最常见的归一化方法就是 Min-Max 归一化:

归一化.png

经过归一化处理过后的数据,各个特征维度对目标函数的影响权重是一致的,不会发生某一特征因维度过高而起主导作用,从而遮盖住其他特征的问题。

有一点值得注意的是,在归一化测试数据时,测试集和训练集应该使用相同的归一化方法。即保存从训练集上取得的归一化参数,使用同样的公式和保存的参数来归一化测试集。这是因为我们需要保持测试集和训练集的分布一致。

另外,归一化和标准化的英文都为 Normalization,需要根据其用途(或公式)的不同去理解或翻译

编码

编码将无法作为输入的原始类别特征或文本特征表示为数字形式。其思想为用一个变量的字典来实现变量到索引序号的映射。

编码的方式也有很多,下面介绍两个常用的编码方式-One-hot 编码和哑编码。

One-hot 编码

假设变量可取的值有 k 个,如果对这些值用 1 到 k 编序,则可以用长度为 k 的二元向量来表示一个变量的取值。在这个向量里,该取值对应的序号所在的元素为 1,其他元素都为 0。

哑编码

哑编码是一种状态编码,前文提到的词袋表示法用的是这种编码方式。将这些文本特征转化为数字时,数字与数字之间是没有大小关系的,纯粹只是分类标记,这时候就需要用哑编码对其进行编码。比如 0 用 0001,1 用 0010,2 用 0100 以此类推。有点类似文本矩阵,最终会构成一个稀疏矩阵。一份文本数据中各种词可能达数百万,因此使用稀疏矩阵表示能够节省内存和磁盘空间,以及计算时间。

补充:稀疏矩阵

在矩阵中,若数值为 0 的元素数目远远多于非 0 元素的数目,并且非 0 元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非 0 元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度

稀疏矩阵算法的最大特点是通过只存储和处理非零元素从而大幅度降低存储空间需求以及计算复杂度,代价则是必须使用专门的稀疏矩阵压缩存储数据结构。

结语

以上介绍的只是一些数据预处理中的常用方法。实际上,还有许多根据不同场合选用的效果更好的处理方法。对于这些暂时没有机会使用的处理方法,限于个人水平和文章篇幅,就不一一详谈了。

在进行完数据预处理后,我们还需要选择和提取有意义的特征,将其作为输入来训练机器学习的算法和模型。之后还有选择模型、调整参数、评估、交叉验证等步骤,之后会继续整理这些方面的学习成果。

参考资料