Я новичок в параллельной обработке в Python.Мне удалось запустить мой код параллельно, однако, у меня все еще есть сомнения, сделал ли я это наиболее эффективным способом.Сначала я разделяю свои данные, как показано ниже:
gbm_param_combs = get_cartesian_prod(gbm_params)
random.Random(23).shuffle(gbm_param_combs)
gbm_param_combs = gbm_param_combs[501:506]
for counter, param in enumerate(gbm_param_combs):
param['counter'] = int(counter)
gbm_df0 = np.array_split(gbm_param_combs,5)[0]
gbm_df1 = np.array_split(gbm_param_combs,5)[1]
gbm_df2 = np.array_split(gbm_param_combs,5)[2]
gbm_df3 = np.array_split(gbm_param_combs,5)[3]
gbm_df4 = np.array_split(gbm_param_combs,5)[4]
Затем я создал функцию с несколькими входами, которые будут вызываться одновременно.В этой функции я подгоняю модель и вычисляю оценку ошибки.
def finalFold(params, feats_final, target, h2o_train, h2o_test, fold, pd_scores_final):
h2o_train = h2o.H2OFrame(h2o_train)
h2o_test = h2o.H2OFrame(h2o_test)
scores = []
random_state = 123
for param in params:
counter = param.get('counter')
param = {k:v for k, v in param.items() if k not in ('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('GBM TRAINING STARTS....')
gbm.train(x = feats_final,
y = target,
training_frame = h2o_train)
score = gbm.model_performance(h2o_test).r2()
pd_scores_final = pd_scores_final.append({'fold': int(fold),
'score': score,
'corr' : 0.0,
'param_idx': int(counter)},
ignore_index=True)
return pd_scores_final
Наконец, я вызываю эту функцию со звездообразным изображением, как показано ниже:
p = mp.Pool(processes=5)
.....
for fold, (train_index, test_index) in enumerate(kfolds.split(pd_data)):
.....
argsGBM = [(gbm_df0, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM),
(gbm_df1, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM),
(gbm_df2, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM),
(gbm_df3, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM),
(gbm_df4, feats_final, target, h2o_train.as_data_frame(), h2o_test.as_data_frame(), fold, pd_scores_final_GBM)]
pool_results3 = p.starmap(finalFold, argsGBM)
for k in range(0,len(pool_results3)):
if k ==0:
pd_scores_final_GBM = pd.DataFrame(pool_results3[k])
else:
pd_scores_final_GBM = pd.concat([pd_scores_final_GBM,pd.DataFrame(pool_results3[k])], axis=0, ignore_index=True)
Однако я вижу, чторезультаты в отдельных частях pool_results3 идентичны.То есть:
![enter image description here](https://i.stack.imgur.com/BbOYp.jpg)
![enter image description here](https://i.stack.imgur.com/6DfEH.jpg)
Что не так с кодом?