所以基本上我想要的是并行运行ML管道。
我一直在使用scikit learn,并决定使用DaskGridSearchCV
。在
我有一个gridSearchCV = DaskGridSearchCV(pipeline, grid, scoring=evaluator)
对象的列表,我按顺序运行每个对象:
for gridSearchCV in list:
gridSearchCV.fit(train_data, train_target)
predicted = gridSearchCV.predict(test_data)
如果我有N个不同的GridSearch
对象,我希望尽可能利用所有可用资源。如果有资源可以运行2,3,4。。。或者N同时并行,我想这样做。在
所以我开始根据达斯克的文档做一些尝试。首先,我尝试了dask.threaded
和dask.multiprocessing
,但结果速度较慢,我一直得到:
/Library/Python/2.7/site-packages/sklearn/externals/joblib/parallel.py:540: UserWarning: Multiprocessing backed parallel loops cannot be nested below threads, setting n_jobs=1
以下是代码片段:
^{pr2}$也许我走错了路,你能给我一些建议吗?在
如果这是你的目标,我会把它们合并到同一个网格中。Scikit Learn管道支持跨步骤的网格搜索,这将允许您仅在单个
GridSearchCV
对象中进行搜索(有关Scikit学习文档的示例,请参见here)。如果您只有一个估计器(而不是管道),您可以使用一个带有单个步骤的Pipeline
作为代理。例如:请注意,对于这种特定情况(所有估计器共享相同的参数,您可以合并网格:
^{pr2}$至于为什么延迟的示例不起作用-
dask.delayed
是为了包装那些不调用dask代码的函数。由于在延迟函数(也使用dask进行计算)内对dask_searchcv.GridSearchCV
对象(使用dask进行计算)调用fit
,因此将对dask调度程序的调用嵌套起来,这最多可能导致性能低下,最坏的情况下会导致奇怪的错误。在相关问题 更多 >
编程相关推荐