simpleimputer是填充数值型缺失值最稳妥方法,需注意输入为二维数组、异常值处理及pipeline封装避免数据泄露。

用 SimpleImputer 填充数值型缺失值最稳妥
直接用 SimpleImputer 是当前最推荐的做法,它比已弃用的 Imputer 更明确、更安全。默认策略是 "mean",但实际中常需根据分布选 "median"(对异常值鲁棒)或 "most_frequent"(适合离散型数值)。注意:它只接受二维数组,传入 pandas.DataFrame 会报 ValueError: Expected 2D array, got 1D array instead。
实操建议:
- 先用
df.select_dtypes(include=['number'])提取数值列,再送入SimpleImputer - 训练时用
fit_transform(),预测时只用transform(),避免数据泄露 - 若列中有
np.inf或-np.inf,SimpleImputer会静默失败——务必提前用np.isfinite()过滤
对类别型变量用 SimpleImputer(strategy='most_frequent') 要小心
SimpleImputer 支持字符串类型输入,但要求所有值必须是 Python 原生 str 或 None,不能混入 np.nan(pandas 默认缺失标识)或 pd.NA。否则会抛出 TypeError: ufunc 'isnan' not supported for the input types。
实操建议:
- 填充前统一转为 object 类型:
df_cat = df[cat_cols].astype('object') - 显式将
np.nan替换为None:df_cat = df_cat.where(pd.notna(df_cat), None) - 避免用
strategy='constant'填"missing"——后续做OneHotEncoder时可能意外引入新类别,影响线上一致性
别在 Pipeline 外单独 fit 缺失值处理器
常见错误是先用 SimpleImputer().fit_transform(X_train) 处理训练集,再用同样实例处理测试集。这看似可行,但一旦数据预处理逻辑变更(比如加新特征),容易漏掉对测试集的同步更新,导致训练/推理不一致。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
正确做法是把 imputer 封进 ColumnTransformer 或自定义 TransformerMixin 类,并整体套进 Pipeline:
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
num_pipe = Pipeline([('impute', SimpleImputer(strategy='median'))])
preproc = ColumnTransformer(
transformers=[('num', num_pipe, num_cols)],
remainder='passthrough'
)
pipe = Pipeline([('preproc', preproc), ('model', LogisticRegression())])
这样能保证每次 fit() 和 predict() 都走同一套逻辑,且 get_params() 可查、set_params() 可调。
用 pd.DataFrame.interpolate() 做时间序列插值要配对齐索引
当缺失发生在有明确时间顺序的列(如传感器读数)上,线性或时间插值比均值填充更合理。但 interpolate() 默认按整数索引插值,若原始 DataFrame 索引是 DatetimeIndex 却没设为 index,结果会错位。
实操建议:
- 先确保时间列是索引:
df = df.set_index('timestamp') - 用
method='time'而非'linear',它会自动按真实时间间隔加权 - 插值后记得重置索引:
df.reset_index(inplace=True),否则后续SimpleImputer会把时间列当特征一起处理
缺失值处理真正的难点不在“怎么填”,而在于“填完是否还保持原始分布形态”——尤其是类别频次偏斜、数值长尾、时间局部趋势这些隐含结构,简单策略很容易抹掉它们。上线前务必用 train_test_split(random_state=42) 固定分割,对比填充前后各列的统计量变化。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










