数据挖掘工作始终是以数据为中心开展的,分类、聚类、回归、关联分析以及可视化等工作的顺利进行完全是建立在良好的输入数据基础之上的。软件开发行业有句格言:“Garbage-In-Garbage-Out”,这句话同样适用于数据科学。事实上,我们采集到的原始数据通常来自多个异种数据源,数据在准确性、完整性和一致性等方面存在多种多样的问题,这些数据并不适合直接进行挖掘。在进行挖掘算法执行之前,它们需要进行一些诸如移植、清洗、切片、转换等预处理工作。
人工输入错误或仪器设备测量精度及数据收集过程机制缺陷等方面原因都会造成采集的数据存在质量问题,主要包括测量误差、数据收集错误、噪声、离群点(outlier)、缺失值、不一致值、重复数据等问题。数据清理阶段的主要任务就是通过填写缺失值、光滑噪声数据、删除离群点和解决属性的不一致性等手段来清理数据。
数据的收集过程很难做到数据全部完整。例如:数据库中表格的列值不会全部强制性不为空类型;问卷调查对象不想回答某些选项或是不知道如何回答;设备异常;对数据改变没有日志记载。处理缺失值的方法有以下3种。
(1)忽略元组:也就是将含有缺失属性值的对象(元组,记录)直接删除,从而得到一个完备的信息表。在缺失属性对象相对于整个数据集所占比例较小时这种方法比较适用,特别是在分类任务中缺少类别标号属性时常采用。如果数据集中有较高比例的数据对象存在缺失值问题,这种方法失效。在样本资源比较少的挖掘任务中,删除宝贵的数据对象会严重影响挖掘结果的正确性。
(2)数据补齐:使用一定的值对缺失属性进行填充补齐,从而使信息表完备化。数据补齐的具体实行方法较多。
人工填写: 需要用户非常了解数据相关信息,并且数据量大时,这种方法效率太低。
特殊值填充: 将所有空值使用一个特殊值如“unknown”进行填充,这种方法有可能导致严重的数据偏离。
平均值填充: 如果属性是数值型的,使用所有对象属性的平均值来填充,对于倾斜分布情况也可以采用中位数来填充;如果属性是非数值型的,可以采用出现频率最高的值来填充。
使用最有可能的值填充: 采用基于推断的方法填充空缺值。例如,可以使用包含空值对象周围与其相似的对象值对其进行填充,可以建立回归模型,对缺失属性值进行估计,也可以使用贝叶斯模型推理或决策树归纳确定。
(3)不处理:有很多数据挖掘方法在属性值缺失方面具有良好的鲁棒性,可直接在包含空值的数据上进行数据挖掘。这类方法包括贝叶斯网络和人工神经网络等。
2.噪声数据
噪声(Noise)是一个测量变量中的随机错误或偏差。造成这种误差有多方面的原因,例如,数据收集工具的问题,数据输入、传输错误,技术限制等。噪声可以对数值进行平滑处理而消除。主要使用的技术有回归、分箱、孤立点分析。
分箱(Binning):通过考察相邻数据来确定最终值,实际上就是按照属性值划分的子区间,如果一个属性值处于某个子区间范围内,就称为把该属性值放进这个子区间所代表的“箱子”内。用“箱的深度”表示不同的箱里有相同个数的数据。用“箱的宽度”来表示每个箱值的取值区间为常数。由于分箱方法考虑相邻的值,因此是一种局部平滑方法。
假设有3、22、8、22、9、11、32、93、12等9个数,分为3箱。
箱1:3、22、8
箱2:22、9、11
箱3:32、93、12
分别用三种不同的分箱法求出平滑存储数据的值:
按箱平均值求得平滑数据值——箱1:11,11,11
按箱中值求得平滑数据值——箱2:9,9,9
按箱边界值求得平滑数据值——箱3:32,32,32
孤立点分析: 孤立点是在某种意义上具有不同于数据集中其他大部分数据对象特征的数据对象,或是相对于该属性值不寻常的属性值。可以通过聚类来检测离群点,落在簇之外的数据对象被视为孤立点。
数据对于数据挖掘任务来说是非常重要的,用户永远希望尽最大可能获得更多的挖掘目标数据。例如,在一些监督学习任务中,分类器的准确性与训练数据的数量有非常大的关联。
数据集成就是将若干个分散的数据源中的数据,逻辑地或物理地集成到一个统一的数据集合中。这些数据源包括关系数据库、数据仓库和一般文件。数据集成的核心任务是要将互相关联的分布式异构数据源集成到一起,使用户能够以透明的方式访问这些数据源。集成是指维护数据源整体上的数据一致性、提高信息共享利用的效率;透明的方式是指用户无须关心如何实现对异构数据源数据的访问,只关心以何种方式访问何种数据。
数据集成涉及若干问题需要去解决。
来自不同数据源的相同实体但名称可能完全不同,如何才能正确识别它们?例如, cust_number 与 customer_id 分别来自不同的数据库,但是表示的意思完全一样。这里,我们可以使用属性的元数据来分析它们。属性的元数据一般包括属性名称、含义、数据类型、取值范围、数据值编码及缺失值表示符号等。使用属性元数据进行数据清理工作,可避免发生模式集成错误。
如果一个属性可以由其他属性或它们的组合导出,那么这个属性可能是冗余的。解决属性冗余问题,需要对属性间的相关性进行检测。对于数值属性,通过计算两个属性之间的相关系数来估计它们的相关度。假设两个属性分别为A和B,计算公式如下:
其中,N是元组的个数;a i 和b i 为第i个元组中A和B对应的值; 和 为它们的平均值;σ A ,σ B 为 A 和 B 的标准差。如果r A,B 取值在-1与1之间,且如果r A,B >0,表示它们正相关,值越大相关性越大;相反,如果r A,B <0,表示负相关。
对于离散数据,我们可以使用卡方检验来做类似计算,根据计算置信水平来判断两个属性独立假设是否成立。
元组自身的冗余也会构成数据冗余。数据库设计者有时为了某些性能需求,使用较低级的范式要求,造成不同关系表中同一个元组不是使用外键关联,而是以副本形式重复存储。这样,还存在更新遗漏的风险,造成副本内容不一致。
属性值的表示、规格单位、编码不同,也会造成现实世界相同的实体,在不同的数据源中属性值不相同。例如,单位分别以千克和克表示的重量数值;性别中男性用 M和 male 表示。属性名称相同,但表示的意思不相同。例如,总费用属性可能有包含运费和不包含运费区分。
来自不同数据源的属性间的语义和数据结构等方面的差异,给数据集成带来了很大困难。需要小心应对,避免最终集成数据集中出现冗余和不一致问题。
在对数据分析前,通常需要先将数据规范化(Normalization),也称为标准化。不同性质属性数据直接相加不能正确反映出不同作用的正确结果。数据规范化主要包括数据同趋化处理和无量纲化处理两个方面,可以使属性值按比例落入到一个特定区间,如[-1,1]或[0,1]。
数据规范化一方面可以简化计算,提升模型的收敛速度;另一方面在涉及一些距离计算的算法时,防止较大初始值域的属性与具有较小初始值域的属性相比权重过大,可以有效提高结果精度。本节介绍三种规范化方法。
也称离差标准化,是对原始数据的线性变换,假定 min,max 分别为属性 A 的最小值和最大值。转换函数如下:
将 x 转换到区间[new_min,new_max]中,结果为x'。这种方法有一个缺陷就是当有新的数据加入时,可能导致 max,min 值的变化,需要重新定义。另外,如果要做0-1规范化,上述式子可以简化为:
也叫标准差标准化,经过处理的数据符合标准正态分布,即均值为0,标准差为1。属性A的均值 和标准差σ A 规范化,转化函数为:
当属性 A 的实际最大值和最小值未知,或有超出取值范围的孤立点时,该方法适用。
通过移动数据的小数点位置来进行标准化。小数点的移动位数取决于属性 A 的最大绝对值。x规范后的值x'计算方法:
其中,j 是使 的最小整数。例如,-84<x<231,取 j=3,-84规范化后值为-0.084,231规范化后为0.231。
需要注意的是,z-score 规范化和按小数定标规范化在计算过程中有参数值,需要保存起来,为后续数据进行统一标准化时使用。
当我们在数据仓库上进行数据挖掘时,可能会面临着在海量高维数据上进行复杂的数据分析和挖掘,算法因运行时间超出我们的忍受范围而失效。在这种情况下,可以使用原数据集的一个特征、样本子集来完成挖掘。
数据约简(Data Reduction)技术是指在尽可能保持原始数据集完整性的前堤下,最大限度地精简数据量。数据约简技术可以用来得到数据集的约简表示,它虽然小,但仍大致保持原数据的完整性。这样,在约简后的数据集上挖掘将更有效,并产生相同(或几乎相同)的分析结果。下面介绍几种常用数据约简策略。
用于数据挖掘的原始数据集属性数目可能有几十个,甚至更多。这其中包含了一些冗余或对于挖掘任务并不相关的属性。例如,数据对象的 ID 号通常对于挖掘任务无法提供有用的信息;生日属性和年龄属性相互关联存在冗余,因为可以通过生日日期推算出年龄。冗余和与挖掘任务不相关的特征对挖掘任务本身是有害的,它们对挖掘算法起到干扰作用,会降低挖掘任务的准确率或导致发现很差的模式。此外不相关和冗余的属性增加了数据量,可能会减慢挖掘过程。
属性子集选择是指从已有的m个属性中选择其中n个属性,使得系统的特定指标最优化。它是从原始特征中选择出一些最有效特征以降低数据集维度的过程,是提高学习算法性能的一个重要手段。
尽管使用常识和领域知识可以快速消除一部分不相关和冗余属性,但是选择最佳特征子集需要一个系统的方法。假设数据对象有n个属性,那么会有2 n 个属性子集,求最优属性子集本质上是在2 n 个解构成的空间中搜索最优解。
(1)当 n 较小时,可以采用全局搜索策略,用给定的属性子集评价指标评价每个属性子集,从中选出最优特征子集。
(2)当 n 较大时,全局搜索行不通,可以采用启发式搜索策略、概率搜索策略等选择次优属性子集。
有三类属性子集选择方法:嵌入(embedded approach)、过滤(Filter Approach)和包装器(Wrapper Approach)。
(1)嵌入:将属性选择任务插入到数据挖掘过程当中,挖掘算法本身包含了属性选择任务,如决策树归纳方法。
(2)过滤:属性选择过程独立于挖掘算法。这种方法速度快,但是选出的属性子集的分类性能弱于包装器方法。
(3)包装器:属性选择与分类算法绑定,它在筛选属性的过程中直接用所选的特征子集来训练分类器,并根据在测试集上的性能表现来评价属性子集的优劣。算法计算效率较慢,属性子集分类性能好。
过滤方法与包装器方法的流程基本相同,如图2-2所示。其不同在于属性子集的评估方法,包装器使用目标数据挖掘算法作为子集评估方法。
图2-2 属性子集选择流程图
属性子集选择过程包括四个组成部分:子集评估、搜索策略、停止搜索标准和验证过程。属性子集评估有两种标准:一种是用于单独衡量每个属性分类能力的评价标准,另一种为对属性子集整体分类性能做评价的标准。停止搜索标准一般是设置算法执行时间、循环评价次数及性能指标阈值等作为算法停止条件。
主成分分析(Principal Component Analysis,PCA)是一种广泛用于不同领域的无监督线性数据转换技术。PCA 的目标是在高维数据中找到最大方差的方向,并将数据映射到一个维度小得多的新子空间上。借助于正交变换,将其分量相关的原随机向量转化成其分量不相关的新随机向量。在代数上表现为将原随机向量的协方差阵变换成对角形阵,在几何上表现为将原坐标系变换成新的正交坐标系,使之指向样本点散布最开的几个正交方向。
PCA 通过创建一个替换的、更小的变量集来组合属性的基本要素,去掉了一些不相关的信息和噪声,数据得到精简的同时又尽可能多地保存了原数据集的有用信息。PCA的应用条件是要求属性间存在较大的相关性,当相关性较小时,应用主成分分析没有意义。PCA的基本操作步骤如下。
(1)首先对所有属性数据规范化,每个属性都落入相同的区间,消去量纲对算法的影响。
(2)计算样本数据的协方差矩阵。
(3)求出协方差矩阵的特征值及相应正交化单位特征向量。前m个较大的特征值就是前m个主成分对应的方差。主成分的方差贡献优选法反映信息量的大小。
(4)通过计算累计贡献率来选择主成分。主成分向量构成了一组正交基,输入数据可以由它们的线性组成表示。
(5)对主成分按重要性排序。主成分是新空间下的坐标轴,提供了关于方差的重要信息。
(6)选择重要性最高的若干个主成分,同时将剩下的较弱主成分舍弃,这样就完成了约简数据的规模。
离散小波变换(DWT)是从离散傅里叶变换(DFT)发展而来的。傅里叶变换是信号由时域到频域的转化工具,将信号的波形分解成不同频率的正弦波或余弦波的叠加,信号分析工作转为傅里叶变换函数权系数的计算。离散小波变换是一种更好的有损压缩,相对于傅里叶变换提供了对原始数据更准确的近似。
将具有n个属性的数据对象,使用n维数据向量X=(x 1, x 2 ,…,x n )表示。离散小波变换用于数据向量 X,可以将X转换成相同长度的小波系数向量X'。通过设定适当阈值,过滤掉小于阈值的小波系数,向量X'可以仅存放一部分最强的小波系数,向量中其余部分用0值替换,完成近似的数据压缩。在小波空间下对稀疏的向量X'进行操作计算可以获得较快的速度,在过滤掉数据中噪声的同时,保留了数据的主要特征。最后对处理后的小波系数向量X'进行离散小波变换逆运算,可以构造原数据的近似。
有些数据挖掘算法,要求数据属性是标称类别,当数据中包含数值属性时,为了使用这些算法,需要将数值属性转换成标称属性。通过采取各种方法将数值属性的值域划分成一些小的区间,并将这连续的小区间与离散的值关联起来,每个区间可看作一个类别。例如,对某个问题中的年龄属性,一种可能的划分类别的操作是:[0…11]→儿童, [12…17]→青少年,[18…44]→青年,[45…69]→中年,[69…∞]→老年。这种将连续变量划分成不同类别的过程通常称为离散化(Discretization)。
有效的离散化能够减少算法的时间和空间开销,提高系统对样本的聚类能力,增强系统抗数据噪声的能力及提高算法的学习精度。离散化后的数据更易于理解、使用和解释。很多不适用于连续型数据的算法得以适用。
连续属性离散化的问题本质是:决定选择多少个分割点和确定分割点位置。任务可分为两个步骤完成。首先将连续属性排序,并通过指定n-1个分割点把它们分成n个区间。然后,将一个区间中的所有值映射到相同的分类值。
数据离散化的方法有多种类型,通常可以分为无监督离散化和有监督离散化。在离散化过种中使用类信息的方法是有监督的,而不使用类信息的方法是无监督的。
无监督离散化方法中最简单的方法是等宽分箱法和等频分箱法。等宽分箱法将排好序的数据从最小值到最大值均匀划分成n等份,每份的间距是相等的。假设A和B分别是属性值的最小值和最大值,那么划分间距为 w=(B-A)/n,每个类别的划分边界为 A+w, A+2w, A+3w, …, A+(n-1)w。这种方法的缺点是对异常点比较敏感,倾向于不均匀地把实例分布到各个箱中。等频分箱法将数据总记录数均匀分为 n 等份,每份包含的数据个数相同。如果 n=10,那么每一份中将包含大约10%的数据对象。这两种方法都需要人工确定划分区间的个数。等频法可能将具有不相同类标号的相同属性值分入不同的箱中,以满足箱中数据固定个数的条件。
以上两种算法容易实现,适用较广,但是有些情况下存有弊端。比如,假设对某一工资属性进行划分,用等宽分箱法划分为5区间,最高工资为50000,则所有工资低于10000的人都被划分到同一区间。等频分箱法可能正好相反,所有工资高于50000的人都会被划分到50000这一区间中。这两种算法都忽略了样本数据所属的类别信息,划分区间的边界不太可能落在最合理的地方。
ChiMerge是一种监督的、基于X 2 检验的数据离散化方法。其基本思想:对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低X 2 值表明它们具有相似的类分布。
ChiMerge算法离散化数据操作流程包含三个基本步骤:
(1)将所有样本数据按给定数值属性A的值升序排序。
(2)把数值属性A的每个不同值看作一个区间。
(3)对每对相邻的区间进行X 2 检验。将最小X 2 值的相邻区间合并成一个区间。重复执行X 2 检验并且自底向上合并区间,直到X 2 检验达到设定的阈值。