使用Dask作为任务调度来运行机器学习模型在p中

2024-09-30 02:24:51 发布

您现在位置:Python中文网/ 问答频道 /正文

所以基本上我想要的是并行运行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.threadeddask.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}$

也许我走错了路,你能给我一些建议吗?在


Tags: 对象data管道pipelineparalleltrain资源scikit
1条回答
网友
1楼 · 发布于 2024-09-30 02:24:51

Yes, but I have a list of GridSearch objects, for example one using DecisionTree and another with RandomForest. And I wanna run them in parallel as long as there are resources for it.

如果这是你的目标,我会把它们合并到同一个网格中。Scikit Learn管道支持跨步骤的网格搜索,这将允许您仅在单个GridSearchCV对象中进行搜索(有关Scikit学习文档的示例,请参见here)。如果您只有一个估计器(而不是管道),您可以使用一个带有单个步骤的Pipeline作为代理。例如:

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
import dask_searchcv as dcv

pipeline = Pipeline([('est', DecisionTreeClassifier())])

grid = [
    {'est': [DecisionTreeClassifier()],
     'max_features': ['sqrt', 'log2'],
     # more parameters for DecisionTreeClassifier
    },
    {'est': [RandomForestClassifier()],
     'max_features': ['sqrt', 'log2'],
     # more parameters for RandomForesetClassifier
    },
    # more estimator/parameter subsets
]

gs = dcv.GridSearchCV(pipeline, grid)
gs.fit(train_data, train_target)
gs.predict(test_data)

请注意,对于这种特定情况(所有估计器共享相同的参数,您可以合并网格:

^{pr2}$

至于为什么延迟的示例不起作用-dask.delayed是为了包装那些不调用dask代码的函数。由于在延迟函数(也使用dask进行计算)内对dask_searchcv.GridSearchCV对象(使用dask进行计算)调用fit,因此将对dask调度程序的调用嵌套起来,这最多可能导致性能低下,最坏的情况下会导致奇怪的错误。在

相关问题 更多 >

    热门问题