5

所以基本上我想要的是并行运行 ML Pipelines。我一直在使用 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 的文档尝试一些事情。首先我尝试了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

这是代码片段:

def run_pipeline(self, gs, data):

    train_data, test_data, train_target, expected = train_test_split(data, target, test_size=0.25, random_state=33)

    model = gs.fit(train_data, train_target)
    predicted = gs.predict(test_data)


values = [delayed(run_pipeline)(gs, df) for gs in gs_list]
compute(*values, get=dask.threaded.get)

也许我正在以错误的方式接近这个,你对我有什么建议吗?

4

1 回答 1

3

是的,但我有一个 GridSearch 对象列表,例如一个使用 DecisionTree,另一个使用 RandomForest。只要有资源,我就想并行运行它们。

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

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)

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

grid = {'est': [DecisionTreeClassifier(), RandomForestClassifier()],
        'max_features': ['sqrt', 'log2'],
        # more parameters for all estimators}

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

于 2017-05-08T13:44:59.853 回答