我有一个数据集,包含500,000个事件和竞争风险以及事件发生时间变量(生存分析)。
我想运行生存随机森林。
R-package randomForestSRC
非常适合它,但是,由于内存限制(100'000使用40GB内存),不可能使用超过100,000行,即使我将预测数量限制为15至20岁。
我很难找到解决方案。有人有推荐吗?
我查看了h2o
和spark mllib
,两者都不支持生存随机森林。
理想情况下,我正在寻找一种基于R的解决方案,但如果有人知道使用大数据+竞争风险随机森林的方法,我很乐意探索其他任何内容。
答案 0 :(得分:1)
通常,在64位计算机上,RF-SRC数据集的内存配置文件为n x p x 8。当n = 500,000且p = 20时,RAM使用率约为80MB。这不是很大。
您还需要考虑林的大小$ nativeArray。使用默认的nodesize = 3,您将有n / 3 = 166,667个终端节点。为方便起见假设对称树,基因/外部节点的总数大约为2 * n / 3 = 333,333。使用默认的ntree = 1000,并且假设没有因子,$ nativeArray将具有维度[2 * n / 3 * ntree] x [5]。一个简单的例子将向您展示为什么我们在$ nativeArray中有[5]列来标记split参数和split值。因此,森林的内存使用量为2 * n / 3 * ntree * 5 * 8 = 1.67GB。
所以现在我们正在进行一些严肃的内存使用。
接下来考虑一下合奏。您还没有说过您在竞争风险数据集中有多少事件,但我们假设有两个简单。
这里的大阵列是原因特异性危险函数(CSH)和特定原因累积发生率函数(CIF)。这些都是维[n] x [time.interest] x [2]。在最坏的情况下,如果所有时间都不同,并且没有审查事件,则time.interest = n。所以这些输出中的每一个都是n * n * 2 * 8字节。这会炸毁大多数机器。这是时间。感兴趣是你的敌人。在大n情况下,您需要将time.interest向量约束为实际事件时间的子集。这可以使用参数ntime控制。
来自文档:
ntime:用于生存族的整数值,用于将整体计算约束到不超过ntime时间点的时间值网格。或者,如果提供长度大于1的值的向量,则假设这些是用于约束计算的时间点(请注意,所使用的约束时间点将是最接近用户提供的时间点的观察事件时间) )。如果未指定任何值,则默认操作是使用所有观察到的事件时间。
我的建议是从一个非常小的ntime值开始,只是为了测试数据集是否可以完整地分析而没有问题。然后逐渐增加它并观察你的RAM使用情况。请注意,如果您缺少数据,则RAM使用量会大得多。另请注意,我没有提到其他阵列,例如终端节点统计信息,这也会导致大量RAM使用。我只考虑了合奏,但实际情况是每个终端节点将包含维度[time.interest] x 2的数组,用于创建森林集合的CSH和CIF的节点特定估计。
将来,我们将实施一个大数据选项,该选项将抑制合并并优化包的内存配置文件,以更好地适应大n场景。与此同时,您必须努力使用ntree,nodesize和ntime等现有选项来减少RAM使用量。