随机森林算法的优化实现

机器算法验证 随机森林 算法 模型评估
2022-02-11 10:58:24

我注意到有一些随机森林的实现,例如 ALGLIB、Waffles 和一些 R 包,如randomForest. 谁能告诉我这些库是否经过高度优化?它们基本上等同于统计学习要素中详述的随机森林,还是添加了很多额外的技巧?

我希望这个问题足够具体。作为我正在寻找的答案类型的说明,如果有人问我线性代数包 BLAS 是否高度优化,我会说它是高度优化的,除了非常专业的应用程序之外,几乎不值得尝试改进。

4个回答

(2015 年 6 IX 更新了评论中的建议,也做了 CW)

R 有两个新的很好的包,它们针对特定条件进行了很好的优化:

  • ranger -- C++,R 包,针对问题进行了优化,并行,GWAS 数据的特殊处理。p>>n
  • ArboristPython 绑定,针对大型问题进行了优化,显然计划用于 GPGPU。n

其他射频实现:

  • 原始版本 ——独立的 Fortran 代码,不是并行的,很难使用。
  • randomForest -- C、R 包,可能是最流行的,不是并行的,与单核速度相比实际上相当快,尤其是对于小数据。
  • randomForestSRC -- C、R 包,randomForest 的克隆,支持并行处理和生存问题。
  • 派对——C、R 包,相当慢,但设计为用于试验 RF 的平面。
  • bigrf - C+/R,R 包,专为在bigmemory 框架内处理大数据而构建;远未完成。
  • scikit learn Ensemble forest -- Python,scikit-learn 框架的一部分,并行,实现了 RF 的许多变体。
  • milk的 RF -- Python,牛奶框架的一部分。
  • 所谓的WEKA rf ——Java/WEKA,并行。
  • 阿尔格利布
  • rt-rank——放弃了?

Ranger 论文有一些速度/内存比较,但没有彻底的基准测试。

据我所知,randomForest 的 R 版本调用与原始版本相同的 Fortran 代码。此外,并行化 randomForest 函数也很简单。它实际上是foreach 文档中提供的示例之一。

library(foreach)
library(randomForest)
rf <- foreach(ntree = rep(250, 4), .combine = combine, .packages = "randomForest") %dopar% 
randomForest(x, y, ntree = ntree)

鉴于随机森林具有令人尴尬的并行性,您可以进行的最大优化就是并行运行它们。在那之后,我认为算法中没有其他容易实现的成果,但我可能是错的。

唯一的问题是您丢失了组合森林中的袋外误差估计,但可能有一种简单的计算方法(我实际上很想知道如何做到这一点)。

ELSII使用了 randomForest参见例如脚注 3 p.591),它是Salford的 Breiman 和 Cutler 的Fortran 代码的 R 实现。Andy Liaw 的代码是 C 语言。

派对包(C 语言)中提出了另一种 RF 实现,它依赖于 R/Lapack,它对 BLAS 有一些依赖关系(参见/include/R_ext/Lapack.h你的基本 R 目录)。

就bagging而言,并行化应该不会太难,但我会让更专业的用户回答这方面的问题。

randomJungle 背后的团队声称它比 R randomForest 实现快一个数量级,并且使用更少的内存。正在为 R 开发 randomJungle 包,但我还不能构建。

https://r-forge.r-project.org/projects/rjungler/