优化随机森林回归模型以应对计算限制

使用随机森林回归模型进行模型拟合时会占用所有内存,导致在线托管的笔记本环境(如Google Colab或Kaggle内核)崩溃。大家能帮我优化一下模型吗?

我已经尝试过调整参数,如减少估算器的数量,但没有效果。df.info()显示训练数据有4446965条记录,占用约1GB的内存。

我无法在此贴出整个笔记本代码,因为它太长了,但请查看这个链接以供参考。我在下面提供了一些与训练数据框相关的信息。

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的内存

我还在学习机器学习,任何帮助都将不胜感激。谢谢!


回答:

随机森林本质上对CPURAM有很大的负载,这是其已知的一个主要缺点!所以你的问题并不罕见。

此外,更具体地说,有几个因素会导致这个问题,其中包括:

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

此外,Scikit-learn明确提到了这个问题,我在这里引用一下:

控制树大小的参数(如max_depthmin_samples_leaf等)的默认值会导致树完全生长且未修剪,在某些数据集上可能会非常大。为了减少内存消耗,应通过设置这些参数值来控制树的复杂性和大小。


该怎么做?

你能做的不多,特别是Scikit-learn没有提供动态处理存储问题的选项(据我所知)。

你需要更改上述提到的参数值,例如:

  1. 如果特征数量已经很高,尝试只保留最重要的特征(请参阅Scikit-learn中的特征选择树的特征重要性)。

  2. 尝试减少估算器的数量。

  3. max_depth默认值为None,这意味着节点会一直扩展直到所有叶子纯净或直到所有叶子包含少于min_samples_split的样本。

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

因此,尝试通过理解这些参数对性能的影响来调整它们,你需要参考的是这个

  1. 最后的选项是你可以从头开始创建自己的自定义随机森林,并将元数据加载到硬盘上…等等,或者进行任何优化,这听起来很不方便,但只是为了提到这种选项,这里是一个基本实现的示例!

附注:

在我的Core i7笔记本电脑上的实际经验是,将参数n_jobs设置为-1会使机器不堪重负,我总是发现保持默认设置n_jobs=None更有效率!尽管理论上应该是相反的!

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注