微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

并行运行 python vaex.ml.catboost.CatBoostModel.fit 数倍的正确方法是什么?

如何解决并行运行 python vaex.ml.catboost.CatBoostModel.fit 数倍的正确方法是什么?

说明

我有一个 python 代码,它顺序调用 vaex.ml.catboost.catboostModel.fit 3 次。 需要很多时间,我想并行运行vaex.ml.catboost.catboostModel.fit

问题

按顺序和并行运行 vaex.ml.catboost.catboostModel.fit 时得到不同的结果。当然,我做错了。我希望并行结果非常接近顺序结果(种子不是硬编码的,所以总会有一些小的波动)。顺序和并行版本产生绝对无法比拟的结果。

这是顺序代码。它产生 approved result

estimator = catboostModel(
        features=features + features_cat,target=target,num_boost_round=700,prediction_name="catboost_prediction",prediction_type=prediction_type
    )
 
for fold in folds:
    logging.info(f"training fold: {fold}")  # 1,2,3
    df_train = df[df.cv_fold != fold]
    df_val = df[df.cv_fold == fold]
    estimator.fit(df=df_train,evals=[df_val],early_stopping_rounds=100,verbose_eval=True)
    cv_scores[cv_fold == fold] = estimator.predict(df_val)

                

这是我的并行代码

import concurrent.futures
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future_to_result = {executor.submit(train_fold,fold,cv_scores,df,task,estimator): fold for fold in
                        folds}
    for future in concurrent.futures.as_completed(future_to_result):
        res = future_to_result[future]
        (fold,result) = future.result()
        logging.info(f"completed future for {fold},result: {result.shape}")
        cv_scores[cv_fold == fold] = result

def train_fold(fold,estimator: catboostModel):
    logging.info(f"training fold: {fold}")
    df_train = df[df.cv_fold != fold]
    df_val = df[df.cv_fold == fold]
    estimator.fit(df=df_train,verbose_eval=True)
    result = estimator.predict(df_val)

    return (fold,result)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。