在Python 3.8中调用sklearn2pmml()函数抛出RuntimeError求助
scikit-learn逻辑回归模型转PMML时InvalidOpcodeException错误解决思路
问题复现
代码示例
from sklearn2pmml import sklearn2pmml from sklearn2pmml.pipeline import PMMLPipeline from sklearn.linear_model import LogisticRegression pipe_pmml = PMMLPipeline(steps=[('mapper', mapper), ('estimator', LogisticRegression(C = 0.01, penalty = 'l1', solver = 'liblinear', random_state = 1)) ]) pipe_pmml.fit(X_small, y) sklearn2pmml(pipe_pmml, pmml_filename, with_repr = True)
注:mapper为sklearn_pandas.DataFrameMapper实例
报错信息
Standard output is empty Standard error: Exception in thread "main" net.razorvine.pickle.InvalidOpcodeException: invalid pickle opcode: 0 at net.razorvine.pickle.Unpickler.dispatch(Unpickler.java:366) at org.jpmml.python.CustomUnpickler.dispatch(CustomUnpickler.java:31) at org.jpmml.python.PickleUtil$1.dispatch(PickleUtil.java:64) at net.razorvine.pickle.Unpickler.load(Unpickler.java:109) at org.jpmml.python.PickleUtil.unpickle(PickleUtil.java:85) at com.sklearn2pmml.Main.run(Main.java:78) at com.sklearn2pmml.Main.main(Main.java:6
当前依赖版本
- sklearn==0.0
- scikit-learn==1.1.2
- sklearn-pandas==2.2.0
- sklearn2pmml==0.86.3
解决思路
- 移除冲突的占位依赖:
sklearn==0.0是无实际功能的占位包,与scikit-learn==1.1.2存在依赖冲突,会干扰pickle序列化流程。执行以下命令卸载:pip uninstall -y sklearn - 对齐版本兼容性:sklearn2pmml对scikit-learn版本有严格适配要求,0.86.3版本仅支持到scikit-learn 1.0.x,而当前使用的1.1.2超出适配范围,导致底层解析出错。两种调整方案:
- 降级scikit-learn到兼容版本:
pip install scikit-learn==1.0.2 - 升级sklearn2pmml到支持1.1.x的版本(如0.96.0及以上):
pip install sklearn2pmml==0.96.0
- 降级scikit-learn到兼容版本:
- 简化序列化参数:去掉
sklearn2pmml函数中的with_repr=True参数,该参数会额外序列化对象的repr信息,增加解析风险,修改为:sklearn2pmml(pipe_pmml, pmml_filename) - 验证第三方Mapper兼容性:若调整后仍有问题,可尝试将
DataFrameMapper替换为scikit-learn原生的ColumnTransformer,避免第三方组件的序列化兼容性问题。
内容的提问来源于stack exchange,提问作者S_Econometrics
相关产品推荐
相关产品推荐

