我注意到有一些随机森林的实现,例如 ALGLIB、Waffles 和一些 R 包,如randomForest
. 谁能告诉我这些库是否经过高度优化?它们基本上等同于统计学习要素中详述的随机森林,还是添加了很多额外的技巧?
我希望这个问题足够具体。作为我正在寻找的答案类型的说明,如果有人问我线性代数包 BLAS 是否高度优化,我会说它是高度优化的,除了非常专业的应用程序之外,几乎不值得尝试改进。
我注意到有一些随机森林的实现,例如 ALGLIB、Waffles 和一些 R 包,如randomForest
. 谁能告诉我这些库是否经过高度优化?它们基本上等同于统计学习要素中详述的随机森林,还是添加了很多额外的技巧?
我希望这个问题足够具体。作为我正在寻找的答案类型的说明,如果有人问我线性代数包 BLAS 是否高度优化,我会说它是高度优化的,除了非常专业的应用程序之外,几乎不值得尝试改进。
(2015 年 6 IX 更新了评论中的建议,也做了 CW)
R 有两个新的很好的包,它们针对特定条件进行了很好的优化:
其他射频实现:
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 包,但我还不能构建。