哪些因素会影响内存消耗?
是树的数量(n_estimators)还是训练数据的数据记录数或其他?
哪些因素会影响内存消耗?
是树的数量(n_estimators)还是训练数据的数据记录数或其他?
森林中的数据量和树木数量都会占用内存。
对于您拥有的数据量,这很明显它占用存储空间的原因 - 它是数据,因此您拥有的数据越多,它在内存中占用的空间就越大。如果您的数据集太大,您甚至可能无法将其全部读入内存 - 它可能需要留在磁盘上进行训练(我认为 scikit 不支持这一点)。
对于树的数量,每棵生长的树都在随机特征的子集上进行训练(这样森林可以避免方差并避免所有树以相同的方式生长)。一旦森林被训练,模型对象将拥有每棵树的信息——它的决策路径、分割节点、阈值等。这是信息,你拥有的信息越多,它需要的存储空间就越多。因此更多的树=更多的信息=更多的内存使用。
还有其他因素决定了模型对象(经过训练的森林)将占用多少内存;例如,max_depth
它设置了任何树可以增长到的最大层数/级别。如果它很大,树会长得更深,因此模型对象会更大,因此需要更多的存储空间。不过,这不应该太大,以避免过度拟合。
主要因素是数据集中的属性(特征)数量和森林中的树木数量。更多属性意味着更多层(每个属性一个)。您是否修剪树木以减少它们的深度(以及它们的方差)?
随机森林的内存使用取决于单个树的大小和树的数量。要控制 RF 的内存大小,您可以:
来自 scikit-learn 的随机森林的默认超参数设置为构建完整的树,在复杂数据集的情况下它可能非常深。
我正在运行实验,在成人收入数据集上训练 RF(约 3.8MB 数据;32,561 行和 15 列)。该数据集上的完整树的深度约为 42(平均而言,取决于袋装样本)。保存到硬盘的单个树的大小约为 0.5 MB。保存整个随机森林大约是 50 MB。
当我将单棵树的大小限制max_depth
为时,6
保存到磁盘的单棵树的大小为 ~ 0.01
MB,整个随机森林保存到磁盘占用 ~ 0.75
MB,这66
比 RF 将完整的树少了几倍!
有趣的部分是我减少了内存消耗,而性能提高了4%
:)
森林中单棵树的大小也可以用其他参数控制:min_samples_split
, min_samples_leaf
, min_weight_fraction_leaf
, max_features
, max_leaf_nodes
. 对我来说,'max_depth
是最直观的。