【问题标题】:Why is scikit-learn's random forest using so much memory?为什么 scikit-learn 的随机森林使用这么多内存?
【发布时间】:2013-12-23 04:25:07
【问题描述】:

我正在使用 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 倍的内存来存储随机森林的树?

【问题讨论】:

    标签: machine-learning classification scikit-learn decision-tree random-forest


    【解决方案1】:

    每个决策(非叶子)节点存储左右分支整数索引(2 x 8字节),用于分割的特征的索引(8字节),决策特征的阈值的浮点值( 8 字节),杂质减少(8 字节)。此外,叶子节点存储叶子预测的常量目标值。

    详情可以查看源码中的Cython class definition

    【讨论】:

    • 如果我使用 10 个估计器(默认)对一些数据进行训练,大约使用 2.2 GB,如果我使用 200 个估计器对相同数据进行训练,则内存使用量约为 2.2 GB。你知道为什么树的数量增加 20 倍,内存使用量几乎一样吗?
    • 这很奇怪。也许您可以尝试使用memory_profiler 来了解这是如何/为什么会发生的。
    • 感谢您的建议。我之前的陈述部分不正确。我真正观察到的是,估计器数量的两倍或三倍似乎没有什么区别,但确实有所作为。确实,将 n_estimators 增加 20 倍确实会有所不同,但是会使用一个小的内存,可能会多使用 10%,而不是像您预期的那样使用 2,000%。我只是想为未来的读者澄清这一点。
    猜你喜欢
    • 2015-04-16
    • 2015-08-26
    • 2015-03-28
    • 2017-12-10
    • 2013-04-26
    • 2015-02-20
    • 2014-11-12
    • 2015-09-16
    • 2015-12-01
    相关资源
    最近更新 更多