我在训练数据上训练随机森林,这些数据有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)
我想知道我该怎么做才能避免这个错误?我应该用更少的数据训练吗?但当然,这不会很好。有人可以提出一个替代方案,我不必从训练数据中获取更少的数据。我想使用完整的培训数据。
答案 0 :(得分:10)
如前一个问题(我现在无法找到)的回答中所述,增加样本大小会以非线性方式影响RF的内存需求。模型矩阵不仅更大,而且每棵树的默认大小(基于每片叶子的点数)也更大。
为了适应内存限制的模型,您可以执行以下操作:
将nodesize
参数增加到大于默认值的值,即回归RF为5。通过114k观测,你应该能够在不影响性能的情况下显着增加这一点。
使用ntree
参数减少每个RF的树数。安装几个小RF,然后将它们与combine
组合以生成整个森林。
答案 1 :(得分:3)
如果您不能使用具有更多内存的计算机,您可以尝试的另一种方法是:在数据的子集上训练单独的模型(比如10个单独的子集),然后以合理的方式组合每个模型的输出(最简单的方法)这样做的方法是平均10个模型的预测,但还有其他方法来集合模型http://en.wikipedia.org/wiki/Ensemble_learning)。
从技术上讲,您将使用所有数据而不会遇到内存限制,但根据数据生成子集的大小,生成的模型可能太弱而无法使用。