sklearn.Imputer导入失败及pandas_ml报错求助
解决
pandas_ml 导入时的 AttributeError: module 'sklearn.preprocessing' has no attribute 'Imputer' 问题 问题根源
我之前碰到过一模一样的问题,这本质是版本兼容性的坑:
- scikit-learn在0.20版本之后,把
sklearn.preprocessing.Imputer彻底移到了sklearn.impute.SimpleImputer模块下 - 但
pandas_ml已经多年没维护了(最后一次更新是2018年),它的源码里还在硬调用旧位置的Imputer,所以你用新版sklearn时就会触发这个错误。
可行解决方案
方案1:安装兼容的旧版本依赖(快速临时解决)
既然pandas_ml只适配旧版sklearn,你可以在你的conda独立环境里安装scikit-learn 0.19.x和对应版本的pandas_ml:
# 先激活你的conda环境 conda activate Lab1_B # 安装经过验证的兼容版本组合 conda install scikit-learn=0.19.2 pandas-ml=0.5.1
这个版本组合是完全匹配的,因为pandas_ml 0.5.1就是基于sklearn 0.19开发的。
方案2:替换为原生pandas + sklearn(长期推荐)
由于pandas_ml已经停止维护,后续肯定还会遇到更多版本兼容问题,更稳妥的方式是直接用原生工具栈替代:
- 原来用
pandas_ml.ModelFrame处理的逻辑,完全可以用普通的pandas.DataFrame配合sklearn原生模块实现 - 比如原来用
Imputer处理缺失值的逻辑,替换成新版的SimpleImputer示例:
import pandas as pd from sklearn.impute import SimpleImputer import numpy as np # 读取你的数据 df = pd.read_csv("your_dataset.csv") # 初始化填充器(比如用均值填充缺失值) imputer = SimpleImputer(strategy='mean', missing_values=np.nan) # 对需要处理的列执行填充 df[['target_col1', 'target_col2']] = imputer.fit_transform(df[['target_col1', 'target_col2']])
这种方式不仅避开了兼容坑,还能用上sklearn的最新功能。
方案3:手动修改pandas_ml源码(不推荐)
如果你一定要继续用pandas_ml,可以临时修改它的源码适配新版sklearn:
- 找到报错的文件:
~/anaconda3/envs/Lab1_B/lib/python3.7/site-packages/pandas_ml/skaccessors/preprocessing.py - 打开文件后做两处修改:
另外还要注意后续代码中对填充器参数的调用(比如原来的# 1. 在文件顶部导入新的填充模块 from sklearn.impute import SimpleImputer # 2. 把第13行的`pp.Imputer`替换成`SimpleImputer`missing_values='NaN'要改成missing_values=np.nan) - 保存文件后重新导入
pandas_ml即可
不过这个方法只适合临时救急,因为后续更新pandas_ml时会覆盖你的修改,而且可能还有其他隐藏的兼容问题没被发现。
内容的提问来源于stack exchange,提问作者fecke9296
相关产品推荐
相关产品推荐

