今小弟遇难事,望众坛友众高手出谋划策,感激不尽。
这可能并不算是个sas问题,但需要一个解决方案,侧重点在于效率。
是个关于多随机决策树的实现方法。
随机决策树构造方法:
建立一定量的决策树,可以假设为10棵,每棵树对应随机选择的属性。每棵树具有权值。
计算每个叶子节点上的统计,求出叶子节点上的分布。树的深度为属性量的一半。
解释一下:数据集有n个自变量,随机取n/2个变量(不需要纠结n是奇数偶数,这里不是重点),每个变量事前都离散化了,然后根据随机变量维来构造树,由于对每个observation并不是取所有的维度,而是取一半的维度,所以势必不同的observation可能在这随机变量组合上会有重复,所以对树而言,在最后一层的节点上产生对响应变量的累计。因此在叶子节点上产生分布。
举个例子:
自变量:x1-x10,响应变量:y:binary
x1-x10随机取5个,假设x1-x5,原先是distinct的数据,因为维度的减少,所以会产生重复数据,因此在第五层的叶子节点上产生对应变量0值和1值的累计。树的深度自然也就是5。
这就是通过训练集得到多个同层随机决策树。
然后是分类算法:
待分类数据通过k棵经过训练的树输出此数据属于各类的概率。
接着上面的例子:
对待分类的一个observation,对于10棵树有10种随机变量组合,通过10棵树得到10个的分布,再根据权重计算得到分类概率。
数据是海量,所以效率影响主要是两方面:
1。生成树的效率
2。根据待分类寻找子节点的时间。
第一个问题,多个树的建立当然不能是串行,所以目前采取的方法是通过构造进程池来实现并行自动化,sas调度,个人认为已经较优。而建树算法采用,随机生成变量组合后加上响应变量,直接group by算count得到分布。不过训练集的增量问题无法通过也不可能通过每次对全量数据汇总来实现。所以这也是归于需要解决的问题之一。
第二个问题,就是分类数据如何快速根据路径找到节点。如果随机维过大,假设20个,对够大的树建造基于20个变量的联合索引也不现实,如果通过对子节点计算编号也不合理,因为需要考虑训练集增量该如何计算,而编号的数量级过大又该如何处理,假设20个变量,每个变量3个值,其最后一层节点量就是3^20,对其编号有点困难。其海量的索引,对更海量的应用似乎也无济于事。
树节点分布也可能面临sparsity,稀疏度,如果树的深度过深,节点的分布显然更容易稀疏,而数据量过小,稀疏度也会增大,且同层的稀疏度也并不均匀。
考虑解决方向可能通过树的结构改变来实现,不过由于同层节点中具有重复值的节点,因此树的结构若采用经典子节点——父节点数据结构貌似也比较困难。
各位高手有啥说啥,集思广益。谢谢。
附件列表