Scikit-Learn's RandomForestRegressor有一个 n_jobs
实例属性,来自文档:
n_jobs : integer, optional (default=1)
The number of jobs to run in parallel for both fit and predict. If
-1, then the number of jobs is set to the number of cores.
使用多个核心训练随机森林模型显然比单个核心更高效。但我注意到预测速度要慢得多(大约慢10倍) - 这可能是因为我在逐个观察的基础上使用.predict()
。
因此,我想在4核上训练随机森林模型,但在单核上运行预测。 (模型为pickled,并在单独的过程中使用。)
是否可以通过这种方式配置 RandomForestRegressor()
?
答案 0 :(得分:1)
哦,确定你可以,我对存储模型使用类似的策略。
在使用<_aRFRegressorModel_>.n_jobs = 1
方法之前,只需在pickle.load()
- ed上设置.predict()
。
Nota bene:
.predict()
上的工作量 - 与.fit()
相比,任务非常“轻量级”,所以在怀疑中,调整这个问题的核心动机是什么。一旦大型森林可能需要在n_jobs
- “许多”复制品中进行扫描(由于 joblib
自然会重新启动所有内容,因此内存可能成为问题将python进程状态转换为许多全面复制副本......以及new, overhead-strict Amdahl's Law re-fomulation shows一个,这是一个多么糟糕的想法 - 支付超过最终获得的方式(性能)。对.fit()
来说,这不是一个问题,并发进程可以很好地调整设置开销(在我的模型中每个进程运行时间为4:00:00 + 00),但由于这种成本/收益“不平衡”,它可能是“轻量级”的杀手因素 - .predict()
,其中没有太多工作要做,因此无法完成屏蔽过程设置/终止成本(并且你付出的代价不仅仅是获得)。
顺便说一下,你是顶级命名空间中的pickle.dump()
个对象吗?如果没有,我会遇到问题,并且存储的对象没有正确重建。 (在这个问题上花了很长时间)