我正在使用scikit的随机森林实现:
sklearn.ensemble.RandomForestClassifier(n_estimators=100,
max_features="auto",
max_depth=10)
调用rf.fit(...)
后,进程的内存使用量增加了80MB,即每棵树0.8MB(我也尝试了许多其他设置,结果相似。我使用top
和psutil
来监控内存使用情况)
深度为10的二叉树最多应该有2^11-1 = 2047
个元素,这些元素都可以存储在一个密集的数组中,这样程序员就可以很容易地找到任何给定元素的父元素和子元素。
根据程序员的经济性,每个元素都需要一个拆分和截断中使用的功能的索引,或者6-16个字节。在我的情况下,这转化为每个树0.01-0.03MB。
为什么scikit的实现使用20-60倍的内存来存储随机森林的树?
每个决策(非叶)节点存储左分支和右分支整数索引(2 x 8字节)、用于拆分的特征的索引(8字节),决策特征的阈值的浮点值(8个字节),杂质的减少(8个字节)。此外,叶节点存储由叶预测的恒定目标值。
有关详细信息,您可以查看源代码中的Cython类定义。