为什么SimpleImputer处理后数据集所有特征都变为分类型数据?
问题原因
- 未提前拆分数值列与分类列,将所有特征统一输入SimpleImputer处理:
SimpleImputer的fit_transform接口返回numpy数组,当输入包含数值、字符串混合类型时,数组会统一转换为object类型,后续直接转DataFrame后所有列都会被标记为object类型,因此被识别为分类型特征。 - 存在两处不规范的数据泄露问题:一是测试集单独调用
fit_transform拟合SimpleImputer,二是测试集数值列用自身均值填充,两类操作都会导致模型评估结果不符合实际上线效果。
修复方案
先拆分列类型,分别做填充,且所有预处理算子仅用训练集拟合:
# 拆分数值列、分类列 numeric_cols = X.select_dtypes(include=['int64', 'float64']).columns cat_cols = X.select_dtypes(include=['object', 'category']).columns # 数值列填充:统一使用训练集均值 train_numeric_mean = X[numeric_cols].mean() X[numeric_cols] = X[numeric_cols].fillna(train_numeric_mean) X_test[numeric_cols] = X_test[numeric_cols].fillna(train_numeric_mean) # 分类列填充:仅用训练集拟合众数填充器 cat_imputer = SimpleImputer(strategy="most_frequent") X[cat_cols] = cat_imputer.fit_transform(X[cat_cols]) X_test[cat_cols] = cat_imputer.transform(X_test[cat_cols])
上述方案仅对分类列做SimpleImputer处理,数值列原有数据类型会完整保留,不会出现所有特征都转为分类型的问题,同时也修复了数据泄露风险。
内容的提问来源于stack exchange,提问作者Cerdipinki
相关产品推荐
相关产品推荐

