scikit-learn 随机森林过多的内存使用

Posted

技术标签:

【中文标题】scikit-learn 随机森林过多的内存使用【英文标题】:scikit-learn Random Forest excessive memory usage 【发布时间】:2015-04-16 07:22:13 【问题描述】:

我在 Windows 7 64 位中使用 python 3.4 运行 scikit-learn(版本 0.15.2)随机森林。我有这个非常简单的模型:

import numpy as np
from sklearn.ensemble import RandomForestClassifier

#Data=np.genfromtxt('C:/Data/Tests/Train.txt', delimiter=',')

print ("nrows = ", Data.shape[0], "ncols = ", Data.shape[1]) 
X=np.float32(Data[:,1:])
Y=np.int16(Data[:,0])
RF = RandomForestClassifier(n_estimators=1000)
RF.fit(X, Y)

X 数据集有大约 30,000 x 500 个元素,格式如下:

139.2398242257808,310.7242684642465,...

即使没有并行处理,内存使用量最终也会攀升至 16 GB!我想知道为什么内存使用量这么大。

我知道之前有人问过这个问题,但在 0.15.2 版本之前...

有什么建议吗?

【问题讨论】:

您的估算器参数非常高,您没有控制树的深度。 谢谢。对于约 100 个类的多分类情况,您对树的深度范围和 n_estimator 有什么建议? 您是否尝试过减少估算器的数量并查看它是否会减少使用的内存?恐怕这只是一个猜测——我想知道你是否正在创建许多非常深的树。 是的,它正在减少内存使用量。而且由于树木的深度尚未确定,我想它会变得疯狂。我有一个包含许多特性和类的大数据集,我认为我需要使用许多树。我需要做更多的实验...... 您还可以尝试通过增加每次拆分所需的数据点数量来控制树的深度。我认为默认是两个。增加此值可能会增加估算器的数量。 【参考方案1】:

不幸的是,内存消耗与类的数量成线性关系。由于您有 100 多个样本和相当数量的样本,内存爆炸也就不足为奇了。解决方案包括控制树的大小(max_depthmin_samples_leaf、...)、它们的数量(n_estimators)或减少问题中的类数量(如果可能的话)。

【讨论】:

谢谢。我已经对你提到的所有这些进行了试验,现在内存问题已经好了。罪魁祸首是没有控制树木的深度。【参考方案2】:

尝试通过设置较小的 n_estimators 参数来减少树的数量。然后,您可以尝试使用 max_depth 或 min_samples_split 来控制树的深度,并用深度换取更多的估计器。

【讨论】:

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

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

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

scikit-learn 中的随机森林解释

使用 Scikit-Learn 在 Python 中绘制随机森林的树

随机森林中的引导数(scikit-learn)

使用 GridSearchCV 调整 scikit-learn 的随机森林超参数