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_jobs
和n_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 的随机森林的 graphviz-graph 中找到一个类?