Kaggle泰坦尼克号数据集Pipeline预测出现未知类别错误如何解决
问题原因
你触发报错的核心原因是两点预处理逻辑错误:
- 重复执行预处理流程:你搭建的Pipeline已经完整包含了插补、编码的预处理步骤,且在
pipe.fit(X_train, y_train)阶段已经用训练集完成了所有预处理器的拟合。但你后续手动对X_test做了插补、编码转换,把已经转换成数值的特征再次传入Pipeline,此时Pipeline内部的OrdinalEncoder会把你提前转好的0.0、1.0数值当成新的类别输入,和它在训练阶段学习到的原始字符类(比如male/female)完全不匹配,直接触发未知类别报错。 - 测试集误用
fit_transform:就算你要手动做预处理,测试集也只能调用transform方法,不能用fit_transform重新拟合插补器和编码器,否则会造成数据泄露,得到不符合训练逻辑的预处理结果。
解决方案
直接删除所有你手动编写的测试集预处理代码,调用pipe.predict()时直接传入原始未处理的X_test即可,Pipeline会自动调用训练阶段拟合好的预处理器对测试集做标准化处理,完全不需要手动干预。
修改后的预测代码仅需要保留一行:
# 直接传入原始测试集即可,不需要手动做插补、编码 preds = pipe.predict(X_test)
额外说明:你编写的X_test = X_test.dropna(axis=0)也可以删除,因为训练阶段已经用SimpleImputer处理缺失值,测试集删除缺失值属于预处理逻辑不一致,还会丢失需要预测的样本。
优化建议
- 泰坦尼克号是二分类任务,你当前使用的
XGBRegressor是回归模型,建议替换为XGBClassifier匹配任务类型,预测结果会更合理。 - 如果有特殊场景需要手动做预处理,必须遵守两个规则:① 所有预处理的拟合过程仅在训练集执行;② 测试集仅调用
transform方法做转换,不能重新拟合任何预处理组件。
内容的提问来源于stack exchange,提问作者DillM94
相关产品推荐
相关产品推荐

