RevoScaleR中的rxDTree函数使用基于二进制的递归分区算法来匹配基于树的模型。得到的模型与推荐的R包rpart生成的模型相似。就像rpart一样,rxDTree也支持分类树和回归树;差异由响应变量的性质决定:一个因子响应生成一个分类树;数值响应生成回归树。
rxDTree算法
决策树是一种广泛应用于分类和回归的有效算法。构建决策树通常需要对所有连续变量进行排序,以便决定在何处分割数据。在处理大数据时,这个排序步骤会占用大量的时间和内存。为了克服排序障碍,人们提出了各种技术,这些技术大致可分为两类:执行数据预排序或使用数据的近似汇总统计。尽管预排序技术更接近于标准的决策树算法,但它们不能适应非常大的数据集。这些大数据决策树通常以各种方式并行化,以支持大规模学习:数据并行性水平或垂直地划分数据,以便不同的处理器可以看到不同的观察结果或变量,任务并行性在不同的处理器上构建不同的树节点。
rxDTree算法是一种具有水平数据并行性的近似决策树算法,特别适用于处理非常大的数据集。它使用直方图作为数据的近似紧凑表示,并以宽度优先的方式构建决策树。该算法可以在并行设置中执行,如多核机器或具有主从架构的分布式环境。每个worker只获得数据观察值的子集,但是可以看到到目前为止构建的完整树。它根据所看到的数据构建一个直方图,该直方图基本上将数据压缩到固定的内存中。然后,这个数据的近似描述被发送到一个主节点,通信复杂度不变,与数据集的大小无关。主节点集成从每个工作人员接收到的信息,并决定拆分哪个终端树节点以及如何拆分。由于直方图是并行构建的,因此即使对于非常大的数据集,也可以快速构建直方图。
使用rxDTree,您可以通过指定直方图的最大箱数来控制时间复杂度和预测精度之间的平衡。该算法构建的直方图在每个bin中观察到的数量大致相等,并将箱的边界作为候选分割为终端树节点。由于只检查了有限数量的分割位置,因此可能选择了一个次最优的分割点,从而导致整个树与用标准算法构造的树不同。然而,分析表明,即使两棵树不完全相同,并行树的错误率也接近串行树的错误率。您可以在直方图中设置箱的数量,以控制准确性和速度之间的权衡:大量的箱可以更准确地描述数据,从而获得更准确的结果,而少量的箱可以降低时间复杂度和内存使用量。
当箱数等于或超过观察数的整数预测器时,rxDTree算法产生与标准排序算法相同的结果。
一个简单的分类树
数据
kyphosis 数据集是从儿童接受外科脊柱矫正手术中来的,数据集有4列、81行(81个病例)。
kyphosis 数据集的各列含义
- Kyphosis:采取手术后依然出现脊柱后凸(驼背)的因子
- Age:单位是“月”
- Number:代表进行手术的脊柱椎骨的数目
- Start:在脊柱上从上往下数、参与手术的第一节椎骨所在的序号
# fit decision treekyphTree
根据我们对kyphosis 数据的了解,更多的椎体参与到手术中,术后并发症后凸的可能性似乎更大。同样,术后并发症后凸的可能性对年龄的依赖似乎是非线性的:它首先随年龄增长而增加,峰值在5-9岁之间,然后再次下降。
rxDTree模型似乎证实了Start < 8.5的早期结论,19个观察对象中有11个出现后凸,而29个Start >= 14.5的受试者中没有一个出现后凸。在剩下的33名受试者中,年龄是主要的分裂因素,正如我们之前所观察到的,5至9岁是发生后凸的最高概率。
返回的对象kyphTree是类rxDTree的一个对象。rxDTree类是在rpart类的基础上建模的,因此rxDTree类的对象具有rpart对象的最基本组件:frame、cptable、split等。然而,在默认情况下,rxDTree对象不会从类rpart继承。但是,您可以使用rxAddInheritance函数将rpart继承添加到rxDTree对象。
一个简单的回归树
数据
mtcars数据来源于1974年美国《汽车趋势》杂志,包括32辆汽车(1973-74型)的油耗和10个方面的汽车设计和性能。
一个包含11个变量的32个观察值的数据框架。
- 英里/加仑
- 圆筒数
- 位移(cuin .)
- 总马力
- 后桥比
- 重量(1000磅)
- 1/4英里的时间
- V/S
- 传输(0 =自动,1 =手动)
- 前向齿轮齿数
- 化油器的碳水化合物数
作为回归树的一个简单例子,考虑mtcars数据集,让我们使用排量(disp)作为预测因子来拟合油耗(mpg):
mtcarTree
大型汽车(发动机排量大于163.5立方英寸的汽车)和小型汽车之间存在明显的差异。
大数据树模型
数据
作为大型数据分类树的一个例子,考虑以下使用7%的完整航空公司数据子样本的简单模型(使用变量ArrDel15表示延迟15分钟或更长时间的航班)在这里下载数据:https://packages.revolutionanalytics.com/datasets/
# Large Data Tree Models bigDataDir
默认的cp等于0会产生大量的分割;指定cp = 1e-5会在这个模型中产生一组更易于管理的分割。
plot(createTreeView(airlineTree))
plot(airlineTree$cptable[,'nsplit'], airlineTree$cptable[,"xerror"], type='b', xlab="nsplit