2

我有一个数据集,其中包含 500,000 个事件和竞争风险以及事件发生时间变量(生存分析)的观察结果。

我想运行一个生存随机森林

R 包randomForestSRC非常适合它,但是,由于内存限制(100'000 使用 40GB 的 RAM),即使我将预测变量的数量限制为 15 到 20,也不可能使用超过 100,000 行。

我很难找到解决方案。有人有推荐吗?

我看了看h2ospark mllib两者都不支持生存随机森林

理想情况下,我正在寻找一种基于 R 的解决方案,但如果有人知道使用大数据 + 竞争风险随机森林的方法,我很乐意探索其他任何东西。

4

1 回答 1

2

通常,RF-SRC 数据集的内存配置文件在 64 位机器上为 nxpx 8。当 n=500,000 和 p=20 时,RAM 使用量约为 80MB。这并不大。

您还需要考虑森林的大小 $nativeArray。默认节点大小 = 3,您将拥有 n / 3 = 166,667 个终端节点。为方便起见假设对称树,肛门内部/外部节点的总数大约为 2 * n / 3 = 333,333。默认 ntree = 1000,假设没有因子,$nativeArray 的维度为 [2 * n / 3 * ntree] x [5]。一个简单的示例将向您展示为什么我们在 $nativeArray 中有 [5] 列来标记拆分参数和拆分值。因此,森林的内存使用量将为 2 * n / 3 * ntree * 5 * 8 = 1.67GB。

所以现在我们正在处理一些严重的内存使用问题。

接下来考虑合奏。您还没有说在竞争风险数据集中有多少事件,但为了简单起见,我们假设有两个。

这里的大数组是特定原因的风险函数 (CSH) 和特定原因的累积发生率函数 (CIF)。这些都是维度 [n] x [time.interest] x [2]。在最坏的情况下,如果您的所有时间都是不同的,并且没有审查事件,则 time.interest = n。所以这些输出中的每一个都是 n * n * 2 * 8 字节。这会炸毁大多数机器。你的敌人是时间利益。在 big-n 情况下,您需要将 time.interest 向量限制为实际事件时间的子集。这可以通过参数 ntime 来控制。

从文档中:

ntime:用于生存家庭的整数值,用于将集成计算约束到不超过 ntime 个时间点的时间值网格。或者,如果提供了长度大于 1 的值向量,则假定这些是用于约束计算的时间点(请注意,使用的约束时间点将是最接近用户提供的时间点的观察事件时间)。如果未指定任何值,则默认操作是使用所有观察到的事件时间。

我的建议是从一个非常小的 ntime 值开始,只是为了测试是否可以毫无问题地完整分析数据集。然后逐渐增加它并观察您的 RAM 使用情况。请注意,如果您缺少数据,则 RAM 使用量会大得多。另请注意,我没有提到其他数组,例如也会导致大量 RAM 使用的终端节点统计信息。我只考虑了集成,但实际情况是每个终端节点将包含维度为 [time.interest] x 2 的数组,用于创建森林集成的 CSH 和 CIF 的节点特定估计器。

将来,我们将实施一个大数据选项,该选项将抑制集成并优化包的内存配置文件,以更好地适应 big-n 场景。同时,您必须努力使用现有的选项,如 ntree、nodesize 和 ntime,以减少 RAM 使用量。

于 2018-01-24T15:27:21.957 回答