如何正确使用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
相关产品推荐
相关产品推荐

