在哪里设置n_job:在estimator还是GridSearchCV中?

9

我经常使用GridSearchCV来进行超参数调优。例如,在逻辑回归中调整正则化参数C。每当我使用的估计器有自己的n_jobs参数时,我会困惑在估计器或GridSearchCV中设置它,还是两者都设置?同样的情况也适用于cross_validate


2
@Anwarvic 这不是问题所问的;问题是关于有限数量的模型,这些模型确实包括一个 n_jobs 参数,以及如何与 GridSearchCV 结合使用,后者也有自己的参数。 - desertnaut
我明白。问题是当估计器具有此参数时,GridSearchCV也有。我应该选择哪一个? - Aramakus
1
我只做过一次关于k-nn的初步实验,结果发现将其设置为GridSearchCV只会导致更快的过程。我想这有些道理,但我没有时间详细说明(这就是为什么我只是发布了一条评论)。 - desertnaut
1个回答

7

这是一个非常有趣的问题。我没有确定的答案,但有一些元素值得提及,以便理解该问题,而且并不适合在评论框中讨论。

让我们从为什么应该或不应该使用多进程开始:

  • 多进程对于独立任务非常有用。例如,在网格搜索中,您的所有不同模型的变化都是独立的。
  • 当以下情况发生时,多进程是无用的/使事情变慢:
    • 任务太小:创建新进程需要时间,如果您的任务非常小,则这种开销会减缓整个代码的执行速度。
    • 派生了太多进程:计算机有限数量的核心。如果进程数超过核心数,则负载平衡机制会强制计算机定期切换正在运行的进程。这些切换需要一些时间,并导致更慢的执行。

第一个结论是,您不应该在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中并行处理的说明


但是如果我说,如果我们在RF中不应用n_jobs=-1,它将需要很长时间才能运行。在这种情况下,如果我们在两个地方都给出,会有问题吗? - yogesh agrawal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接