为什么scikit-learn的随机森林使用的内存如此之多?

8

我正在使用scikit的随机森林算法实现:

sklearn.ensemble.RandomForestClassifier(n_estimators=100, 
                                        max_features="auto", 
                                        max_depth=10)

在调用rf.fit(...)之后,进程的内存使用量增加了80MB,即每棵树增加0.8MB(我还尝试了许多其他类似结果的设置。我使用toppsutil监视内存使用情况)。
深度为10的二叉树应最多具有2^11-1 = 2047个元素,这些元素都可以存储在一个密集数组中,从而使程序员能够轻松查找任何给定元素的父级和子级。
每个元素需要使用在分裂中使用的特征的索引和截止值,或者是6-16字节,这取决于程序员的经济性。 在我的情况下,这相当于每棵树0.01-0.03MB
为什么scikit的实现使用20-60倍的内存来存储随机森林的树?
1个回答

11
每个决策(非叶)节点存储左右分支的整数索引(2 x 8 字节),用于分裂的特征的索引(8 字节),用于决策特征的阈值的浮点值(8 字节),以及不纯度减少值(8 字节)。此外,叶子节点存储叶子预测的恒定目标值。
您可以查看源代码中的Cython类定义以了解详细信息。 (参考链接)

如果我使用10个估计器(默认值)对某些数据进行训练,则使用约2.2 GB内存,如果我使用200个估计器对相同的数据进行训练,则内存使用量也约为2.2GB。您知道为什么使用20倍数量的树时内存使用量几乎相同吗? - Buttons840
这很奇怪。也许你可以尝试使用memory_profiler来了解发生这种情况的原因和方式。 - ogrisel
1
感谢您的建议。 我之前的陈述部分是不正确的。我真正观察到的是,将估算器的数量增加一倍或三倍似乎没有太大的区别,但确实有一些区别。 实际上,将n_estimators增加20倍确实会有所不同,但是很小,可能只会使用10%的内存,而不是像您预期的那样使用2000%。 我只是想为以后的读者澄清这一点。 - Buttons840

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接