SimpleImputer是scikit-learn中处理缺失值的核心工具,自1.2版本起Imputer已移除,且strategy参数必须显式指定;支持mean、median(仅数值)、most_frequent(数值/类别)、constant(需fill_value)四种策略;不支持混合数据类型统一填充,须分列处理;fit_transform仅限训练集,测试集只能transform,否则导致评估失真。
SimpleImputer 是 scikit-learn 处理缺失值的主力工具,但要注意:1.2 版本起,Imputer 类已彻底移除,所有代码必须改用 SimpleImputer,否则会报 NameError: name 'Imputer' is not defined。
SimpleImputer 的 strategy 参数必须显式指定
老版本(<1.0)允许省略 strategy 默认为 'mean',但在 1.2+ 中,不传 strategy 会直接抛 TypeError: init() missing 1 required positional argument: 'strategy'。
常见合法取值包括:
-
'mean':仅适用于数值列,内部调用np.nanmean -
'median':对异常值更鲁棒,同样只支持数值型 -
'most_frequent':可处理数值和类别型(如字符串、整数标签),按列统计众数 -
'constant':需额外传fill_value,比如fill_value='missing'或fill_value=-999
注意:'most_frequent' 在含 NaN 的字符串列中可能返回 np.nan(若该列无重复非空值),建议先用 pandas.Series.mode().iloc[0] 验证。
数值列与类别列不能混用同一个 SimpleImputer
SimpleImputer 不支持跨类型策略——比如用 mean 填数值列、同时用 most_frequent 填字符串列。强行传入混合 dtype 的 DataFrame 会触发:
ValueError: Cannot use mean strategy with non-numeric data
正确做法是分列处理:
- 先用
df.select_dtypes(include='number')提取数值列 - 再用
df.select_dtypes(exclude='number')提取非数值列 - 分别初始化两个
SimpleImputer实例,各自fit_transform - 最后用
pd.concat合并结果(注意索引对齐)
如果漏掉索引重置,合并后可能出现行错位,导致特征与标签错配。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
集成算法(如 RandomForestClassifier)不原生跳过缺失值
虽然部分树模型(如 XGBoost、LightGBM)能自动处理缺失值,但 scikit-learn 自家的 RandomForestClassifier、GradientBoostingRegressor 等在 1.2 版本中仍要求输入完全无缺失。它们不会忽略 NaN,也不会静默填充——而是直接报错:
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
这意味着:即使你用了集成模型,也必须前置做缺失值处理,不能依赖模型“自己搞定”。这点常被误读,尤其从 LightGBM 切换过来的用户容易踩坑。
SimpleImputer 的 fit_transform 必须在训练集上完成,且测试集只能用 transform;如果对测试集单独 fit_transform,会导致均值/众数不一致,模型评估失真。这个细节在 pipeline 外手动操作时最容易忽略。