Scikit-learn 随机森林占用太多内存

Posted

技术标签:

【中文标题】Scikit-learn 随机森林占用太多内存【英文标题】:Scikit-learn Random Forest taking up too much memory 【发布时间】:2015-08-26 06:58:18 【问题描述】:

问题

我有一个包含 900,000 行和 8 列的数据集。其中 6 列是整数,另外两列是浮点数。当试图拟合大约 1/4 的数据集(200,000)时,代码运行良好,耗时不到 30 秒。当我尝试运行 400,000 行或更多行时,我的计算机永久冻结,因为 python.exe 进程占用了超过 5GB 的 RAM。

尝试

我尝试的第一件事是将 warm_state 参数设置为 True,然后一次遍历 50,000 行数据

n = 0
i = 50,000  
clf = sk.RandomForestClassifier(oob_score = True,n_jobs=-1, n_estimators = n, warm_start=True)
While i<= 850,000:
    clf.fit(X.ix[n:i],Y.ix[n:i])
    n += 50,000
    i += 50,000

这并没有解决任何问题,我遇到了同样的问题。

接下来我尝试查找是否有一部分数据占用了更多内存来处理。我记录了 python.exe 进程中的内存增加以及该进程完成所需的时间(如果它确实完成了)。

n = 50
clf = sk.RandomForestClassifier(oob_score = True,n_jobs=-1, n_estimators = n, warm_start=True)
Z = X[['DayOfWeek','PdDistrict','Year','Day','Month']] # takes 15s and additional ~600mb RAM (800 total)
Z = X[['X','Address','Y']] # takes 24.8s and additional 1.1GB RAM (1389mb total)
Z = X # never finishes peaks at 5.2GB
%time clf.fit(Z.ix[0:400000],Y.ix[0:400000])

虽然有些数据的处理时间确实比其他数据长,但它们都不能占用 5 Gb 的内存。

数据只有几兆字节,所以我看不出它怎么会占用这么多内存来处理。

【问题讨论】:

一个简单的带有浮点数的 numpy 矩阵,900,000 x 8 x 4bytes = 28,800,000 只需要大约 28mb 的内存。我看到随机森林使用的估计器数量约为 50。尝试将其减少到 10。如果仍然无法在数据集上执行 PCA 并将其馈送到 RF @pbu 好主意,但没用。 PCA 到底是什么? PCA 是一种降维方法:scikit-learn.org/stable/modules/generated/…。获取 PCA 的前 100 个功能并将其馈送到 RF,看看它是如何进行的。它应该很快。另一个想法是训练成 10k 行的批次。我认为随机森林支持批量训练。 【参考方案1】:

您正在构建的模型太大了。获得更多内存或构建更小的模型。要构建更小的模型,要么创建更少的树,要么限制教学树的深度,比如使用 max_depth。尝试使用 max_depth=5 看看会发生什么。 还有,你有几节课?更多的课程让一切变得更昂贵。

另外,您可能想试试这个:https://github.com/scikit-learn/scikit-learn/pull/4783

【讨论】:

【参考方案2】:

我在使用太大的随机森林模型时遇到了类似的情况。问题是树太深了,占用了很多内存。为了处理它,我设置了max_depth = 6,它减少了内存。我什至在blog post 中写下了它。在文章中,我使用了 32k 行数据集,15 列。设置max_depth=6 可将内存消耗降低 66 倍并保持相似的性能(在文章中性能甚至有所提高)。

【讨论】:

以上是关于Scikit-learn 随机森林占用太多内存的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 并行生成随机森林

scikit-learn随机森林调参小结

转载:scikit-learn随机森林调参小结

在 scikit-learn 中平均多个随机森林模型

Scikit-learn 中随机森林训练前的预随机化

scikit-learn 中的随机森林解释