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

Optimize Random Forest regressor due to computational limits

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

我已经尝试过超调参数,例如减少估算器的数量,但没有用。 df.info() 显示 4446965 条火车数据记录,占用 ~1GB 内存。

我无法在此处 post 整个笔记本代码,因为它太长了,但您能否检查 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() shows 3557572 records taking up almost 542 MB of memory

我仍在学习 ML,如有任何帮助,我们将不胜感激。谢谢!

Random Forest 本质上会给 CPURAM 带来巨大的负担,这是它众所周知的缺点之一!所以你的问题没有异常。

此外,更具体地说,有不同的因素促成了这个问题,仅举几例:

  1. 数据集中的属性(特征)数量。
  2. 树的数量(n_estimators)。
  3. 树的最大深度(max_depth)。
  4. 叶节点所需的最小样本数 (min_samples_leaf)。

另外,Scikit-learn对这个问题说的很清楚,这里引用一下:

The default values for the parameters controlling the size of the trees (e.g. max_depth, min_samples_leaf, etc.) lead to fully grown and unpruned trees which can potentially be very large on some data sets. To reduce memory consumption, the complexity and size of the trees should be controlled by setting those parameter values.


要做什么?

你能做的不多 尤其是 Scikit-learn 没有添加一个选项来动态处理存储问题(据我所知) .

而是需要更改上述参数的值,例如:

  1. 仅当特征数量已经很多时才尝试保留最重要的特征(参见Feature Selection in Scikit-learn and Feature importances with forests of trees)。

  2. 尽量减少估算器的数量。

  3. max_depth 默认情况下是 None 这意味着扩展节点直到所有叶子都是纯的或直到所有叶子包含少于 min_samples_split 个样本。

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

所以尝试通过了解它们对性能的影响来更改参数,您需要的参考是this

  1. 您拥有的最后一个选项是从头开始创建您自己的自定义 Random Forest 并将元数据加载到硬盘..等或进行任何优化,这很尴尬但只是提到这样的选项,here是基本实现的例子!

旁注:

实际上,我在 Core i7 笔记本电脑上遇到过,将参数 n_jobs 设置为 -1 会使机器不堪重负,我总是发现保持默认设置 n_jobs=None!虽然理论上应该是相反的!