RandomForest - 内存使用/消耗的原因?

数据挖掘 Python scikit-学习
2021-09-24 18:02:30

哪些因素会影响内存消耗?

是树的数量(n_estimators)还是训练数据的数据记录数或其他?

3个回答

森林中的数据量树木数量都会占用内存。

对于您拥有的数据量,这很明显它占用存储空间的原因 - 它是数据,因此您拥有的数据越多,它在内存中占用的空间就越大。如果您的数据集太大,您甚至可能无法将其全部读入内存 - 它可能需要留在磁盘上进行训练(我认为 scikit 不支持这一点)。

对于树的数量,每棵生长的树都在随机特征的子集上进行训练(这样森林可以避免方差并避免所有树以相同的方式生长)。一旦森林被训练,模型对象将拥有每棵树的信息——它的决策路径、分割节点、阈值等。这是信息,你拥有的信息越多,它需要的存储空间就越多。因此更多的树=更多的信息=更多的内存使用。

还有其他因素决定了模型对象(经过训练的森林)将占用多少内存;例如,max_depth它设置了任何树可以增长到的最大层数/级别。如果它很大,树会长得更深,因此模型对象会更大,因此需要更多的存储空间。不过,这不应该太大,以避免过度拟合。

主要因素是数据集中的属性(特征)数量和森林中的树木数量更多属性意味着更多层(每个属性一个)。您是否修剪树木以减少它们的深度(以及它们的方差)?

随机森林的内存使用取决于单个树的大小和树的数量。要控制 RF 的内存大小,您可以:

  • 限制树的数量(依赖几乎是线性的),
  • 限制一棵树的大小

来自 scikit-learn 的随机森林的默认超参数设置为构建完整的树,在复杂数据集的情况下它可能非常深。

我正在运行实验,在成人收入数据集上训练 RF(约 3.8MB 数据;32,561 行和 15 列)。该数据集上的完整树的深度约为 42(平均而言,取决于袋装样本)。保存到硬盘的单个树的大小约为 0.5 MB。保存整个随机森林大约是 50 MB。

当我将单棵树的大小限制max_depth为时,6保存到磁盘的单棵树的大小为 ~ 0.01MB,整个随机森林保存到磁盘占用 ~ 0.75MB,这66比 RF 将完整的树少了几倍!

有趣的部分是我减少了内存消耗,而性能提高了4%:)

森林中单棵树的大小也可以用其他参数控制:min_samples_split, min_samples_leaf, min_weight_fraction_leaf, max_features, max_leaf_nodes. 对我来说,'max_depth是最直观的。