第三章数据预处理当今现实世界中的数据库极易受噪音数据、遗漏数据和不一致性数据的侵扰,因为数据库太大,常常多达数千兆,甚至更多。“如何预处理数据,提高数据质量,从而提高挖掘结果的质量?”你可能会问。“怎样预处理数据,使得挖掘过程更加有效、更加容易?”有大量数据预处理技术。数据清理可以去掉数据中的噪音,纠正不一致。数据集成将数据由多个源合并成一致的数据存储,如数据仓库或数据方。数据变换(如规范化)也可以使用。例如,规范化可以改进涉及距离度量的挖掘算法的精度和有效性。数据归约可以通过聚集、删除冗余特征或聚类等方法来压缩数据。这些数据处理技术在数据挖掘之前使用,可以大大提高数据挖掘模式的质量,降低实际挖掘所需要的时间。本章,你将学习数据预处理的方法。这些方法包括:数据清理、数据集成和转换、数据归约。本章还讨论数据离散化和概念分层,它们是数据归约的一种替换形式。概念分层可以进一步用于多抽象层挖掘。你将学习如何由给定的数据自动地产生概念分层。3.1为什么要预处理数据?想象你是AllElectronics的经理,负责分析涉及你部门的公司数据。你立即着手进行这项工作。你仔细地研究和审查公司的数据库或数据仓库,找出应当包含在你的分析中的属性或维,如item,price和units_sold。啊!你注意到,许多元组在一些属性上没有值。对于你的分析,你希望知道每种销售商品是否通过广告降价销售,但你又发现这些信息根本未记录。此外,你的数据库系统用户已经报告一些错误、不寻常的值和某些事务记录中的不一致性。换言之,你希望使用数据挖掘技术分析的数据是不完整的(有些感兴趣的属性缺少属性值,或仅包含聚集数据),含噪音的(包含错误,或存在偏离期望的局外者),并且是不一致的(例如,用于商品分类的部门编码存在差异)。欢迎来到现实世界!存在不完整的、含噪音的和不一致的数据是大型的、现实世界数据库或数据仓库的共同特点。不完整数据的出现可能有多种原因。有些感兴趣的属性,如销售事务数据中顾客的信息,并非总是可用的。其它数据没有包含在内,可能只是因为输入时认为是不重要的。相关数据没有记录是由于理解错误,或者因为设备故障。此外,记录历史或修改的数据可能被忽略。与其它数据不一致的数据可以删除。遗漏的数据,特别是某些属性上缺少值的元组可能需要推导出来。数据含噪音(具有不正确的属性值)可能有多种原因。收集数据的设备可能出故障;人的或计算机的错误可能在数据输入时出现;数据传输中的错误也可能出现。这些可能是由于技术的限制,如用于数据传输同步的缓冲区大小的限制。不正确的数据也可能是由命名或所用的数据代码不一致而导致的。重复元组也需要数据清理。数据清理例程通过填写遗漏的值,平滑噪音数据,识别、删除局外者,并解决不一致来“清理”数据。脏数据造成挖掘过程陷入困惑,导致不可靠的输出。尽管大部分挖掘例程都有一些过程,处理不完整或噪音数据,但它们并非总是强壮的。相反,它们更致力于避免数据过分适合所建的模型。这样,一个有用的预处理步骤是使用某些清理例程清理你的数据。3.2节讨论清理数据的方法。回到你在AllElectronics的任务,假定你想在你的分析中包含来自多个数据源的数据。这涉及集成多个数据库、数据方或文件,即数据集成。代表同一概念的属性在不同的数据库中可能具有不同的名字,这又导致不一致性和冗余。例如,关于顾客标识符的属性在一种数据存储中为customer_id,而在另一种为cust_id。命名的不一致还可能出现在属性值中。例如,同名的人可能在一个数据库中登记为Bill,在第二个数据库中登记为William,而在第三个数据库中登记为“B”。此外,你可能会觉察到,有些属性可能是由其它属性导出的(例如,年收入)。含大量冗余数据可能降低知识发现过程的性能或使之陷入困惑。显然,除数据清理之外,必须采取步骤,避免数据集成时的冗余。通常,在为数据仓库准备数据时,数据清理和集成将作为预处理步骤进行。还可以再次进行数据清理,检测和移去可能由集成导致的冗余。回到你的数据,如果你决定要使用诸如神经网络、最临近分类或聚类1这样的基于距离的挖掘算法进行你的分析。如果要分析的数据已规格化,即按比例映射到一个特定的区间[0.0,1.0],这种方法能得到较好的结果。例如,你的顾客数据包含年龄和年薪属性。年薪属性的取值范围可能比年龄更大。这样,如果属性未规格化,在年薪上距离度量所取的权重一般要超过在年龄度量上所取的权重。此外,对于你的分析,得到每个地区的销售额这样的聚集信息可能有用的。这种信息不在你的数据仓库的任何预计算的数据方中。你很快意识到,数据变换操作,如规格化和聚集,是导向挖掘过程成功的预处理过程。数据集成和数据变换将在3.3节讨论。随着你进一步考虑数据,你想知道“我所选择用于数据分析的数据集太大了——它肯定降低挖掘过程的速度。有没有办法使我能够‘压缩’我的数据集,而又不损害数据挖掘的结果?”数据归约得到数据集的压缩表示,它小得多,但能够产生同样的(或几乎同样的)分析结果。有许多数据归约策略,包括数据聚集(例如,建立数据方)、维归约(例如,通过相关分析,去掉不相关的属性)、数据压缩(例如,使用诸如最短编码或小波等编码方案)和数字归约(例如,使用聚类或参数模型等较短的表示“替换”数据)。泛化也可以“归约”数据。泛化用较高层的概念替换较低层的概念;例如,用地区或省/州替换城市。概念分层将概念组织在不同的抽象层。数据归约是3.4节的主题。由于概念分层对于多抽象层上的数据挖掘是非常有用的,我们另用一节来讨论这种重要数据结构的产生。3.5节讨论概念分层的产生,通过数据离散化进行数据归约。图3.1总结了这里讨论的数据预处理步骤。注意,上面的分类不是互斥的。例如,冗余数据的删除既是数据清理,也是数据归约。图3.1数据预处理的形式概言之,现实世界的数据一般是脏的、不完整的和不一致的。数据预处理技术可以改进数据的质量,从而有助于提高其后的挖掘过程的精度和性能。由于高质量的决策必然依赖于高质量的数据,因此数据预处理是知识发现过程的重要步骤。检测数据异常、尽早地调整数据,并归约待分析的数据,将在决策制定时得到高回报。3.2数据清理现实世界的数据一般是脏的、不完整的和不一致的。数据清理例程试图填充遗漏的值,识别局外者、消除噪音,并纠正数据中的不一致。本节,我们将研究数据清理的基本方法。1神经网络和最临近分类在第7章介绍,而聚类在第8章讨论。3.2.1遗漏值想象你要分析AllElectronics的销售和顾客数据。你注意到许多元组的一些属性,如顾客的收入,没有记录值。你怎样才能为该属性填上遗漏的值?让我们看看下面的方法,1.忽略元组:当类标号缺少时通常这样做(假定挖掘任务涉及分类或描述)。除非元组有多个属性缺少值,否则该方法不是很有效。当每个属性缺少值的百分比很高时,它的性能非常差。2.人工填写遗漏值:一般地说,该方法很费时,并且当数据集很大,缺少很多值时,该方法可能行不通。3.使用一个全局常量填充遗漏值:将遗漏的属性值用同一个常数(如“Unknown”或–)替换。如果遗漏值都用“Unknown”替换,挖掘程序可能误以为它们形成了一个有趣的概念,因为它们都具有相同的值——“Unknown”。因此,尽管该方法简单,我们并不推荐它。4.使用属性的平均值填充遗漏值:例如,假定AllElectronics顾客的平均收入为$28,000,则使用该值替换income中的遗漏值。5.使用与给定元组属同一类的所有样本的平均值:例如,如果将顾客按credit_risk分类,则用具有相同信用度的顾客的平均收入替换income中的遗漏值。6.使用最可能的值填充遗漏值:可以用回归、使用贝叶斯形式化方法或判定树归纳等基于推导的工具确定。例如,利用你的数据集中其他顾客的属性,你可以构造一棵判定树,来预测income的遗漏值。判定树将在第7章详细讨论。方法3到6使数据倾斜,填入的值可能不正确。然而,方法6是最常用的方法。与其它方法相比,它使用现存数据的最多信息来推测遗漏值。在估计income的遗漏值时,通过考虑其它属性的值,有更大的机会保持income和其它属性之间的联系。3.2.2噪音数据“什么是噪音?”噪音是测量变量的随机错误或偏差。给定一个数值属性,例如price,我们怎样才能平滑数据,去掉噪音?让我们看看下面的数据平滑技术。1.分箱:分箱方法通过考察“邻居”(即,周围的值)来平滑存储数据的值。存储的值被分布到一些“桶”或箱中。由于分箱方法导致值相邻,因此它进行局部平滑。图3.2图示了一些分箱技术。在该例中,price数据首先被划分并存入等深的箱中(深度3)。对于按平均值平滑,箱中每一个值被箱中的平均值替换。例如,箱1中的值4,8和15的平均值是9;这样,该箱中的每一个值被替换为9。类似地,可以使用按中值平滑。此时,箱中的每一个值被箱中的中值替换。对于按边界平滑,箱中的最大和最小值同样被视为边界。箱中的每一个值被最近的边界值替换。一般来说,宽度越大,平滑效果越大。箱也可以是等宽的,每个箱值的区间范围是个常量。分箱也可以作为一种离散化技术使用,将在3.5节和第6章进一步讨论。price的排序后数据(元):4,8,15,21,21,24,25,28,34划分为(等深的)箱:箱1:4,8,15箱2:21,21,24箱3:25,28,34用平均值平滑:箱1:9,9,9箱2:22,22,22箱3:29,29,29用边界平滑:箱1:4,4,15箱2:21,21,24箱3:25,25,34图3.2数据平滑的分箱方法2.聚类:局外者可以被聚类检测。聚类将类似的值组织成群或“聚类”。直观地,落在聚类集合之外的值被视为局外者(图3.3)。第9章将研究聚类。图3.3局外者可以被聚类检测3.计算机和人工检查结合:可以通过计算机和人工检查结合的办法来识别局外者。例如,在一种应用中,使用信息理论度量,帮助识别手写体字符数据库中的局外者。度量值反映被判断的字符与已知的符号相比的“差异”程度。局外者模式可能是提供信息的(例如,识别有用的数据例外,如字符“0”或“7”的不同版本)或者是“垃圾”(例如,错误的字符)。其差异程度大于某个阈值的模式输出到一个表中。人可以审查表中的模式,识别真正的垃圾。这比人工地搜索整个数据库快得多。在其后的数据挖掘应用时,垃圾模式将由数据库中清除掉。4.回归:可以通过让数据适合一个函数(如回归函数)来平滑数据。线性回归涉及找出适合两个变量的“最佳”直线,使得一个变量能够预测另一个。多线性回归是线性回归的扩展,它涉及多于两个变量,数据要适合一个多维面。使用回归,找出适合数据的数学方程式,能够帮助消除噪音。回归将在3.4.4小节以及第7章讨论。许多数据平滑的方法也是涉及离散化的数据归约方法。例如,上面介绍的分箱技术减少了每个属性的不同值的数量。对于基于逻辑的数据挖掘方法(如判定树归纳),这充当了一种形式的数据归约。概念分层是一种数据离散化形式,也可以用于数据平滑。例如,price的概念分层可以把price的值映射到inexpensive、moderately_priced和expensive,从而减少了挖掘过程所处理的值的数量。数据离散化将在3.5节讨论。有些分类方法,如神经网络,有内置的数据平滑机制。分类是第7章的课题。3.2.3不一致数据对于有些事务,所记录的数据可能存在不一致。有些数据不一致可以使用其它材料人工地加以更正。例如,数据输入是的错误可以使用纸上的记录加以更正。这可以与用来帮助纠正编码不一致的例程一块使用。知识工程工具也可以用来检测违反限制的数据。例如,知道属性间的函数依赖,可以查找违反函数依赖的值。由于数据集成,也可能产生不一致:一个给定的属性在不同的数据库中可能具有不同的名字。也可能存在冗余。数据集成和冗余数据删除在3.3.1小节讨论.3.3数据集成和变换数据挖掘经常需要数据集成——由多个数据存储合并数据。数据还可能需要转换成适于挖掘的形式。本节介绍数据集成和数据变换。3.3.1数据集成数据分析任务多半涉及数据集成。数据集成将多个数据源中