由于计算限制而优化随机森林回归

时间:2018-11-22 20:02:34

标签: python machine-learning scikit-learn random-forest kaggle

使用随机森林回归器进行模型拟合会占用所有RAM,这会导致在线托管笔记本环境(Google colab或Kaggle内核)崩溃。你们可以帮我优化模型吗?

我已经尝试对参数进行超调,例如减少估计量,但是不起作用。 df.info()显示火车数据的4446965条记录,这些记录占用约1GB的内存。

我无法在此处发布整个笔记本代码,因为它太长了,但是请您检查this link以获得参考。我在下面提供了一些与数据框有关的信息。

clf = RandomForestRegressor(n_estimators=100,min_samples_leaf=2,min_samples_split=3, max_features=0.5 ,n_jobs=-1)
clf.fit(train_X, train_y)
pred = clf.predict(val_X)
  

train_x.info()显示3557572条记录占用了近542 MB的内存

我仍然开始使用ML,我们将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

posts本质上给Random ForestCPU带来了沉重的负担,这是它众所周知的缺点之一!因此,您的问题没有任何异常。

此外,更具体地说,此问题有不同的因素引起,例如:

  1. 数据集中的属性(功能)数。
  2. 树木数量(RAM)。
  3. 树的最大深度(n_estimators)。
  4. 在叶节点(max_depth)上需要的最小样本数。

此外,min_samples_leaf已明确说明了此问题,我在这里引用:

  

控制尺寸的参数的默认值   树木(例如Scikit-learnmax_depth等)导致完全生长   和未修剪的树,在某些数据上可能非常大   套。为了减少内存消耗,该方法的复杂性和大小   应该通过设置这些参数值来控制树。


该怎么办?

尤其是 min_samples_leaf并没有太多可以做的事情(据我所知)。

相反,您需要更改上述参数的值,例如:

  1. 只有在特征数量已经很高时,才尝试保留最重要的特征(请参见Feature Selection in Scikit-learnFeature importances with forests of trees)。

  2. 尝试减少估计量。

  3. Scikit-learn的默认值为max_depth,这意味着节点将一直扩展到所有叶子都是纯净的,或者直到所有叶子都包含少于None个样本为止。

  4. min_samples_split默认为min_samples_leaf:任何深度的分割点只有在其左右分支中至少留有1个训练样本的情况下才会被考虑。这可能会平滑模型,尤其是在回归分析中。

因此,请尝试通过了解参数对性能的影响来更改参数,您需要的参考是this

  1. 您的最后一个选择是从头开始创建自己的自定义min_samples_leaf并将元数据加载到硬盘上。.etc或进行任何优化,这很尴尬,但仅提及这样的选择,{{3 }}是基本实现的示例!

旁注:

实际上,我在Random Forest笔记本电脑上体验到将参数Core i7设置为n_jobs会使机器不堪重负,我总是发现保留默认设置{{1} }!尽管从理论上讲应该相反!