在R中,随机森林算法是否存在训练数据大小的限制?

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
您的数据太大,无法放入内存中。因此:1)购买更多内存;2)将数据分割成多个部分并训练多个模型,最终预测结果可以计算所有模型输出的平均值(在主要分类方面采用投票方式)。 - DrDom
对于大型数据集,h20显然是最佳选择,http://www.r-bloggers.com/benchmarking-random-forest-implementations/,你也可以使用R中的library(h2o)。 - Tom Wenseleers
或者使用 xgboost,你也可以在 R 中使用 library(xgboost)。 - Tom Wenseleers
2个回答

10

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

为了适应您的内存限制,您可以执行以下操作:

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

  2. 通过减少RF中的树数,使用ntree参数。拟合几个小的RF,然后使用combine将它们组合成整个森林。


3
如果您无法使用具有更多内存的计算机,则可以尝试一种替代方法:在数据的不同子集上训练单独的模型(比如10个子集),然后以明智的方式组合每个模型的输出结果(最简单的方法是对10个模型的预测结果进行平均,但也有其他方式来集成模型,详情请参考http://en.wikipedia.org/wiki/Ensemble_learning)。技术上说,您将使用所有数据而没有触及内存限制,但是由于产生的数据子集大小不同,因此得到的模型可能太弱而无法实用。

5
随机森林的一个好处是不需要把数据切片来适应减小模型。因为RF只是独立树的集合,你可以在完整数据集上拟合较少数量的树,而不是在数据子集上拟合固定数量的树。然后将各个子森林组合,就能够得到完整的森林,而不会有任何信息损失。 - Hong Ooi
@HongOoi,这似乎是一个不错的策略,你能提供更详细的例子来说明如何使用它吗? - David Leal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接