我想在多个处理器上并行使用sklearn.grid_search.GridSearchCV()
。这是我第一次这样做,但我的初步测试表明它似乎有效。
我正在努力理解文档的这一部分:
谁能给我解释一下这个?我很难理解
n_jobs
: int,默认为1并行运行的作业数。
pre_dispatch
: int,或string,可选控制并行期间分派的作业数量执行。减少这个数字对于避免爆炸是有用的当分派的作业多于cpu的能力时,内存消耗的过程。该参数可以是:
None,在这种情况下,立即创建所有作业并催生了。将此用于轻量级和快速运行的作业,以避免由于按需生成作业造成的延迟生成一个字符串,给出一个表达式作为n_jobs的函数,如' 2*n_jobs '
n_jobs
和pre_dispatch
之间的区别。如果我设置n_jobs = 5
和pre-dispatch=2
,这与只设置n_jobs=2
有什么不同?
假设您使用GridSearchCV
作为参数grid: k=[1,2,3,4,5, ... 1000]
的KNN。
即使当您设置n_jobs=2
时,GridSearchCV
也会首先创建1000个作业,每个作业都有您的k
的一个选择,还会生成1000个数据副本(如果数据很大可能会占用您的内存),然后将这1000个作业发送到2个cpu(当然大多数作业将挂起)。
GridSearchCV
不只是为2个cpu生成2个作业,因为按需生成作业的过程非常昂贵。它直接生成等量的作业作为您的参数组合(在本例中为1000)。
在这个意义上,措辞n_jobs
可能具有误导性。现在,使用pre_dispatch
,您可以设置要生成多少预调度的作业。
来源
如果n_jobs设置的值大于1,则每个参数设置都会复制数据(而不是n_jobs次数)。如果单个作业花费的时间很少,那么这样做是出于效率的考虑,但是如果数据集很大并且没有足够的内存可用,则可能会引发错误。在这种情况下,一个解决方法是设置pre_dispatch。然后,只对内存进行pre_dispatch多次复制。pre_dispatch的合理值是2 * n_jobs。