Python加载pickle模型报找不到sklearn.linear_model模块错误解决
问题描述
搭建班加罗尔房价预测简易机器学习网页项目时,调用pickle.load()加载本地存储的预训练模型文件抛出模块不存在错误,手动在代码中导入对应模块后PyCharm仍无法识别,错误信息如下:
Traceback (most recent call last): File "C:\Code\BHP\server\util.py", line 30, in <module> load_saved_artifacts() File "C:\Code\BHP\server\util.py", line 24, in load_saved_artifacts __model = pickle.load(f) ModuleNotFoundError: No module named 'sklearn.linear_model' Process finished with exit code 1
当前util.py代码如下:
import json import pickle __locations = None __data_columns = None __model = None def get_location_names(): return __locations def load_saved_artifacts(): print("loading saved artifacts...start") global __data_columns global __locations with open("./artifacts/columns.json", 'r') as f: __data_columns = json.load(f)["data_columns"] __locations = __data_columns[3:] with open("./artifacts/banglore_home_prices_model.pickle", 'rb') as f: __model = pickle.load(f) print("Loading saved artifacts... Done.") if __name__ == '__main__': load_saved_artifacts() print(get_location_names())
项目配套columns.json存储了模型训练用到的房屋面积、卫生间数、卧室数、班加罗尔各区位名称等特征字段。
报错原因
这个错误本质是当前运行代码的Python环境里,没有模型序列化时依赖的scikit-learn对应组件,常见诱因有三个:
- 装错包:直接执行
pip install sklearn安装的是早就废弃的占位空包,根本不是正式的scikit-learn机器学习库 - 环境不匹配:PyCharm选中的Python解释器,和终端里安装依赖用的解释器不是同一个环境,包装到了A环境,跑代码用的B环境,自然找不到模块
- 版本不兼容:本地安装的scikit-learn版本和训练这个pickle模型时用的版本差异过大,内部模块结构调整,加载时找不到对应路径
可行解决方案
按顺序排查操作即可:
- 先对齐解释器环境
查看PyCharm窗口右下角显示Python版本的区域,点击确认当前选中的解释器是项目所用的虚拟环境/目标系统Python,不要选到其他conda环境、WSL环境或其他项目的独立虚拟环境。 - 清理错误包,安装匹配版本的依赖
打开PyCharm底部的Terminal标签,确认终端输入行最前面括号内的环境名和刚才选中的解释器一致后,依次执行以下命令:
指定1.0.2版本是为了和教程训练模型时的scikit-learn版本对齐,避免跨大版本带来的加载兼容问题pip uninstall -y sklearn pip install scikit-learn==1.0.2 - 验证安装后重试
Windows系统在终端执行pip list | findstr scikit-learn,能查到版本号为1.0.2的scikit-learn条目即说明安装正确。回到代码开头补上import sklearn.linear_model,等PyCharm后台索引完成(状态栏进度条跑完),再运行util.py即可正常加载模型。 - 以上步骤操作后仍报错的,检查模型文件完整性
进入项目artifacts目录查看banglore_home_prices_model.pickle的文件大小,正常该模型文件大小在几百KB到1MB区间,如果文件只有几KB,说明下载过程中文件损坏,替换为完整的模型文件即可。
内容的提问来源于stack exchange,提问作者Yun
相关产品推荐
相关产品推荐

