Data Mining(数据挖掘)是指用非平凡的方法从海量的数据中抽取出潜在的、有价值的知识(模型或规则)的过程。该术语还有其他一些同义词:数据库中的知识发现(Knowledge discovery in databases)、信息抽取(Information extraction)、信息发现(Information discovery)、智能数据分析(Intelligent data analysis)、探索式数据分析(exploratory data analysis)、信息收获(information harvesting)、数据考古(data archeology)等。
数据挖掘的发展历程大致如下:
◆1989 IJCAI会议: 数据库中的知识发现讨论专题
–Knowledge Discovery in Databases (G. Piatetsky-Shapiro and W. Frawley, 1991)
◆1991-1994 KDD讨论专题
–Advances in Knowledge Discovery and Data Mining (U. Fayyad, G. Piatetsky-Shapiro, P. Smyth, and R. Uthurusamy, 1996)
◆1995-1998 KDD国际会议 (KDD’95-98)
–Journal of Data Mining and Knowledge Discovery (1997)
◆1998 ACM SIGKDD, SIGKDD’1999-2002 会议,以及SIGKDD Explorations
◆数据挖掘方面更多的国际会议
–PAKDD, PKDD, SIAM-Data Mining, (IEEE) ICDM, DaWaK, SPIE-DM, etc.
Data Mining(数据挖掘)是数据库研究、开发和应用最活跃的一个分支,是多学科的交叉领域,它涉及数据库技术、人工智能、机器学习、神经网络、数学、统计学、模式识别、知识库系统、知识获取、信息提取、高性能计算、并行计算、数据可视化等多方面知识。
数据挖掘技术从一开始就是面向应用的,它不仅是面向特定数据库的简单检索查询调用,而且要对这些数据进行微观、中观乃至宏观的统计、分析、综合和推理,以指导实际问题的求解,企图发现事件间的相互关联,甚至利用已有的数据对未来的活动进行预测。例如加拿大BC省电话公司要求加拿大SimonFraser大学KDD研究组,根据其拥有十多年的客户数据,总结、分析并提出新的电话收费和管理办法,制定既有利于公司又有利于客户的优惠政策。这样一来,就把人们对数据的应用,从低层次的末端查询操作,提高到为各级经营决策者提供决策支持。这种需求驱动力,比数据库查询更为强大。同时,这里所说的数据挖掘,不是要求发现放之四海而皆准的真理,也不是要去发现崭新的自然科学定理和纯数学公式,更不是什么机器定理证明。所有发现的知识都是相对的,是有特定前提和约束条件、面向特定领域的,同时还要能够易于被用户理解,最好能用自然语言表达发现结果。因此数据挖掘的研究成果是很讲求实际的。
技术
Data Mining(数据挖掘)主要任务有数据汇总、概念描述、分类、聚类、相关性分析、偏差分析、建模等。具体技术包括:
统计分析(statistical analysis)
常见的统计方法有回归分析(多元回归、自回归等)、判别分析(贝叶斯分析、费歇尔判别、非参数判别等)、聚类分析(系统聚类、动态聚类等)和探索性分析(主元分析法、相关分析法等)。其处理过程可以分为三个阶段:搜集数据、分析数据和进行推理。
决策树(decision tree)
决策树是一棵树,树的根节点是整个数据集合空间,每个分节点是对一个单一变量的测试,该测试将数据集合空间分割成两个或更多块。每个叶节点是属于单一类别的记录。首先,通过训练集生成决策树,再通过测试集对决策树进行修剪。决策树的功能是预言一个新的记录属于哪一类。
决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。
通过递归分割的过程来构建决策树:1 寻找初始分裂,整个训练集作为产生决策树的集合,训练集每个记录必须是已经分好类的。决定哪个属性(Field)域作为目前最好的分类指标。一般的做法是穷尽所有的属性域,对每个属性域分裂的好坏做出量化,计算出最好的一个分裂。量化的标准是计算每个分裂的多样性(diversity)指标GINI指标。2 树增长到一棵完整的树,重复第一步,直至每个叶节点内的记录都属于同一类。3 数据的修剪,去掉一些可能是噪音或者异常的数据。
其基本算法(贪心算法)为:自上而下分而治之的方法,开始时,所有的数据都在根节点;属性都是种类字段 (如果是连续的,将其离散化);所有记录用所选属性递归的进行分割;属性的选择是基于一个启发式规则或者一个统计的度量 (如, information gain)。停止分割的条件:一个节点上的数据都是属于同一个类别;没有属性可以再用于对数据进行分割。
伪代码(Building Tree)为:
Procedure BuildTree(S){ 用数据集S初始化根节点R 用根结点R初始化队列Q While Q is not Empty do { 取出队列Q中的第一个节点N if N 不纯 (Pure) { for 每一个属性 A 估计该节点在A上的信息增益 选出最佳的属性,将N分裂为N1、N2 } } } |
属性选择的统计度量为:信息增益——Information gain (ID3/C4.5),所有属性假设都是种类字段,经过修改之后可以适用于数值字段;基尼指数——Gini index (IBM IntelligentMiner),能够适用于种类和数值字段。
#p#
关联规则(correlation rules)
规则反映了数据项中某些属性或数据集中某些数据项之间的统计相关性,其一般形式为: X1∧…∧Xn Y(C,S),表示由X1∧…∧Xn可以预测Y,其中可信度为C,支持度为S。
设I={i1, i2,…, im}是二进制文字的集合,其中的元素称为项(item)。记D为交易(transaction)T的集合,这里交易T是项的集合,并且TÍI 。对应每一个交易有唯一的标识,如交易号,记作TID。设X是一个I中项的集合,如果XÍT,那么称交易T包含X。
一个关联规则是形如XÞY的蕴涵式,这里XÌI, YÌI,并且XÇY=F。规则XÞY在交易数据库D中的支持度(support)是交易集中包含X和Y的交易数与所有交易数之比,记为support(XÞY),即
support(XÞY)=|{T:XÈYÍT,TÎD}|/|D|
规则XÞY在交易集中的可信度(confidence)是指包含X和Y的交易数与包含X的交易数之比,记为confidence(XÞY),即
confidence(XÞY)=|{T: XÈYÍT,TÎD}|/|{T:XÍT,TÎD}|
给定一个交易集D,挖掘关联规则问题就是产生支持度和可信度分别大于用户给定的最小支持度(minsupp)和最小可信度(minconf)的关联规则。
基于规则中处理的变量的类别,关联规则可以分为布尔型和数值型。布尔型关联规则处理的值都是离散的、种类化的,它显示了这些变量之间的关系;而数值型关联规则可以和多维关联或多层关联规则结合起来,对数值型字段进行处理,将其进行动态的分割,或者直接对原始的数据进行处理,当然数值型关联规则中也可以包含种类变量。基于规则中数据的抽象层次,可以分为单层关联规则和多层关联规则。在单层的关联规则中,所有的变量都没有考虑到现实的数据是具有多个不同的层次的;而在多层的关联规则中,对数据的多层性已经进行了充分的考虑。基于规则中涉及到的数据的维数,关联规则可以分为单维的和多维的。在单维的关联规则中,我们只涉及到数据的一个维,如用户购买的物品;而在多维的关联规则中,要处理的数据将会涉及多个维。
Agrawal等于1993年首先提出了挖掘顾客交易数据库中项集间的关联规则问题,其核心方法是基于频集理论的递推方法。以后诸多的研究人员对关联规则的挖掘问题进行了大量的研究。他们的工作包括对原有的算法进行优化,如引入随机采样、并行的思想等,以提高算法挖掘规则的效率;提出各种变体,如泛化的关联规则、周期关联规则等,对关联规则的应用进行推广。
Agrawal等在1993年设计了一个基本算法,提出了挖掘关联规则的一个重要方法 — 这是一个基于两阶段频集思想的方法,将关联规则挖掘算法的设计可以分解为两个子问题:
1.找到所有支持度大于最小支持度的项集(Itemset),这些项集称为频集(Frequent Itemset)。
2.使用第1步找到的频集产生期望的规则。
这里的第2步相对简单一点。如给定了一个频集Y=I1I2...Ik,k³2,Ij∈I,产生只包含集合{I1,I2,...,Ik}中的项的所有规则(最多k条),其中每一条规则的右部只有一项,(即形如(Y-Ii)ÞIi,"1£i£k)。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。对于规则右部含两个以上项的规则,在其以后的工作中进行了研究。为了生成所有频集,使用了递推的方法。其核心思想如下:
L1 = {large 1-itemsets}; for (k=2; Lk-1¹F; k++) { Ck=apriori-gen(Lk-1); //新的候选集 for all transactions tÎD { Ct=subset(Ck,t); //事务t中包含的候选集 for all candidates cÎ Ct ) c.count++; } Lk={cÎ Ck |c.count³minsup} } Answer=ÈkLk; |
首先产生频繁1-项集L1,然后是频繁2-项集L2,直到有某个r值使得Lr为空,这时算法停止。这里在第k次循环中,过程先产生候选k-项集的集合Ck,Ck中的每一个项集是对两个只有一个项不同的属于Lk-1的频集做一个(k-2)-连接来产生的。Ck中的项集是用来产生频集的候选集,最后的频集Lk必须是Ck的一个子集。Ck中的每个元素需在交易数据库中进行验证来决定其是否加入Lk,这里的验证过程是算法性能的一个瓶颈。这个方法要求多次扫描可能很大的交易数据库,即如果频集最多包含10个项,那么就需要扫描交易数据库10遍,这需要很大的I/O负载。
Agrawal等引入了修剪技术(Pruning)来减小候选集Ck的大小,由此可以显著地改进生成所有频集算法的性能。算法中引入的修剪策略基于这样一个性质:一个项集是频集当且仅当它的所有子集都是频集。那么,如果Ck中某个候选项集有一个(k-1)-子集不属于Lk-1,则这个项集可以被修剪掉不再被考虑,这个修剪过程可以降低计算所有的候选集的支持度的代价。
基于Apriori的频集方法即使进行了优化,但是Apriori方法一些固有的缺陷还是无法克服:1) 可能产生大量的候选集。当长度为1的频集有10000个的时候,长度为2的候选集个数将会超过10M。还有就是如果要生成一个很长的规则的时候,要产生的中间元素也是巨大量的。2) 无法对稀有信息进行分析。由于频集使用了参数minsup,所以就无法对小于minsup的事件进行分析;而如果将minsup设成一个很低的值,那么算法的效率就成了一个很难处理的问题。以下两种方法,分别用于解决以上两个问题。
解决问题1的一种方法采用了一种FP-growth的方法。他们采用了分而治之的策略:在经过了第一次的扫描之后,把数据库中的频集压缩进一棵频繁模式树(FP-tree),同时依然保留其中的关联信息。随后我们再将FP-tree分化成一些条件库,每个库和一个长度为1的频集相关。然后再对这些条件库分别进行挖掘。当原始数据量很大的时候,也可以结合划分的方法,使得一个FP-tree可以放入主存中。实验表明,FP-growth对不同长度的规则都有很好的适应性,同时在效率上较之Apriori算法有巨大的提高。
第二个问题是基于这个的一个想法:apriori算法得出的关系都是频繁出现的,但是在实际的应用中,我们可能需要寻找一些高度相关的元素,即使这些元素不是频繁出现的。在apriori算法中,起决定作用的是支持度,而我们现在将把可信度放在第一位,挖掘一些具有非常高可信度的规则。对于这个问题的一个解决方法的整个算法基本上分成三个步骤:计算特征、生成候选集、过滤候选集。在三个步骤中,关键的地方就是在计算特征时Hash方法的使用。在考虑方法的时候,有几个衡量好坏的指数:时空效率、错误率和遗漏率。基本的方法有两类:Min_Hashing(MH)和Locality_Sensitive_Hashing(LSH)。Min_Hashing的基本想法是:将一条记录中的头k个为1的字段的位置作为一个Hash函数。Locality_Sentitive_Hashing的基本想法是:将整个数据库用一种基于概率的方法进行分类,使得相似的列在一起的可能性更大,不相似的列在一起的可能性较小。对这两个方法比较一下发现,MH的遗漏率为零,错误率可以由k严格控制,但是时空效率相对的较差。LSH的遗漏率和错误率是无法同时降低的,但是它的时空效率却相对的好很多。所以应该视具体的情况而定。最后的实验数据也说明这种方法的确能产生一些有用的规则。
【编辑推荐】