使用新版scikit-learn加载旧训练模型时遇模块缺失错误
解决升级Python和scikit-learn后加载旧模型的ModuleNotFoundError问题
错误原因
scikit-learn在版本迭代中重构了模块结构:在0.20.3版本中,逻辑回归相关类位于sklearn.linear_model.logistic子模块;而升级到1.1.3版本后,该子模块被合并到sklearn.linear_model主模块中,旧模块路径被移除,导致joblib加载旧模型时触发ModuleNotFoundError。
解决方案
1. 临时模块映射(快速修复)
在加载模型前,手动将旧模块路径映射到新的模块位置,让pickle能找到对应的类:
import sys from sklearn.linear_model import logistic as _logistic # 注册旧模块路径,兼容pickle加载 sys.modules['sklearn.linear_model.logistic'] = _logistic # 然后加载模型 from joblib import load model = load('你的模型文件路径.joblib')
2. 重新训练模型(长期最优方案)
跨大版本的模型兼容性难以保证,建议在Python3.10.6 + scikit-learn1.1.3的新环境中重新训练模型并保存,这样既能避免兼容性问题,还能利用新版本的性能优化和bug修复。
3. 临时降级环境导出模型(备选方案)
如果无法重新训练,可以创建一个与原环境一致的虚拟环境(Python3.6.5 + scikit-learn0.20.3),加载旧模型后,将模型转换为更通用的格式(如ONNX),或者在旧环境中重新保存模型后尝试在新环境加载(此方法兼容性仍有风险)。
内容的提问来源于stack exchange,提问作者Deepak Tatyaji Ahire
相关产品推荐
相关产品推荐

