在没有进行多处理的数据帧上运行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)]
答案 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在这里可以很好地工作。