You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载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的类路径或存在形式发生了变化。可尝试两种方式:

    1. 查找保存该文件时使用的sklearn版本,安装对应版本后再读取;
    2. 用自定义反序列化器修正类映射:
      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已移除该类,需替换为功能等价的实现(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:51:08