Сделайте рандомизированный поиск по сетке параллельным в оценке sklearn с помощью joblib - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь запустить рандомизированный поиск по сетке на оценщике склеарна, но я не хочу проводить перекрестную проверку, потому что у меня уже есть разделение поезда / проверки / теста для моих данных.Я построил функцию для запуска рандомизированного поиска по сетке, но я бы хотел распараллеливать потокиЯ смотрел на joblib и пытался выяснить, как изменить функции Parallel (delayed (func)), но не могу понять, как реализовать в моем коде.

Вот моя функция:

def randomized_grid_search(model=None, param_grid=None, percent=0.5,
                           X_train=None, y_train=None, 
                           X_val=None, y_val=None):        
    # converts parameter grid into a list
    param_list = list(ParameterGrid(param_grid))
    # the number of combinations to try in the grid
    n = int(len(param_list) * percent)
    # the reduced grid as a list
    reduced_grid = sample(param_list, n)
    best_score = 0
    best_grid = None

    """ 
    Loops through each of the posibble scenarios and
    then scores each model with prediction from validation set.
    The best score is kept and held with best parameters.
    """ 
    for g in reduced_grid:
        model.set_params(**g)
        model.fit(X_train,y_train)
        y_pred = model.predict(X_val)
        recall = recall_score(y_val, y_pred)
        if recall > best_score:
            best_score = recall
            best_grid = g

    """
    Combines the training and validation datasets and 
    trains the model with the best parameters from the 
    grid search"""
    best_model = model
    best_model.set_params(**best_grid)
    X2 = pd.concat([X_train, X_val])
    y2 = pd.concat([y_train, y_val])
    return best_model.fit(X2, y2)

С https://joblib.readthedocs.io/en/latest/parallel.html Я думаю, что это направление, в котором я должен идти:

with Parallel(n_jobs=2) as parallel:
    accumulator = 0.
    n_iter = 0
    while accumulator < 1000:
       results = parallel(delayed(sqrt)(accumulator + i ** 2)
                          for i in range(5))
       accumulator += sum(results)  # synchronization barrier
       n_iter += 1

Должен ли я сделать что-то подобное или я все это неправильно?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Я нашел код, созданный @ skylander86 для GitHub , где автор использует:

param_scores = Parallel(n_jobs=self.n_jobs)(delayed(_fit_classifier)(klass, self.classifier_args, param, self.metric, X_train, Y_train, X_validation, Y_validation) for param in ParameterGrid(self.param_grid))

Надеюсь, это поможет.

0 голосов
/ 03 марта 2019

Вы пытались использовать встроенное распараллеливание, используя параметр n_jobs?

grid = sklearn.model_selection.GridSearchCV(..., n_jobs=-1)

Документация GridSearchCV описывает параметр n_jobs следующим образом:

n_jobs: int или None, необязательный (по умолчанию = None) Количество заданий, выполняемых параллельно.None означает 1, если только в контексте joblib.parallel_backend.-1 означает использование всех процессоров ...

Итак, хотя это не будет распространяться по потокам, оно будет распространяться по процессорам;тем самым достигая степени распараллеливания.

...