Scikit-learn随机森林占用过多内存问题

3

问题

我有一个包含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
@pbu 不错的想法,但是没有奏效。PCA 究竟是什么? - grasshopper
PCA是一种降维方法:http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html。将PCA的前100个特征提取出来,输入到RF中进行训练,看看效果如何。这应该会很快。另一个想法是将数据分成10k行的批次进行训练。我认为随机森林支持批量训练。 - pbu
2个回答

3
你正在构建的模型太大了。增加更多内存或者构建一个较小的模型。要构建较小的模型,可以减少树的数量或限制每棵树的深度,比如使用max_depth参数。试试将max_depth设置为5,看看会发生什么。 另外,你有多少个类别?类别越多,所有内容就变得更加昂贵。
此外,你可能想尝试这个:https://github.com/scikit-learn/scikit-learn/pull/4783

2

我遇到了与太大的随机森林模型类似的情况。问题在于树太深,需要大量内存。为了解决这个问题,我设置了max_depth = 6,从而减少了内存使用。我甚至在博客文章中写下了关于它的内容。在文章中,我使用了32k行15列的数据集。设置max_depth=6可以将内存消耗减少66倍,并保持类似的性能(在文章中,性能甚至有所提高)。


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