使用随机森林模型提高预测新数据的速度

Posted

技术标签:

【中文标题】使用随机森林模型提高预测新数据的速度【英文标题】:Improving the speed of predicting new data using a Random Forest Model 【发布时间】:2014-07-28 06:49:41 【问题描述】:

我正在使用随机森林生成物种分布模型。这些模型试图根据各种环境属性预测一个物种发生的概率。对于大多数物种,我们的初始潜在预测变量集介于 10 到 25 个之间,每个预测变量都由一个包含 460,000,000 个像元的 GIS 栅格文件表示。由于训练数据的性质,我不会在这里详细介绍,我实际上是在基于数据子集构建多个 RF 模型(大约 10 到 100+),然后结合起来为每个物种创建我的整体模型.实际上构建模型花费的时间相对较少(通常几分钟或更短),但使用 predict 函数基于此模型生成预测概率的栅格层可能需要 20 多个小时。我怀疑这个漫长的过程大部分是由于读取/写入大型光栅文件,瓶颈可能是硬盘读取/写入速度。

为了提供更多细节...一旦我有了训练有素的模型,我将通过 raster 包创建代表预测层的层的栅格堆栈,然后使用 predict() 预测该堆栈光栅包中的函数。我有一个相当强大的桌面(Core i7,3.5GHz,w/32 GB RAM),输入和输出光栅文件在本地硬盘上,而不是通过网络移动。我看到 mbq 的回答 here 提供了关于使用 randomForest 加速模型生成的有用建议,并且正在寻找类似的建议来加速预测操作。我能想到许多可能有帮助的事情(例如,种植少量的树,使用其中一个库进行并行处理),我计划在时间允许的情况下测试这些,但它是如果问题主要是读写瓶颈,我不清楚这些是否会产生重大影响。我将不胜感激任何建议。

【问题讨论】:

我只是提供一个轶事,以这种方式在栅格上进行数学运算非常慢,所以这可能确实是您的问题。 怎么样:blog.mckuhn.de/2013/09/… 我确实看到了有关 parallelRandomForest 的帖子。它似乎只支持回归,而不是分类。此外,目前尚不清楚这是否真的会加快预测速度,因为重点似乎是在训练上。读/写速度可能仍然存在瓶颈。 【参考方案1】:

您可以查看mctune function here。这使用 e1071 包来找到最佳参数。但是,您可以对其进行调整以满足您的需求。

  source( './mctune.R')
  rf_ranges = list(ntree=c(seq(1,1000,100),seq(1000,8000,500)),
  mtry=seq(5,15,2))

  set.seed(10)
  tuned.rf = mctune(method = randomForest, train.x = formula1, 
  data = dataframe, tunecontrol = tune.control(sampling = "cross",cross = 5),   
  ranges=rf_ranges,mc.control=list(mc.cores=16, mc.preschedule=T),confusionmatrizes=T )
  save(tuned.rf, file = paste('./tuned_rf.RData',sep='') )

  tuned.rf$best.model
  plot(tuned.rf)

另一个选项可能是使用 doparallel 包中的 foreach (see here)。您可以将每个数据子集(用于新的 RF 模型)分配给每个内核:

RF_outputs = foreach(i=1:length(yourdatasubsets), .inorder=F, .package=c(randomForest)) %dopar% 
    set.seed(10)
    rf <- randomForest(formula, data=na.omit(yourdatasubsets[i]), ntree=2000, proximity=T)
    return(rf)
 

每个经过训练的 RF 模型都将作为 RF_outputs 列表的一部分返回给您。所以RF_outputs[[1]] 将是您的第一个训练有素的 RF 模型。

【讨论】:

以上是关于使用随机森林模型提高预测新数据的速度的主要内容,如果未能解决你的问题,请参考以下文章

r 随机森林错误 - 新数据中的预测变量类型不匹配

有没有办法在 Android 上使用随机森林模型进行预测?

将随机森林预测作为列添加到测试文件中

sklearn之随机森林

如何将经过训练和测试的随机森林模型应用于 tidymodels 中的新数据集?

来自 scikit-garden 的分位数随机森林的预测速度非常慢