Python预测时如何保留训练数据列 解决独热编码缺失列问题
解决方案
核心逻辑是保证新数据的特征列、列顺序和训练集完全匹配,未出现的分类对应的独热列统一赋值为0即可,常用两种实现方式:
- 方法1:预定义分类编码器(推荐)
训练阶段就固定分类变量的所有取值,不要让编码器自动推断类别,转换新数据时会自动补全缺失的类别列。
示例代码:
import pandas as pd from sklearn.preprocessing import OneHotEncoder # 训练阶段提前指定Source列的所有已知类别 encoder = OneHotEncoder( categories=[['a', 'b', 'c', 'd']], sparse_output=False, feature_name_combiner=lambda feature, cat: f"{feature}_{cat}" ) # 拟合训练数据 train_source_enc = encoder.fit_transform(train_df[['Source']]) train_source_df = pd.DataFrame(train_source_enc, columns=encoder.get_feature_names_out()) # 拼接得到最终训练集 train_final = pd.concat([train_df[['Amount']], train_source_df, train_df['y']], axis=1) # 预测阶段处理新数据,直接用训练好的编码器转换,自动补全source_b列,值全为0 new_source_enc = encoder.transform(new_df[['Source']]) new_source_df = pd.DataFrame(new_source_enc, columns=encoder.get_feature_names_out()) new_final = pd.concat([new_df[['Amount']], new_source_df], axis=1)
这种方法的优势是避免手动补列的遗漏,也能自动处理新数据出现未知分类的场景(可以通过设置handle_unknown='ignore'参数,未知分类所有独热列全为0)。
- 方法2:手动补列
如果已经完成新数据的独热编码,直接手动添加缺失的列再重排序即可:
# 训练集的特征列顺序,提前保存好 TRAIN_FEATURE_COLS = ['Amount', 'source_a', 'source_b', 'source_c', 'source_d'] # 检查新数据缺失的列,补全赋值为0 missing_cols = [col for col in TRAIN_FEATURE_COLS if col not in new_encoded_df.columns] for col in missing_cols: new_encoded_df[col] = 0 # 按训练集列顺序重排,保证特征顺序完全匹配 new_final = new_encoded_df[TRAIN_FEATURE_COLS]
重要提示:XGBoost是按列顺序读取特征的,必须保证新数据的列顺序和训练集完全一致,否则会出现特征错位,导致预测结果完全错误。
内容的提问来源于stack exchange,提问作者Sudhakar Samak
相关产品推荐
相关产品推荐

