训练与测试数据列数一致但OneHotEncoder编码后特征数不匹配问题
问题解决:OneHotEncoder编码后训练/测试集特征数不匹配
错误根源
你对训练集和测试集都调用了fit_transform(),这会让OneHotEncoder分别基于两个数据集的分类特征拟合独立的编码规则。由于测试集的分类特征类别数量/种类可能和训练集存在差异,最终导致编码后的特征矩阵维度不一致,模型自然无法匹配输入。
修正方案
核心原则:只在训练集上学习编码规则(fit),测试集直接复用该规则做转换(transform),修正后的代码如下:
one_hot= OneHotEncoder() transformer= ColumnTransformer([("one_hot",one_hot,categorical_features)], remainder="passthrough") # 训练集:同时完成规则学习和数据转换 train_transformed_X = transformer.fit_transform(pd.DataFrame(bigdata_zeros,columns=categorical_features)) # 测试集:仅用训练好的规则做转换,不重新学习 train_transformed_X_test=transformer.transform(pd.DataFrame(bigdata_test_zeros,columns=categorical_features))
额外优化建议
- 如果测试集可能出现训练集从未见过的分类类别,初始化OneHotEncoder时添加
handle_unknown='ignore'参数,遇到未知类别时会跳过该特征的编码,避免报错:one_hot= OneHotEncoder(handle_unknown='ignore') - 提前检查训练集和测试集的分类特征类别一致性,比如对比每个分类特征的唯一值集合,从源头避免类别差异问题。
内容的提问来源于stack exchange,提问作者santiaqool
相关产品推荐
相关产品推荐

