对于Scikit-Learn的RandomForestRegressor,我可以为预测指定不同的n_jobs吗?

时间:2017-12-30 13:50:28

标签: scikit-learn

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()

1 个答案:

答案 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()个对象吗?如果没有,我会遇到问题,并且存储的对象没有正确重建。 (在这个问题上花了很长时间)