Я пытаюсь использовать многопроцессорность в 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.