220 likes | 428 Views
RainForest —— 雨林算法框架 大数据集决策树快速生成框架 报告人:李岱 2003.4.5. 决策树简介. 略. Sprint 算法的缺点. 为每个 node 都保存属性表,这个表的大小有可能是数据库中原始数据大小的好几倍。 维护每个 node 属性表的 hash 表的开销很大 ( 该表的大小与该 node 所具有的纪录成正比 ) 。. 雨林算法框架综述. 过去的研究提出了多种决策树算法,但是到目前为止并没有一种算法在任何数据集合下生成决策树的质量方面超过所有其他的算法
E N D
RainForest ——雨林算法框架 大数据集决策树快速生成框架 报告人:李岱 2003.4.5
决策树简介 • 略
Sprint算法的缺点 • 为每个node都保存属性表,这个表的大小有可能是数据库中原始数据大小的好几倍。 • 维护每个node属性表的hash表的开销很大(该表的大小与该node所具有的纪录成正比)。
雨林算法框架综述 • 过去的研究提出了多种决策树算法,但是到目前为止并没有一种算法在任何数据集合下生成决策树的质量方面超过所有其他的算法 • 雨林算法框架关注于提高决策树算法的伸缩性,该框架可运用于大多数决策树算法(例如Sprint和SLIQ) ,使算法获得的结果与将全部的数据放置于内存所得到的结果一致,但是在运行时可以使用较少的内存。而在内存一定的情况下,也可以更好的满足算法的需求。 • 生成的决策树的质量取决于具体的决策树算法,于本框架无关。
雨林算法框架 • 数据结构: • AVC-set:节点n包含的所有纪录在某个属性上的投影,其中该AVC-set包括了属性的不同值在每个类别上的计数。 • AVC-group:一个节点n上所有的AVC -set的集合 • AVC-set的所占内存的大小正比于对应属性的不同值个数,AVC-group并不是数据库信息的简单的压缩,它只是提供了建立决策树需要的信息, AVC-group所占用的内存空间远远小于数据库所实际占用的空间。
雨林算法框架 • 设计方案: • AVC_set { //存储属性的各个值 DistinctValue[] //存储属性各个值在某个类上对应的计数 DistinctValueCountForClassA[] DistinctValueCountForClassB[] … … } • AVC_group { //节点n中的每个属性的avc_set AVC_set[] }
自顶向下决策树算法 BuildTree(Node m,datapatition D,algorithm decisionTree) • 对D使用决策树算法decisionTree得到分裂指标crit(n) • 令k为节点n的子节点个数 • if(k>0) • 建立n的k个子节点c1,…,ck • 使用最佳分割将D分裂为D1,…,Dk • for(i=1;i<=k;i++) • BuildTree(ci,Di) • endfor • endif RainForest 算法框架重新定义的部分: 1a) for 每一个属性的谓词p,寻找最佳的分割 1b) decisionTree.find_best_partitioning(AVC-set of p) 1c) endfor 2a) k= decisionTree.decide_splitting_criterion();//决定最终的分割
算法分析 • 对于(1a)-(1c)所需要的内存为该谓词p所有的avc-set中间占有的最大内存。 • 在(2a)中,使用的输入是由(1a)-(1c)所计算出来的结果,这里所占用的内存时很小的 • 针对上述情况,我们假定现实运行的情况下,一个节点的整个avc-group都可以放在内存中,或者至少一个节点的每一个独立的谓词的avc-set可以放在内存中。
雨林算法的常规过程 • 建立节点的AVC-group (通过读取整个原始数据库或者某个分支的数据库表或文件) • 选择分裂属性和分裂标准:取决于使用雨林算法框架的具体算法,通过逐一检查AVC-set来选择。 • 将数据分解到各个子节点:必须读取整个数据集(数据库或文件),将各条数据分解到各个子节点中,此时如果有足够的内存,我们将建立一个或多个子节点的AVC-group
算法综述 • 算法RF-Write,RF-Read,RF-Hybrid适用于整个根节点的AVC-group都可以放置到内存中的情况,RF-Vertical用于根节点(即一个节点)的AVC-group不能够存放到内存中的情况。 • 本文假定任何一个属性的AVC-set都可以 放在内存中。
算法RF-Write • 检索数据库,建立根节点的AVC-group • 调用某个决策树算法以AVC-group为参数选择分裂标准,建立根节点的k个子节点 • 检索数据库(或文件),将每一条纪录t分配到各个分支当中(纪录于数据库或文件) • 将该算法递归的应用于每一个分支 • 注:对于决策树的每一层,算法读取数据库两次,并写数据库一次。
算法RF-Read • 检索数据库,建立根节点的AVC-group • 调用决策树算法以AVC-group为参数选择分裂标准,建立根节点的k个子节点 • 如果此时具有足够的内存容纳新的子节点的AVC -group,则此时对数据库进行一次检索,根据分裂标准将子节点的AVC-group计算出来,并放置于内存中,并调用决策树算法计算分裂标准。 • 使用相同的方法处理树的每一层,只要有足够的内存容纳新节点的AVC-group,就将所有子节点的AVC-group计算出来。
算法RF-Read(续) • 假设在某一层所有新节点的AVC-group所占内存的大小超过了可用内存,此时我们可将新节点集分成多个子集,其中每个子集都可以放入内存之中。每个子集被独立计算,每次计算时需要读取一次数据库从而建立该子集的AVC-group。 • 随着层数的增加,通常每层节点的AVC-group所占用的内存也会增加。从而每层的节点子集个数也会相应增加,所以随着树的层数增加,每层所需要访问数据库的次数也是增加的。所以单独运行该算法是低效的。
混合算法RF-Hybrid • 大致流程:开始使用RF-Read的算法,直到到达某层L所有的新节点AVC-group总和不适合在内存中,此时切换到RF-Write: 建立m个分支,并检索m个分支的database D,递归应用于每个节点,直到算法完成。该算法比RF-Write效率高,而且比RF-Read使用更少的数据库检索次数。 • 算法改进:在使用RF-write时,此时系统中可能还有一部分内存可以使用。为了尽量使用可用的内存,选择一个N的子集M,将所有M中的节点的AVC-group计算出来并存放到内存中,对于该子集m中的每一个节点,节省了写其分支的以及扫描该分支建立AVC-group所需要的开销。 • 选择子集的过程:取决于可用内存的大小和每个节点的AVC-group的大小。这是一个背包问题(NP问题)。在本算法中获得近似最大受益,从而提高算法的效率。
算法RF-Vertical • 用于根节点(或者某一个节点)的AVC_group不能够存放到内存,但是每一个AVC-set可以放在内存中的情况。 • 将属性值分为两个部分: • 1.Plarge={a1,...,av},任何一个属性的AVC-set可以被放入内存中,但是其中的任意两个属性的AVC-set不能被同时放入内存中。 • 2.Psmall={av+1,....,am} • 处理策略: • 对于Psmall按照普通的方法进行处理, • 对于Plarge建立一个临时文件Zn,其中包含有纪录在属性a1,...,av的投影信息和类标记,对该临时文件进行v次遍历,每次都检查一次最优分裂,当v次遍历进行完后,就选出了最佳分裂方式,此时调用分裂函数,按照最佳分裂标准分裂该节点。
估算Avc-Group的大小 • 虽然节点的父节点包含的记录个数要远大于该节点包含的记录个数,但是算法采用保守的估计方法,认为子节点的AVC-group的大小和它的父节点相同。(在应用中证明效果较好)
与sprint算法的比较:(产生较大决策树时的情形)与sprint算法的比较:(产生较大决策树时的情形)
结论 • 本算法框架主要是为了提高程序的可伸缩性,其主要思想在于观察到各种已有的决策树算法分裂节点的标准只是依赖每个节点的AVC-group,它通常远小于原始数据库的大小。使用AVC-group可以大大提高算法的可伸缩性。