Skip to content

在大型数据集上训练随机森林

Train Random Forest on Large Datasets

大多数经典 ML 算法无法用批处理实现来训练。这把它们的使用限制在只有小/中等规模的数据集上。例如,下面是支持批处理 API 的 sklearn 实现列表:

ds p279 1

它相当少,不是吗?这令人担忧,因为在企业环境中,数据主要是表格形式的。经典 ML 技术,例如基于树的集成方法(ensemble methods),常被用于建模。然而,这些模型的典型实现并不“对大数据友好”,因为它们要求整个数据集都驻留在内存中。

ds p279 2

有两种方法来应对:1. 使用像 Spark MLlib 这样的大数据框架来训练它们。2. 还有一种方法,是 Gilles Louppe 博士在他的博士论文——《理解随机森林》(Understanding Random Forests)中讨论的。他的提议如下。

在解释之前,请注意这种方法只在集成(ensemble)设置下才有效。所以你需要训练多个模型。其思想是对随机数据块(行和列)进行采样,并在其上训练一个树模型。

ds p280 1

通过随机生成不同的数据块多次重复这一步骤,即可得到整个随机森林模型。效果如何?该论文在 13 个数据集上给出了许多基准测试(如需更多细节,请查看第 174 页和第 178 页),结果如下:

ds p280 2

从左到右依次为:第一个、第 8 个、第 9 个、若干运行时间结果、全局、在较高情况下额外付出的代价,以及最后一个。

从上图可以清楚地看出,在大多数情况下,随机块方法的表现优于传统随机森林。在其他情况下,性能没有显著差异。这就是我们如何在无法装入内存的大型数据集上训练随机森林模型。

虽然论文没有给出其背后清晰的直觉,但我能理解为什么这种方法会和随机森林一样有效。简而言之,构建尽可能不同的树能保证方差有更大的降低。在这种情况下,任意两棵树之间的数据集重叠预计不会像典型随机森林那样大。这有助于实现装袋(bagging)的目标。

本站内容仅供学习交流,版权归原作者所有。