Scikit learn 随机林:内存不足

Scikit learn 随机林:内存不足,scikit-learn,random-forest,Scikit Learn,Random Forest,我正在使用scikit learn Random Forest来适应训练数据(~30mb),我的笔记本电脑一直崩溃,应用程序内存不足。测试数据比训练数据大几倍。使用Macbook Air 2GHz 8GB内存 有哪些方法可以解决这个问题 rf = RandomForestClassifier(n_estimators = 100, n_jobs=4) print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rf,

我正在使用scikit learn Random Forest来适应训练数据(~30mb),我的笔记本电脑一直崩溃,应用程序内存不足。测试数据比训练数据大几倍。使用Macbook Air 2GHz 8GB内存

有哪些方法可以解决这个问题

rf = RandomForestClassifier(n_estimators = 100, n_jobs=4)
print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rf, X_train_a, y_train, cv=20, scoring='roc_auc'))

最好的选择是调整参数

n_jobs=4
这使得计算机同时计算四个列车试验循环。不同的Python作业在不同的进程中运行,因此也会复制完整的数据集。尝试将
n_作业
减少到2或1以节省内存
n_作业==4
使用的内存是n_作业==1使用的内存的四倍

cv=20
这将数据分成20个部分,代码执行20次训练测试迭代。这意味着训练数据是原始数据的19个片段的大小。您可以非常安全地将其减少到10,但是您的准确度估计可能会变得更糟。它不会节省很多内存,但会加快运行速度

n_estimators = 100
减少该值将节省很少的内存,但会使算法运行更快,因为随机林包含的树更少


总之,我建议将
n_jobs
减少到2以节省内存(运行时增加2倍)。为了补偿运行时间,我建议将
cv
更改为10(运行时间节省2倍)。如果这不起作用,请将n_jobs更改为1,并将估计器的数量减少到50(处理速度增加两倍)。

我处理的数据集约为4MB,scikit learn的随机林使用默认的超参数约为50MB(因此超过了数据的10倍)。通过设置
max_depth=6
内存消耗减少66倍。我的数据集上的浅层随机林的性能得到了改进! 我把这个实验写在博客上

根据我的经验,在回归任务的情况下,内存使用可能会增长得更多,因此控制树的深度非常重要。树深度可以通过
max\u depth
直接控制,也可以通过调整:
min\u samples\u split
min\u samples\u leaf
min\u weight\u fraction\u leaf
max\u features
max\u leaf\u nodes


当然,随机林的内存可以通过集合中的树数来控制。

您使用的是哪个版本的scikit learn?版本0.15在林中的内存消耗方面有一些重大改进。“0.15.2”。我试着切换到按顺序构建的GBRT,不知为什么它也会耗尽内存。这是否意味着我真的需要尝试在EC2集群上运行,或者进行随机采样?@AndreasMueller:谢谢你关于高级Sklearn的有用的演讲。也许我可以从那里尝试一些想法。我还没有机会阅读ogrisel关于EC2的并行ML教程。我想知道我们需要考虑什么样的自旋EC2团簇?很高兴你们喜欢它。正如@Timo所建议的,您需要调整参数才能使用此框。我建议使用一些正则化,例如“最大深度”或“最大叶节点”。这将大大减少内存消耗,或者减少n_估计量。另一个选择是切换到GradientBoostingClassifier,对于它,您可能需要更少或更少的深度估计器,但它在训练中是连续的。您应该何时转到ec2?如果你从低“最大深度”和“n估计值”开始,它将在你的笔记本电脑上工作。用更多的估计器或更深的树来描绘准确度是如何提高的。如果看起来它会用更多的内存来提高,或者如果需要很长时间,考虑EC2。顺便说一句,尝试ec2既便宜又容易。自2021年起,由于sklearn库已有改进,n_作业对RAM使用几乎没有影响。因此,减少n_工作岗位并不能带来多少好处。