人工智能知识全面讲解:数据预处理
数据准备有收集数据、探索数据、数据预处理三个步骤。这一章我们重点讲解如何挖掘数据的有效信息以及如何对数据进行预处理,以便从加工后的数据中提取特征,为模型学习打?坚实的基础。在信息化时代,数据逐渐成为现代社会基础设施的一部分,就像日常生活中不可或缺的水、电、公路、通信网络一样。同时因互联网的快速普及,全球数据量正呈现出指数级的爆炸式增长。弗雷斯特研究公司的公开研究结果表明,目前金融交易、社交媒体、GPS坐标等数据源每天产生超过2.5EB的海量数据。美国国际数据集团预测,按照目前全球数据总量50%?右的增长率预估,至2020年全球产生的数据总量将达到40ZB。面对如此庞大的数据矿山,想要挖出有价值的金子可不是一件容易的事情,其主要原因在于数据来源渠道太广泛,因此收集到的数据质量参差不齐,缺失大量的数据或存在很多异常数据。导致数据不完整或者不准确的原因有很多,例如不同渠道用户填写的信息不同、用户修改信息后历史数据没有被覆盖、数据传输过程中丢失、命名约定不一致或输入字段格式不一致等。在银行办理过业务的同学都有过这样的经历,填表时,对于不重要的信息选择不填写,不便透露的信息随便填写,“生日”直接选择默认值“1月1日”,“家庭住址”填写了城市,这些行为都会给数据处理人员造成不少的困扰。想象你是一家互联网金融公司的产品经理,你设计了一个功能,通过用户注册时填写的“兴趣爱好”来推荐不同的理财业务。上线后?发现转化率非常低,仔细一看数据才发现“兴趣爱好”区域中默认勾选了几个板块,因此很多用户懒得修改,就直接进入?一步了。从数据上看有几个板块较受欢迎,但实际上不是用户的真实想法。这种“不真实”的数据会让产品经理产生错误的判断。同样,这种“不真实”的数据也会给模型以错误的引导。数据和特征决定了机器学习的上限,而模型和算法的应用只是让我们逼近这个上限。这个说法形象且深刻地道出数据处理和特征分析的重要性。给定不同的训练数据,训练出来的模型的效果可能天差地别。因此上述这种数据格式不统一、存在异常值和缺失值的现象,会让机器的学习过程变得十分艰难。如图2-1所示,一般情况?,我们获得的原始数据可能存在以?几个问题。
(1)存在缺失值:部分字段没有信息,需要补充缺失值。(2)存在异常值:部分字段因为记录错误,导致出现不在正常取值范围内的数值。(3)信息的度量范围不同:很多字段的数值取值范围不同,例如年龄的取值一般在0~120的区间,身高的取值通常在60~230的区间。具有不同单位、度量范围的数据很难放在一起比较,需要通过某些方法让所有数据的取值都处在一个范围里。(4)信息表达的意?不准确:对于某些定量特征,其包含的信息是以区间划分的数值,不同数值代表的含?有很大差别。例如学生的考试成绩,“59分”和“60分”虽然只有1分之差但表示的含?是完全不同的,我们可以将定量的考分,转换成“1”和“0”表示及格和未及格。(5)定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,例如客户的“兴趣爱好”这个字段有“文体活动”“投资理财”等,我们可以把这些表述转化成“01”“02”这样的数值以便机器能够加以区分。(6)信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,部分数据的表达能力比较弱,需要通过数据增强的手段才能让机器更容易理解。为了解决以上问题,提高数据质量,工程师们在训练模型前首先需要想办法提升数据的质量。因此他们创建了许多数据预处理技术,通过这些技术能够增强数据的表现力,让算法发挥最佳的效果。数据预处理主要分为数据清洗、数据集成、数据变换及数据归约四个步骤。在数据清洗阶段,我们试图填充缺失的值,光滑噪声点和识别离群点,并纠正数据中不一致的取值。在数据集成阶段,我们会将多个数据源中的数据整合存放在统一的数据源中,这样做有助于减少结果数据集的冗余和不一致,提高后续建模的准确性和速度。在数据变换阶段,我们通过平滑聚集、数据概化、规范化等方式将数据转换成适用于数据挖掘的形式。在数据归约阶段,在尽可能保持数据原貌的前提?,最大限度地精简数据量。这样,使用归约后的数据集训练模型更加高效,并且能够产生与原数据集相同的分析结果。2.1.2数据清洗拿到数据之后,我们首先进行数据清洗。数据清洗是整个数据预处理的第一步,也是对数据重新审查、校验的过程。通过这个环节,能够统一数据格式,清除异常值以及填补缺失值,不让错误、不规整的数据进入模型中。通常情况?,我们可以按照格式标准化、错误纠正、异常数据处理以及清除重复数据这样的顺序检查数据问题并且选择合适的方法处理其中待改善的数据,如图2-2所示。数据清洗的方法非常多,产品经理只需要了解数据清洗的一般思路,在面对实际问题时能根据数据源的特点选择合适的方法进行清洗即可,没有必要把全部方法都使用一遍。
1.格式标准化拿到数据之后,我们首先统一数据格式规范。不规范、不统一的数据可能不会影响我们对数据含?的理解,但是影响模型对数据的理解。因此含?相同的字段需要采用统一的表达形式,例如,1月30日、1/30、1-30表达的都是同一天,需要统一采用标准时间戳格式。深圳福田、深圳市福田区、深圳福田区都表达相同的含?,需要采用相同的表达形式。最后检查数据中不应该出现的字符,最常见的是字段中头部、中部、尾部误输入的空格,或者是姓名中存在数字、身份证号中出现汉字这样的情况。2.错误纠正接?来检查数据中有没有出现与该字段不符的内容,产品经理可以对数值型以及枚举型字段的取值设定一个范围,依靠业务知识与经验帮助工程师修正数据中出现的错误取值。例如银行在分析客户的消费情况时,会发现部分客户的信用卡消费金额中出现负数的消费记录,如果有对应数额的消费记录则可以判断这笔记录是一笔退款,则可以同时清除这两条消费记录。如果没有对应数额的消费记录,则判断这笔记录是一笔还款,则可以消除这条入账记录。还有一种常见的错误是输入位置错误,例如在姓名栏填写了性别,在身份证号栏填写了手机号等。对于这种情况,不能简单地删除错误数据,因为有可能是人工填写错误,也有可能是前端没有校验,还有可能是导入数据时存在部分或全部列没有对齐的问题,因此我们要仔细识别问题类型,逐个进行处理。
3.异常数据清理统一数据格式后,开始分析数据的异常情况。在这个环节需要处理含有缺失值及异常值的数据,缺失值是指字段取值缺失的数据,异常值指的是数据集中偏离大部分数据的取值的数据。在没办法补充数据的情况?,对于数据的缺失值,一般采用删除法或插补法处理。删除法比较简单,如果存在缺失值的数据量不大,则可以直接删除这些缺失的记录。如果某个变量的缺失值较多且对研究目标没有太大影响,则可以将这个变量整体删除。在条件允许的情况?,可以用插补法找到缺失值的替代值进行插补,尽可能还原真实数据的分布情况。常见的插补法有两种形式。(1)使用属性的中心度量填充缺失值:统计某个缺失特征的数据分布情况,对于均匀分布的特征数据可以使用均值进行插补;对于分布不均匀的特征数据可以使用中位数进行插补,如图2-3所示。还是刚才银行分析客户消费情况的例子,如果部分客户的月收入特征没有数值,则可以统计所有客户的月收入情况,取月收入的中位数或均值,填充到缺失该特征的样本中。
2)使用最有可能的值填充缺失值:使用算法推测缺失值,常见的算法有回归算法、贝叶斯算法或决策树算法。如图2-4所示,如果我们想要更加准确地知道一个客户的月收入,则可以通过决策树的方式找出和这个客户具有相同特征的人群,对比该人群的月收入情况再确定缺失值。或者通过回归算法,预测出这个客户最有可能的月收入情况,以此填充缺失值。
异常值也称为数据噪声,若想处理噪声数据,首先要了解如何找到这些噪声点。通常我们会采用两种方法寻找噪声点:一种是计算该数据集的均值,选择与均值差距较大的数据点作为噪声点;另一种是采用聚类方法,将某个特征可能出现的取值集合成“群”,落在“群”集合之外的值被视为离群的噪声点。检查噪声后,采用分箱、聚类、回归、机器和人工检查相结合等方法让数据的分布情况变得更“光滑”,去掉数据中的噪声。产品经理不需要掌握具体的实现方法,只需要了解哪些是我们可以使用的技术。无论是缺失值还是异常值,都需要产品经理仔细思考,分析成因并推测出正确值。对于缺失或不能推测的数据也要想一些其他转化的方法让这部分数据的不良影响降到最低。4.清除重复数据数据清洗的最后一步是检查数据源中有没有特征值相同的记录。这个步骤比较简单,只需要判断样本数据的每一个特征值是否相同,将相同的记录合并为一条记录即可。
2.1.3数据集成如果样本数据被存放在多个不同的数据源中,我们需要将这些数据源中的数据结合起来并统一存储。建立数据仓库的过程实际上就是数据集成,如图2-5所示。这个步骤就是将分散在不同数据源的样本有机地整合到一起,例如宽表整合,将所有的特征值合并到一张表上展示。集成有助于减少结果数据集的冗余,并且对数据进行统一处理,能够提高后续数据挖掘的准确性和速度。
数据集成是指将多个数据库整合为一个数据库。在这个过程中需要着重解决命名差异、数据冗余以及数据值冲突三个问题。造成这些问题的原因主要是来自多个数据集合的数据由于在命名上存在差异而导致相同的特征具有不同的名称,或者是相同意?的字段采用了不同的表达方式,等等。实际上,命名差异与数据值冲突的问题在经过数据清洗后已经基本得到解决,数据冗余的问题通过数据变换及数据归约解决。在集成环节,只需要把不同数据集的数据结合并统一存储即可。2.1.4数据变换经过以上几步,我们可以得到一份格式统一、没有缺失值和异常值的初始数据。这样的数据集已经满足了机器学习的基本要求,可以开始训练模型了。但是在模型实际应用数据的时候会发现,使用这种数据训练起来速度慢而且效果也不好,其原因是数据量太大,部分有价值的信息没有被完全利用。为了提升模型的准确率,我们可以尝试变换数据,帮助计算机寻找数据之间的关联,挖掘出更有价值的信息。常见的数据变换方法有很多,例如标准化、归一化、正则化、特征二值化,等等。产品经理只需要了解这些方法的目的,不需要掌握具体的实现过程。图2-6展示了常用的数据变换方法。
对于人类来说,通过计算很容易判断,“投10万元,年化3%的收益率”与“投10万元,每天8.2元的收益”这两种方法获得的回报是相同的。但是对计算机来说,要理解这两句话比较困难,因为3%和8.2元采用的是不同的度量方式,计算机没有办法比较。因此我们借助数据标准化的手段消除数据之间的度量差异,让不同取值的特征采用同一数量级的表达方式,从而让它们变得有可比性。在比较客户存款数的时候,如果存款最少的客户只有2000元,存款最多的客户有2000万元,那么存款这个字段的取值区间为[2000,20000000],设计这样的区间可能会让计算机误以为存款数需要达到1000万?右才是达到平均水平,显然这是不合理的。因此我们借助区间缩放的方法,把原始特征的取值区间转化到[0,1]的范围,让数据呈现更准确的分布,从而提升计算机学习的效率。还有一种常见的情况是针对布尔值的字段进行数值化的转换,例如在银行的贷款申请表上经常会看到“是否申请过信用卡”这个字段,在处理数据时可以用“1”表示申请过信用卡,用“0”表示没有申请过信用卡,这种方法称为特征二值化。无论哪一种数据变换的方法,都是为了帮助机器能更好地“理解”数据的含?,最终找到数学上的规律。但是产品经理需要注意,在实际应用中,并非所有的模型通过数据变换都能提升效率,甚至在有些情况?会适得其反,降低模型的精度。关于数据变换,一定要根据数据的特点选择合适的方法,切勿不管什么方法乱用一通,这种做法对模型没有任何帮助。2.1.5数据归约从大型数据集获得的挖掘结果未必会比从小型数据集获得的挖掘结果更好,因此在分析大型样本集的内在关联关系之前,还需要执行一个额外的步骤,即数据归约。挖掘样本数据能够得到什么样的结果,很大程度上取决于对特征的挑选、规约或转换的结果如何。在实际项目中,在训练一个模型时,采用的样本特征可能非常多,可能有数百甚至上千个,如果特征很多,但是只有几百条样本可用于分析,那么在大量特征上进行挖掘分析就要花费较长的时间。这时候就需要对样本数据集进行适当的维归约,以便训练出可靠的模型,使其在面对新数据时具有实用性。另一方面,数据特征太多,也会导致一些数据挖掘算法不可用,唯一的解决方法是再进行数据归约。这和我们在网上?载一张图片是一个道理。某张图片的大小在30MB以上,需要耗费较长的?载时间,如果想让?载图片的时间变短并且保持较高的图片精度,则可以通过无损压缩技术让图片变小,同时保持图片分辨率没有太大变化。数据归约技术好比是图片的无损压缩,通过该技术可以得到比原数据集小很多,但仍然保持原数据表达含?的规约数据集。数据归约的三个基本操作是删除列、删除行和减少列取值的数量。通过数据规约的方式可以获得与原数据集相比更小的规约数据集,同时去除冗余特征,减少建模工作量,让模型的学习速度更快,精度更高。常见的数据归约手段有维归约、数据压缩、数量归约,等等,这类方法产品经理只需要了解即可,在此不展开介绍。但产品经理要注意,对一个数据集进行归约之前,需要对计算时间、预测的精度以及数据挖掘的复杂度这三个方面进行分析,只有当项目拥有的资源能够满足这三方面的条件时,才能进行大规模的数据规约。