使用随机森林回归模型进行模型拟合时会占用所有内存,导致在线托管的笔记本环境(如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的内存
我还在学习机器学习,任何帮助都将不胜感激。谢谢!
回答:
随机森林
本质上对CPU
和RAM
有很大的负载,这是其已知的一个主要缺点!所以你的问题并不罕见。
此外,更具体地说,有几个因素会导致这个问题,其中包括:
- 数据集中的属性(特征)数量。
- 树的数量(
n_estimators
)。 - 树的最大深度(
max_depth
)。 - 叶节点所需的最小样本数(
min_samples_leaf
)。
此外,Scikit-learn
明确提到了这个问题,我在这里引用一下:
控制树大小的参数(如
max_depth
、min_samples_leaf
等)的默认值会导致树完全生长且未修剪,在某些数据集上可能会非常大。为了减少内存消耗,应通过设置这些参数值来控制树的复杂性和大小。
该怎么做?
你能做的不多,特别是Scikit-learn
没有提供动态处理存储问题的选项(据我所知)。
你需要更改上述提到的参数值,例如:
-
如果特征数量已经很高,尝试只保留最重要的特征(请参阅Scikit-learn中的特征选择和树的特征重要性)。
-
尝试减少估算器的数量。
-
max_depth
默认值为None
,这意味着节点会一直扩展直到所有叶子纯净或直到所有叶子包含少于min_samples_split
的样本。 -
min_samples_leaf
默认值为1
:在任何深度上的分割点只有在左右分支各留下至少min_samples_leaf
个训练样本时才会被考虑。这可能会使模型平滑,尤其是在回归中。
因此,尝试通过理解这些参数对性能的影响来调整它们,你需要参考的是这个。
- 最后的选项是你可以从头开始创建自己的自定义
随机森林
,并将元数据加载到硬盘上…等等,或者进行任何优化,这听起来很不方便,但只是为了提到这种选项,这里是一个基本实现的示例!
附注:
在我的Core i7
笔记本电脑上的实际经验是,将参数n_jobs
设置为-1
会使机器不堪重负,我总是发现保持默认设置n_jobs=None
更有效率!尽管理论上应该是相反的!