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

如何正确使用Simple Imputer处理训练集与测试集的NaN值?

正确处理训练/测试集缺失值的方式

第一种用法(训练集fit_transform,测试集transform)才是符合机器学习规范的正确做法,第二种方法会导致严重问题,原因如下:

  • 机器学习里,测试集的作用是模拟模型上线后遇到的未知数据,你不能提前用测试集自身的统计信息(比如中位数、众数)填充缺失值——这属于「数据泄露」。一旦这么做,模型训练时间接获取了测试集的分布信息,最终的评估结果会失真,没法反映模型的真实泛化能力。
  • 正确逻辑是:所有预处理规则(包括缺失值填充的统计量)都必须只从训练集中学习,再把这套规则应用到测试集上,保证训练和测试数据的分布一致,这样模型的评估结果才可信。

结合你的需求,修正后的代码示例如下:

from sklearn.impute import SimpleImputer

# 处理数值型特征的缺失值
num_cols_nan = ["你的数值特征列1", "你的数值特征列2"]
# 仅在训练集上拟合并完成填充
imp_num = SimpleImputer(strategy='median')
train_df.loc[:, num_cols_nan] = imp_num.fit_transform(train_df.loc[:, num_cols_nan])
# 用训练集学到的中位数填充测试集
test_df.loc[:, num_cols_nan] = imp_num.transform(test_df.loc[:, num_cols_nan])

# 处理分类型特征的缺失值
cat_cols_nan = ["你的分类特征列1", "你的分类特征列2"]
# 仅在训练集上拟合并完成填充
imp_cat = SimpleImputer(strategy='most_frequent')
train_df.loc[:, cat_cols_nan] = imp_cat.fit_transform(train_df.loc[:, cat_cols_nan])
# 用训练集学到的众数填充测试集
test_df.loc[:, cat_cols_nan] = imp_cat.transform(test_df.loc[:, cat_cols_nan])

补充说明:如果只是做探索性数据分析(比如单纯查看单数据集的分布),用各自的fit_transform没问题,但只要是为了训练机器学习模型,就必须严格遵循「训练集学规则,测试集用规则」的原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:32:29