Aru*_*unK 9 python pickle apache-spark dill
我想在pyspark的udf中使用石灰 explainer。我以前已经训练过表格解释器,并且按照链接中的建议将其存储为莳萝模型
loaded_explainer = dill.load(open('location_to_explainer','rb'))
def lime_explainer(*cols):
selected_cols = np.array([value for value in cols])
exp = loaded_explainer.explain_instance(selected_cols, loaded_model.predict_proba, num_features = 10)
mapping = exp.as_map()[1]
return str(mapping)
Run Code Online (Sandbox Code Playgroud)
但是,这会花费很多时间,因为看来很多计算都发生在驱动程序上。然后,我一直在尝试使用Spark广播将解释器广播给执行者。
broadcasted_explainer= sc.broadcast(loaded_explainer)
def lime_explainer(*col):
selected_cols = np.array([value for value in cols])
exp = broadcasted_explainer.value.explain_instance(selected_cols, loaded_model.predict_proba, num_features = 10)
mapping = exp.as_map()[1]
return str(mapping)
Run Code Online (Sandbox Code Playgroud)
但是,我在广播中遇到了一个腌制错误。
PicklingError:无法在0x7f69fd5680d0>进行酸洗:在lime.discretize上进行属性查找失败
有人可以帮忙吗?是否有类似的东西dill可以代替spark中使用的cloudpickler?
小智 0
看看这个来源,似乎你别无选择,只能使用提供的pickler。因此,我只能建议您将 dill 嵌套在默认的 pickler 中。不理想,但它可以工作。尝试类似的方法:
broadcasted_explainer = dill.loads(sc.broadcast(dill.dumps(loaded_explainer)).value)
Run Code Online (Sandbox Code Playgroud)
或者您可以尝试调用Dill Extend() 方法,该方法应该将 Dill 数据类型添加到默认的 pickle 包调度中。不知道这是否有效,但你可以尝试一下!