我经常使用GridSearchCV
来进行超参数调优。例如,在逻辑回归中调整正则化参数C
。每当我使用的估计器有自己的n_jobs
参数时,我会困惑在估计器或GridSearchCV
中设置它,还是两者都设置?同样的情况也适用于cross_validate
。
我经常使用GridSearchCV
来进行超参数调优。例如,在逻辑回归中调整正则化参数C
。每当我使用的估计器有自己的n_jobs
参数时,我会困惑在估计器或GridSearchCV
中设置它,还是两者都设置?同样的情况也适用于cross_validate
。
这是一个非常有趣的问题。我没有确定的答案,但有一些元素值得提及,以便理解该问题,而且并不适合在评论框中讨论。
让我们从为什么应该或不应该使用多进程开始:
第一个结论是,您不应该在GridSearch
和要优化的模型中同时使用n_jobs
,因为这将会生成很多进程并最终导致执行变慢。
现在,很多sklearn模型和函数都基于Numpy/SciPy,它们通常是用C/Fortran实现的,因此已经使用了多进程。这意味着在GridSearch
中不能设置n_jobs
>1。
如果您假设模型尚未并行化,可以选择在模型级别或GridSearch
级别设置n_jobs
。一些模型能够完全并行化(如RandomForest
),但大多数模型可能至少有一部分是顺序的(如Boosting
)。另一方面,由于设计上的原因,GridSearch
没有顺序组件,因此在GridSearch
中设置n_jobs
比在模型中更有意义。
也就是说,这取决于模型的实现方式,而且不能没有自己的测试为其提供确定的答案。例如,如果管道由于某种原因消耗了大量内存,则在GridSearch
中设置n_jobs
可能会导致内存问题。
作为补充,以下是一个非常有趣的关于sklearn中并行处理的说明。
n_jobs
参数,以及如何与GridSearchCV
结合使用,后者也有自己的参数。 - desertnaut