PySpark加载保存的MultiLayerPerceptronClassifier报layers无默认值如何解决
问题原因
该报错是Spark 3.1.2及更低版本的已知缺陷:MultilayerPerceptronClassifier(MLPC)的layers参数没有被正确写入模型持久化的元数据中。直接运行Pipeline时参数保存在内存中不会丢失,所以运行正常;模型保存到磁盘再重新加载时,系统读取不到layers参数就会抛出该错误。
解决方案
- 方案1:升级Spark版本到3.2.0及以上,该版本官方已修复MLPC模型参数持久化的缺陷,升级后重新训练保存模型即可正常加载使用。
- 方案2:如果无法升级Spark版本,可在加载Pipeline模型后手动给MLPC阶段补设
layers参数,代码示例如下:
from pyspark.ml import PipelineModel saved_model = "/home/user/Desktop/algorithms/mlpc_model_8979" read_model = PipelineModel.load(saved_model) # 替换索引为你训练时MLPC在Pipeline中的实际位置,示例为最后一个阶段 mlpc_stage = read_model.stages[-1] # 填入训练时设置的layers参数值即可 mlpc_stage.set(mlpc_stage.layers, [200, 30, 10]) # 再执行预测不会报错 pred = read_model.transform(df)
- 方案3:如果你的Pipeline只有MLPC一个阶段,可直接单独保存、加载MLPC模型,无需通过Pipeline封装,也可规避该问题:
# 训练完成后单独保存模型 mlpc_model.save("mlpc_single_model") # 加载时直接调用对应类的load方法 from pyspark.ml.classification import MultilayerPerceptronClassificationModel read_mlpc = MultilayerPerceptronClassificationModel.load("mlpc_single_model")
内容的提问来源于stack exchange,提问作者Laenka-Oss
相关产品推荐
相关产品推荐

