使用spherecluster包进行球形k均值聚类时出现模块导入报错
问题成因
该报错由scikit-learn与spherecluster的版本兼容问题导致:
- scikit-learn 1.0及以上版本重构了内部私有模块结构,原
sklearn.cluster.k_means_模块被迁移重命名为sklearn.cluster._kmeans,旧导入路径被彻底移除 - 你安装的spherecluster为旧发布版本,代码仍在引用已废弃的旧路径,因此触发
ModuleNotFoundError
你当前环境安装的scikit-learn 1.0.2属于重构后的版本,与旧版spherecluster不兼容,该问题与numpy、scipy的安装状态无关。
解决方法
可根据自身需求选择以下任意一种方案修复:
方案1:降级scikit-learn到兼容版本(无需修改代码,最简便)
将当前环境的scikit-learn降级到0.24.x最终稳定版,该版本保留了spherecluster依赖的旧模块路径,无需修改源码即可直接使用。
在对应环境的终端执行对应命令即可:
- 用conda管理环境时执行:
conda install scikit-learn=0.24.2 - 用pip管理包时执行:
pip install scikit-learn==0.24.2
安装完成后重新导入spherecluster即可正常使用。
方案2:修改本地spherecluster源码适配新版scikit-learn(无需降级依赖)
如果需要保留当前高版本scikit-learn,可手动修改本地安装的spherecluster源码修正导入路径:
- 根据报错提示进入spherecluster安装目录,即路径
/Users/username/anaconda3/lib/python3.9/site-packages/spherecluster/(虚拟环境下对应替换为虚拟环境的site-packages路径) - 打开目录下的
spherical_kmeans.py文件,定位到第7行附近的导入代码块,将原有内容:
from sklearn.cluster.k_means_ import ( _check_sample_weight, _init_centroids, _labels_inertia, _tolerance, _validate_center_shape, k_means, )
替换为:
from sklearn.cluster._kmeans import ( _check_sample_weight, _init_centroids, _labels_inertia, _tolerance, _validate_center_shape, k_means, )
- 保存文件后重新尝试导入,若同目录下其他文件也存在引用
sklearn.cluster.k_means_的代码,用同样方式把路径替换为sklearn.cluster._kmeans即可。
注意:scikit-learn中下划线开头的模块属于内部私有接口,后续版本仍可能调整路径,如果后续升级scikit-learn后再次出现同类导入错误,按照上述逻辑修正对应导入路径即可。
内容的提问来源于stack exchange,提问作者siva82kb
相关产品推荐
相关产品推荐

