使用块进行的多处理不适用于predict_proba

时间:2019-02-21 19:59:54

标签: python scikit-learn pickle python-multiprocessing

在没有进行多处理的数据帧上运行predict_proba时,我得到了预期的行为。代码如下:

probabilities_data = classname.perform_model_prob_predictions_nc(prediction_model, vectorized_data)

其中:perform_model_prob_predictions_nc是:

def perform_model_prob_predictions_nc(model, dataFrame): 
    try:
        return model.predict_proba(dataFrame)
    except AttributeError:
        logging.error("AttributeError occurred",exc_info=True)

但是当我尝试使用块和多处理来运行相同的功能时:

probabilities_data = classname.perform_model_prob_predictions(prediction_model, chunks, cores)

其中perform_model_prob_predictions是:

def perform_model_prob_predictions(model, dataFrame, cores=4): 
    try:
        with Pool(processes=cores) as pool:
            result = pool.map(model.predict_proba, dataFrame)
            return result
    except Exception:
        logging.error("Error occurred", exc_info=True)

我收到以下错误:

PicklingError: Can't pickle <function OneVsRestClassifier.predict_proba at 0x14b1d9730>: it's not the same object as sklearn.multiclass.OneVsRestClassifier.predict_proba

作为参考:

cores = 4
vectorized_data = pd.DataFrame(...)
chunk_size = len(vectorized_data) // cores + cores
chunks = [df_chunk for g, df_chunk in vectorized_data.groupby(np.arange(len(vectorized_data)) // chunk_size)]

1 个答案:

答案 0 :(得分:0)

Pool在内部使用Queue,并且需要对其中的所有内容进行腌制。该错误告诉您不能腌制PicklingError: Can't pickle <function OneVsRestClassifier.predict_proba

您有几种选择,this SO post中有一些描述。另一种选择是将joblib loky 后端一起使用。后者使用cloudpickle,允许序列化默认pickle不支持的结构。

代码大致如下所示:

from joblib import Parallel, delayed

Parallel(n_jobs=4, backend='loky')(delayed(model.predict_proba)(dataFrame=dataFrame) for chunk in chunks)

请注意,对对象进行经典的酸洗这样的方法通常是不健康的想法。 dill在这里可以很好地工作。