Построение параллельной модели Sklearn с помощью Dask или Joblib

У меня есть большой набор конвейеров sklearn, которые я хотел бы построить параллельно с Dask. Вот простой, но наивный последовательный подход:

from sklearn.naive_bayes import MultinomialNB 
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X_train, X_test, Y_train, Y_test = train_test_split(iris.data, iris.target, test_size=0.2)

pipe_nb = Pipeline([('clf', MultinomialNB())])
pipe_lr = Pipeline([('clf', LogisticRegression())])
pipe_rf = Pipeline([('clf', RandomForestClassifier())])

pipelines = [pipe_nb, pipe_lr, pipe_rf]  # In reality, this would include many more different types of models with varying but specific parameters

for pl in pipelines:
    pl.fit(X_train, Y_train)

Обратите внимание, что это не проблема GridSearchCV или RandomSearchCV

В случае RandomSearchCV я знаю, как распараллелить его с помощью Dask:

dask_client = Client('tcp://some.host.com:8786')  

clf_rf = RandomForestClassifier()
param_dist = {'n_estimators': scipy.stats.randint(100, 500}
search_rf = RandomizedSearchCV(
                clf_rf,
                param_distributions=param_dist, 
                n_iter = 100, 
                scoring = 'f1',
                cv=10,
                error_score = 0, 
                verbose = 3,
               )

with joblib.parallel_backend('dask'):
    search_rf.fit(X_train, Y_train)

Однако меня не интересует настройка гиперпараметров, и неясно, как изменить этот код, чтобы он соответствовал множеству различных моделей с их собственными конкретными параметрами параллельно с Dask.


person slaw    schedule 24.01.2019    source источник


Ответы (1)


dask.delayed - наверное, самое простое решение.

from sklearn.naive_bayes import MultinomialNB 
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X_train, X_test, Y_train, Y_test = train_test_split(iris.data, iris.target, test_size=0.2)

pipe_nb = Pipeline([('clf', MultinomialNB())])
pipe_lr = Pipeline([('clf', LogisticRegression())])
pipe_rf = Pipeline([('clf', RandomForestClassifier())])

pipelines = [pipe_nb, pipe_lr, pipe_rf]  # In reality, this would include many more different types of models with varying but specific parameters

# Use dask.delayed instead of a for loop.
import dask.delayed

pipelines_ = [dask.delayed(pl).fit(X_train, Y_train) for pl in pipelines]
fit_pipelines = dask.compute(*pipelines_)
person TomAugspurger    schedule 25.01.2019
comment
Будет ли это автоматически обнаруживать / использовать клиент dask.distributed, предполагая, что выполняется строка dask_client = Client('tcp://some.host.com:8786') ? Или все же нужно заворачивать в joblib.parallel_backend('dask')? - person slaw; 25.01.2019
comment
Это просто использование Dask, а не joblib, поэтому вам не нужно использовать joblib.parallel_backend диспетчер контекста (хотя это тоже не повредит). Dask выберет последний созданный клиент и будет использовать его по умолчанию. - person MRocklin; 25.01.2019
comment
Выполнение dask.compute(*pipelines_) внутри joblib.parallel_backend контекста также потенциально может распараллелить обучение отдельных моделей, если вы укажете n_jobs. Я не уверен, как Dask справится с ситуацией, если вы попытаетесь распараллелить как отдельные модели, так и несколько моделей, но все может сработать хорошо. - person TomAugspurger; 25.01.2019
comment
Спасибо за понимание! Я также узнал кое-что новое о dask.delayed(pl).fit(X_train, Y_train). Это не похоже на классические inc или add примеры из документации, поэтому без вашей помощи у меня, вероятно, были бы проблемы. - person slaw; 26.01.2019
comment
@slaw, у меня тоже есть аналогичная проблема, и я наткнулся на этот ответ, который немного прояснил для меня. Просто интересно, пробовали ли вы распределенное обучение в кластере с использованием того же подхода и подходит ли dask для этой задачи. - person Subrat Sahu; 08.05.2020