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

导入imblearn SMOTE与sklearn DistanceMetric报ImportError的解决方案

从imblearn导入SMOTE触发DistanceMetric导入错误的原因与解决方案

问题复现

导入SMOTE时触发报错:

from imblearn.over_sampling import SMOTE

报错信息:

ImportError: cannot import name 'DistanceMetric' from 'sklearn.metrics' (D:\Programas\Anaconda\lib\site-packages\sklearn\metrics\__init__.py)

尝试安装scikit-learn==1.1.0后直接导入DistanceMetric仍报相同错误:

!pip install scikit-learn==1.1.0 --user
from sklearn.metrics import DistanceMetric as _DistanceMetric

报错信息与之前一致。

1. 包安装路径冲突,指定版本未实际生效

使用--user参数安装包时,包会被安装到当前用户的Python包目录,优先级低于Anaconda全局环境的site-packages目录,代码运行时实际加载的还是原有不兼容版本的scikit-learn,新安装的1.1.0版本没有被调用。
对应解决方案:

  • 先彻底卸载当前环境下所有scikit-learn、imbalanced-learn残留,依次执行命令:
pip uninstall -y scikit-learn imbalanced-learn
conda uninstall -y scikit-learn imbalanced-learn
  • 去掉--user参数,在当前激活的conda环境中重新安装兼容版本:
pip install scikit-learn==1.1.0 imbalanced-learn==0.9.1
  • 安装完成后执行校验代码,确认实际加载的scikit-learn版本为1.1.0、路径匹配当前环境:
import sklearn
print(sklearn.__version__)
print(sklearn.__file__)

如果输出版本不是1.1.0,说明存在多Python环境/内核冲突,切换到对应安装环境的内核即可。

2. scikit-learn与imbalanced-learn版本适配错误

DistanceMetric在不同版本scikit-learn中的导入路径存在差异:scikit-learn 1.2及以上版本已将DistanceMetric从sklearn.metrics迁移至sklearn.metrics.pairwise路径下。若imbalanced-learn版本过低(<0.10.0),会固定从旧路径sklearn.metrics查找该类,与高版本scikit-learn不兼容;若imbalanced-learn版本过高,对scikit-learn的最低版本要求超过1.1.0,也会出现路径适配问题。
对应解决方案:

  • 无需硬锁定scikit-learn 1.1.0版本,直接安装官方预适配的最新稳定版组合即可:
pip install -U scikit-learn imbalanced-learn
  • 若必须使用低版本环境,严格按照官方兼容配对规则安装:
    • imbalanced-learn 0.9.x 适配 scikit-learn 1.0.x ~ 1.1.x
    • imbalanced-learn 0.10.x ~ 0.12.x 适配 scikit-learn 1.2.x ~ 1.4.x
    • imbalanced-learn 0.13.x 适配 scikit-learn 1.5.x及以上版本

3. 安装文件损坏或缓存残留

历史安装、卸载操作未完全清理旧版本文件,比如sklearn/metrics/__init__.py为旧版本残留文件,未包含DistanceMetric的导出语句,即使重新安装包,也可能因为本地pip缓存未更新导致损坏文件未被替换。
对应解决方案:

  • 先清空本地pip安装缓存:
pip cache purge
  • 定位到报错信息中提示的scikit-learn安装路径(即报错括号内的D:\Programas\Anaconda\lib\site-packages\目录),手动删除该目录下所有scikit_learn*、imbalanced_learn*开头的文件夹,再重新执行安装命令。

4. 交互式环境内核未重启,旧版本包持续驻留

在Jupyter Notebook/Lab类交互式环境中运行代码时,内核启动时就已经加载了环境中的旧版本包,即使在单元格中执行pip安装新版本包,内核不会自动替换已加载的模块,手动调用importlib.reload也无法解决跨包依赖的加载问题。
对应解决方案:

  • 完成包安装操作后,直接点击交互式环境界面的重启内核按钮,完全重启内核进程。
  • 重启后先运行版本校验代码确认scikit-learn版本正确,再执行SMOTE导入逻辑。

内容的提问来源于stack exchange,提问作者SmackCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:15:39