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

scikit-learn版本兼容报错:ModuleNotFoundError求助及cPickle替换疑问

问题解决:scikit-learn版本兼容与pickle加载错误

报错原因解析

scikit-learn 0.18版本中,PCA类的模块路径是sklearn.decomposition.pca,但在1.2.1等新版本中,内部结构重构后该类被移至sklearn.decomposition._pca,直接加载旧版本序列化的PCA模型就会触发ModuleNotFoundError。

另外,你把cPickle替换为import pickle as cPickle是完全没问题的——Python3的pickle模块已经整合了原cPickle的全部功能,这个改动不会影响代码运行。

解决方案

方案1:自定义Unpickler重定向模块路径

修改preprocessing.py中加载PCA模型的代码,用自定义的Unpickler将旧模块路径映射到新路径:

import pickle as cPickle
from sklearn.decomposition import PCA

class PCAUnpickler(cPickle.Unpickler):
    def find_class(self, module, name):
        # 重定向旧的PCA模块路径到当前版本的PCA类
        if module == 'sklearn.decomposition.pca' and name == 'PCA':
            return PCA
        return super().find_class(module, name)

# 替换原加载代码(原代码是pca = cPickle.load(fid))
with open(pca_model, 'rb') as fid:
    pca = PCAUnpickler(fid).load()

方案2:临时添加模块别名

如果不想修改加载逻辑,可以在代码最开头(比如run_DeepDDI.py的顶部)添加以下代码,临时把旧模块名映射到新模块:

import sys
from sklearn.decomposition import _pca

# 给旧模块名创建别名,让pickle能找到对应类
sys.modules['sklearn.decomposition.pca'] = _pca

这样再加载旧版本序列化的PCA模型时,Python就能正确找到对应的类了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:15:27