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

如何确保make_column_transformer正确标记object特征避免XGBoost报错

XGBoost新数据预测特征不匹配问题修复

错误根因

你的column_trans配置本身没有问题,错误出在调用逻辑:对新数据集调用了fit_transform而非仅调用transform。
训练阶段你在完整训练集上fit预处理器时,OneHotEncoder会记录每个分类列的所有唯一取值,编码后加上passthrough的数值列,总共生成19维特征,和XGBoost模型训练时记录的f0~f18特征列表完全对应。
但你处理单条新数据时重新执行了fit操作,此时OneHotEncoder只会读取当前单条数据里出现的分类值——每个分类列在单条样本里只有1个取值,最终编码出来只有10维特征,和模型期望的输入维度差了9维,直接触发特征名不匹配报错。

修复方案

  1. 严格遵守预处理器的使用规则:预处理器只允许在训练集上执行一次fit,后续所有验证、测试、新数据预测场景,都只能用训练好的预处理器执行transform,绝对不能在新数据上重新fit。
    训练阶段参考写法:
# 仅在训练集上执行fit,训练完成后可将预处理器和模型一起保存
X_train_processed = column_trans.fit_transform(X_train)
optimal_params.fit(X_train_processed, y_train)
  1. 新数据预测阶段去掉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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:03:28