加载pickle文件遇AttributeError:无法获取EuclideanDistance属性
问题:读取Pickle文件时触发sklearn AttributeError错误
错误信息
AttributeError: Can't get attribute 'EuclideanDistance' on <module 'sklearn.metrics._dist_metrics' from '/Users/adamhitchmough/opt/anaconda3/lib/python3.8/site-packages/sklearn/metrics/_dist_metrics.cpython-38-darwin.so'>
运行代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import sys import os import sklearn interpvall = pd.read_pickle('/Users/adamhitchmough/Downloads/KNN_swi_Vall_k50000.pkl')
已尝试升级sklearn但问题未解决,以下是可行的排查和解决方法:
版本兼容性修正:该pickle文件大概率是用旧版本sklearn保存的,新版本中
EuclideanDistance的类路径或存在形式发生了变化。可尝试两种方式:- 查找保存该文件时使用的sklearn版本,安装对应版本后再读取;
- 用自定义反序列化器修正类映射:
注:如果当前版本sklearn已移除该类,需替换为功能等价的实现(如import pickle import pandas as pd class CustomUnpickler(pickle.Unpickler): def find_class(self, module, name): if module == "sklearn.metrics._dist_metrics" and name == "EuclideanDistance": from sklearn.metrics._dist_metrics import EuclideanDistance return EuclideanDistance return super().find_class(module, name) with open("/Users/adamhitchmough/Downloads/KNN_swi_Vall_k50000.pkl", "rb") as f: interpvall = CustomUnpickler(f).load()sklearn.metrics.pairwise.euclidean_distances),具体结合模型逻辑调整。
重新生成Pickle文件:若能获取原始训练代码和数据,用当前版本sklearn重新训练并保存模型,彻底解决版本兼容问题。
重装sklearn确保完整性:升级不彻底可能导致文件损坏,尝试卸载后重装:
# pip方式 pip uninstall scikit-learn -y pip install scikit-learn # conda方式 conda remove scikit-learn conda install scikit-learn
内容的提问来源于stack exchange,提问作者Adam Hitchmough
相关产品推荐
相关产品推荐

