人工智能与大数据技术导论
上QQ阅读APP看书,第一时间看更新

4.3 数据预处理

在拿到任务和数据后,应该先做数据预处理的基本流程,包括探索性分析、数据清洗和特征工程。本节阐述探索性分析的目的和途径、数据清洗的常见类型和手段、特征工程的重要性和常见方法。

4.3.1 探索性分析

探索性分析(Exploratory Analysis),或者叫探索性数据分析(Exploratory Data Analysis)是通过图表等可视化工具对原始数据(Raw Data)进行大致了解和初步分析的过程。探索性分析的目的是让我们对陌生的数据集有个直观和感性的认识,从而在庞大的数据集中发现有价值、值得挖掘的信息,找出数据集中的“亮点”。具体而言,通过探索性分析,我们可以:


• 了解数据集的基本信息。

• 给数据清洗提供方向。

• 为特征工程提供方向。


探索性分析是我们在拿到数据集还没有头绪的时候可以尝试的手段。探索性分析要避免时间过长,毕竟我们的目的是对数据进行初步探索,分析工作的大头在后面。

4.3.2 数据清洗

好的数据总是比好的算法要强得多(Better data beats fancier algorithms)。这句话送给初学者是最合适不过的。任何想从事机器学习的数据分析师,首先要记住这句话。如果数据质量差,杂乱无章,即使再好的算法也没有用,就好比加工垃圾一样,用再先进的技术加工出来的成品也是垃圾(Garbage in, garbage out)。之所以要进行数据清洗,是因为在现实生活中,我们遇到的绝大多数数据集都是“不干净的”。比如会出现以下情形(见表4-3):


● 存在重复记录的数据

比如人口数据中同一个人有两条完全相同的记录。


● 存在不相关记录

比如我们只关注中国人口数据,但数据集中有美国人的信息。


● 无用的特征信息

例如身份ID等一些显然不会对结果有影响的编号类数据。


● 文字拼写错误

一些比较明显的信息输入错误。


● 信息格式不统一

例如大小写不一致,比如“beijing”和“Beijing”应该属同一类。表述形式不统一,比如“陕西省”和“陕西”也应该统一成一种。


● 明显错误的离群值(outlier)

比如某个人的年龄数据显示为175。


● 缺失数据

表格中有一些信息空缺,没有记录,如表4-3所示。

表4-3 人口信息:杂乱的数据

*NaN表示缺失数据。

设想一下,假如我们遇到表4-3这样的原始数据,想必一定会很头疼吧。如果不做数据清洗,后面的模型分析等操作根本就是寸步难行。然而数据乱不等于它没有分析价值,只要经过专业的数据清洗和特征工程处理,我们仍然能得到出色的分析效果。现实中数据来源纷杂多样,绝大多数做机器学习的人都需要花费大量时间进行数据预处理和清洗。

那么,如何清洗数据呢?对于离群值(见图4-10),很多人会把离群值所在的记录去掉或者用缺失值代替,但其实很多时候这样做并不是最好的选择。离群值通常指样本中偏离均值较大的数据,在图像中通常处于“孤立”的位置。离群值所表示的数据很可能是有问题的。然而,离群值在被证明“有罪”之前都是清白的,仅当有确切、合适的理由的时候才可以去掉它,并且这样做能够提高模型的预测效果。因为“数值太大”,草率地将其去掉是不可取的,因为这个“大数值”本身可能包含了一定信息。最后无论怎样,离群值所在行的其他特征数据依然是清白的,所以这一条记录不能因为一个特征出现离群值就去掉。

图4-10 离群值实例

对于缺失值,有几种常见的处理方式。第一种处理方式是用均值或者众数等进行填充。这样做的好处是比较快捷、方便,但可能不是最合理的方式。当缺失值比例较大时,这样做等于人为地向数据集中添加了噪声,因为这些数据并不是真实、准确的信息,从而可能会影响我们对结论的判断。类似的填充方式还有根据前后数值填充、插值填充、模型拟合填充等。第二种处理方式是去掉该特征。当一个特征大部分值都缺失时,如果我们认为这个特征对分析没有帮助,去掉该特征也并非不是一个可取的方法。第三种处理方式是保留缺失值的信息。对于分类型变量,我们可以将缺失值作为新的一类。

4.3.3 特征工程

特征工程(Feature Engineering)又称特征提取,是机器学习建模之前的一个重要步骤。前文提到,机器学习的本质是要找从x到y的映射,我们最终的目标是输出y。如果x“不给力”的话,后面的努力往往会成为徒劳。特征工程就是从原始数据中找到合适的特征集x的过程。

在很多机器学习任务中,特征工程是最重要,也是最耗时的环节,其重要性远远超过建模和训练。然而这个过程最容易被初学者忽视。特征工程是漫长而艰苦的过程。在Kaggle数据科学竞赛中,选手们平均花在构建特征集的时间在70%以上。一个好的特征集通常能战胜一个好的模型或者算法。