Scikit-learn Random Forest占用了太多内存

时间:2015-06-10 20:05:25

标签: python machine-learning scikit-learn

问题

我有一个包含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的内存。

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

2 个答案:

答案 0 :(得分:2)

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

此外,您可能需要尝试此操作:https://github.com/scikit-learn/scikit-learn/pull/4783

答案 1 :(得分:1)

使用太大的随机森林模型也会遇到类似情况。问题在于树木太深,占用大量内存。为了解决这个问题,我设置了max_depth = 6并减少了内存。我什至在blog post中写下了它。在本文中,我使用的是具有15列的32k行数据集。设置max_depth=6可以减少66倍的内存消耗,并保持类似的性能(在本文中,性能甚至可以提高)。