Вызов нескольких кадров данных H2O в качестве входных данных в многопроцессорном Python - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь использовать многопроцессорность в python (версия 3.6.8), где 2 таблицы должны вызываться как входные данные в функции.В рамках функции мне подходят модели через H2O.Вот мой код:

def innerFold(params, feats, target, h2o_train_inner, h2o_test_inner, outer_fold, inner_fold):

    inner_scores = []

    for param in params:

        counter = param.get('counter')
        del param['counter']

        print('parameter combination: ', param)
        print('COUNTER: ', counter)

        #define model and fit
        gbm = H2OGradientBoostingEstimator(stopping_rounds = 5,
                                           stopping_metric = 'rmse',
                                           stopping_tolerance = 1e-4,
                                           seed = random_state,
                                           **param)

        print('TRAINING STARTS....')
        gbm.train(x = feats,
                  y = target,
                  training_frame = h2o_train_inner)


        score = gbm.model_performance(h2o_test_inner).r2()
        pd_scores = pd_scores.append({'outer_fold': int(outer_fold),
                                      'inner_fold': int(inner_fold),
                                      'score': score,
                                      'param_idx': int(counter)},
                                     ignore_index=True)

        inner_scores.append(gbm.model_performance(h2o_test_inner).r2())

    return pd_scores

Я разбил аргумент 'params' на 5, чтобы он обрабатывался 5 различными ядрами, а остальные аргументы должны быть идентичны.Для этого я разделю «params», как показано ниже:

df0 = np.array_split(param_combs,5)[0] 
df1 = np.array_split(param_combs,5)[1] 
df2 = np.array_split(param_combs,5)[2] 
df3 = np.array_split(param_combs,5)[3] 
df4 = np.array_split(param_combs,5)[4]

и представлю их следующим образом:

args = [(df0, feats, target, h2o_train_inner, h2o_test_inner, outer_fold, inner_fold), 
        (df1, feats, target, h2o_train_inner, h2o_test_inner, outer_fold, inner_fold), 
        (df2, feats, target, h2o_train_inner, h2o_test_inner, outer_fold, inner_fold),
        (df3, feats, target, h2o_train_inner, h2o_test_inner, outer_fold, inner_fold),
        (df4, feats, target, h2o_train_inner, h2o_test_inner, outer_fold, inner_fold)]

, где feats, target, h2o_train_inner, h2o_test_inner, external_fold, inner_fold являютсятип списка (содержащий словари), строка, h2o dataframe, h2o dataframe, int, int, соответственно.

В конце концов, я запускаю процесс, как показано ниже:

p = mp.Pool(processes=5)
pool_results = p.starmap(innerFold, args)

И я получаю:

Ошибка типа: new () отсутствует 1 обязательный позиционный аргумент: 'keyvals'

Кажется, что количество аргументов в порядке.Что мне здесь не хватает?

РЕДАКТИРОВАТЬ: Видимо, проблема связана с кадрами данных H2O.Если я преобразую их в панд DF, это работает.Любая идея, как я могу напрямую использовать H2O df?

EDIT2: Насколько я понимаю, аргументы, отправленные в функцию (например, innerFold выше), засечены.Поскольку объект h2o не может быть обработан, функция сработала после его преобразования в pandas df.

...