5

我正在使用具有 114954 行和 135 列(预测变量)的训练数据训练随机森林。我收到以下错误。

model <- randomForest(u_b_stars~. ,data=traindata,importance=TRUE,do.trace=100, keep.forest=TRUE, mtry=30)

Error: cannot allocate vector of size 877.0 Mb
In addition: Warning messages:
1: In randomForest.default(m, y, ...) :
The response has five or fewer unique values.  Are you sure you want to do regression?
2: In matrix(double(nrnodes * nt), ncol = nt) :
Reached total allocation of 3958Mb: see help(memory.size)
3: In matrix(double(nrnodes * nt), ncol = nt) :
Reached total allocation of 3958Mb: see help(memory.size)
4: In matrix(double(nrnodes * nt), ncol = nt) :
Reached total allocation of 3958Mb: see help(memory.size) 
5: In matrix(double(nrnodes * nt), ncol = nt) :
Reached total allocation of 3958Mb: see help(memory.size)

我想知道我该怎么做才能避免这个错误?我应该用更少的数据训练它吗?但这当然不好。有人可以提出一个替代方案,我不必从训练数据中提取更少的数据。我想使用完整的训练数据。

4

2 回答 2

10

正如对上一个问题(我现在找不到)的回答中所述,增加样本量会以非线性方式影响 RF 的内存需求。不仅模型矩阵更大,而且每棵树的默认大小(基于每片叶子的点数)也更大。

要在给定内存限制的情况下拟合模型,您可以执行以下操作:

  1. nodesize参数增加到比默认值更大的值,对于回归 RF,默认值是 5。使用 114k 观察值,您应该能够显着增加此值而不会影响性能。

  2. 使用参数减少每个 RF 的树数ntree。安装几个小型 RF,然后将它们组合起来combine以生成整个森林。

于 2013-08-04T06:31:15.017 回答
3

如果您不能使用具有更多内存的机器,您可以尝试的一种替代方法是:在数据子集(例如 10 个单独的子集)上训练单独的模型,然后以合理的方式组合每个模型的输出(最简单的方法)这是对 10 个模型的预测进行平均,但还有其他方法可以集成模型(http://en.wikipedia.org/wiki/Ensemble_learning)。

从技术上讲,您将使用所有数据而不会遇到内存限制,但根据结果数据子集的大小,结果模型可能太弱而无法使用。

于 2013-08-03T18:56:53.520 回答