scikit-learn 随机森林永远不会完成训练,冻结

Posted

技术标签:

【中文标题】scikit-learn 随机森林永远不会完成训练,冻结【英文标题】:scikit-learn random forest never finishes training, freeze 【发布时间】:2019-02-13 16:48:35 【问题描述】:

我正在尝试在 ubuntu 14.04.-server 机器上使用 scikit-learn 拟合随机森林模型。我的数据形状为 (150000, 270),verbose=10 输出如下所示:

构建树 1 of 10 [并行(n_jobs = 1)]:完成 1 出 1 |已用时间:6.1s 剩余时间:0.0s 建筑树 2 of 10 [并行(n_jobs = 1)]:完成 2 出 2 |已用时间:12.2s 剩余时间:0.0s 建筑树 3 of 10 [并行(n_jobs = 1)]:完成 3 出 3 |已用时间:18.3s 剩余时间:0.0s 建筑树 4 of 10 [并行(n_jobs = 1)]:完成 4 出 4 |已用时间:24.9s 剩余时间:0.0s 建筑树 5 of 10 [并行(n_jobs = 1)]:完成 5 出 5 |已用时间:32.1s 剩余时间:0.0s 建筑树 6 of 10 [并行(n_jobs = 1)]:完成 6 次中的 6 次 |已用时间:38.5s 剩余时间:0.0s 建筑树 7 of 10 [并行(n_jobs = 1)]:完成 7 出 7 |已用时间:45.3s 剩余时间:0.0s 建筑树 8 of 10 [并行(n_jobs = 1)]:完成 8 / 8 |已用时间:52.0s 剩余时间:0.0s 建筑树 9 of 10 [并行(n_jobs = 1)]:完成 9 出 9 |已用时间:58.5s 剩余时间:0.0s 建筑树 10 of 10 [并行(n_jobs = 1)]:完成 10 / 10 |经过:1.1分钟完成

在此之后,它会挂起/冻结几个小时。我尝试改变n_jobsn_estimators 参数,以使模型不那么复杂/防止n_jobs 出现线程问题。这没有帮助。

我的模型如下所示: RandomForestRegressor(random_state=1234, n_jobs=1, n_estimators=10, min_samples_split=2, min_samples_leaf=1, verbose=10)

我阅读了很多关于 BLAS/MKL 线程问题的文章并尝试设置环境变量

os.environ['MKL_NUM_THREADS'] = '1'

os.environ['OMP_NUM_THREADS'] = '1'

os.environ['NUMEXPR_NUM_THREADS'] = '1'

os.environ['JOBLIB_START_METHOD'] = 'forkserver'

但它们都没有帮助。该模型将无法完成训练。 我的脚本看起来类似于这样的结构:

import packages/libraries

## load data 
## define model
## fit model
## predict on new data

有没有人经历过相同/不同的事情?

提前致谢!

【问题讨论】:

只是一个建议:也许一个有用的诊断是首先在较小的样本量上运行您的代码,例如 15000 或 1500 个示例。 数据的大小没有帮助。我已经尝试了不同的尺寸,越来越小...... 似乎有一种线程问题会导致任何锁定或其他问题......我尝试不设置任何环境变量和n_jobs=-1,它确实工作正常,但使用所有内核可用...如何限制使用的核心数量?简单地设置n_jobs=4或任何其他整数不会做任何事情,只是让脚本只使用一个核心。 尝试在代码顶部添加import multiprocessing; multiprocessing.set_start_method('forkserver');,然后再运行或导入任何内容。它可以解决问题吗? 遗憾的是这并没有改变任何东西。 【参考方案1】:

似乎是内存问题。

我建议分析程序在运行时使用了多少内存。

也许尝试使用数据集中的 10 个样本运行它,看看它是否运行完成。

【讨论】:

在 htop 中,我使用了 10GB 的 RAM,相当于总内存的 5%....我认为这不是内存问题,因为我拥有的服务器机器的资源访问量非常大......

以上是关于scikit-learn 随机森林永远不会完成训练,冻结的主要内容,如果未能解决你的问题,请参考以下文章

Scikit-learn 中随机森林训练前的预随机化

SciKit-Learn 随机森林子样本大小如何可能等于原始训练数据大小?

在 scikit-learn 中平均多个随机森林模型

如何在 scikit-learn 的随机森林的 graphviz-graph 中找到一个类?

Python 中用 XGBoost 和 scikit-learn 进行随机梯度增强

有没有一种方法可以用决策树/随机森林进行迁移学习?