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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:54:01