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

使用随机森林回归模型进行模型拟合时会占用所有内存,导致在线托管的笔记本环境(如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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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