如何确保make_column_transformer正确标记object特征避免XGBoost报错
XGBoost新数据预测特征不匹配问题修复
错误根因
你的column_trans配置本身没有问题,错误出在调用逻辑:对新数据集调用了fit_transform而非仅调用transform。
训练阶段你在完整训练集上fit预处理器时,OneHotEncoder会记录每个分类列的所有唯一取值,编码后加上passthrough的数值列,总共生成19维特征,和XGBoost模型训练时记录的f0~f18特征列表完全对应。
但你处理单条新数据时重新执行了fit操作,此时OneHotEncoder只会读取当前单条数据里出现的分类值——每个分类列在单条样本里只有1个取值,最终编码出来只有10维特征,和模型期望的输入维度差了9维,直接触发特征名不匹配报错。
修复方案
- 严格遵守预处理器的使用规则:预处理器只允许在训练集上执行一次
fit,后续所有验证、测试、新数据预测场景,都只能用训练好的预处理器执行transform,绝对不能在新数据上重新fit。
训练阶段参考写法:
# 仅在训练集上执行fit,训练完成后可将预处理器和模型一起保存 X_train_processed = column_trans.fit_transform(X_train) optimal_params.fit(X_train_processed, y_train)
- 新数据预测阶段去掉fit逻辑,直接用训练好的预处理器转换数据:
# 注意:这里只调用transform,不要调用fit_transform X_new = column_trans.transform(new) preds = optimal_params.predict(X_new)
额外优化建议
初始化OneHotEncoder时加上handle_unknown='ignore'参数,后续如果新数据里出现训练集没见过的分类取值,编码器会自动把该位置编码为0,不会直接抛出异常:
column_trans = make_column_transformer( (OneHotEncoder(handle_unknown='ignore'), ['type_school','school_accreditation', 'gender','interest','residence','parent_was_in_college']), remainder='passthrough')
内容的提问来源于stack exchange,提问作者Tyrone_Slothrop
相关产品推荐
相关产品推荐

