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

Kaggle分类变量练习:随机森林预测触发特征数不匹配报错

问题根因
  • 触发特征数不匹配错误的核心原因:你在处理测试集独热编码时错误调用了fit_transform(),相当于在测试集上重新训练了一个新的独热编码器,而不是复用训练集上拟合好的编码器做转换。
  • 训练集低基数分类列的唯一值总数比测试集多7个,重新在测试集上fit的编码器只会识别测试集里出现的类别,生成的独热列比训练集少7列,最终拼接得到的测试集特征总共有148列,和模型训练时记住的155列输入维度不一致,直接触发报错。
  • 日志里的FutureWarning是次要问题:独热编码输出转DataFrame时默认生成整数类型列名,和原数值列的字符串列名混合,sklearn 1.2之后版本会对这种情况直接抛错,但不是本次维度错误的诱因。
错误代码定位

出错的是测试集独热编码这一行:

# 错误写法:在测试集上重新拟合编码器,学到的类别空间和训练集不一致
h_cols_test = pd.DataFrame(ohencoder.fit_transform(X_test[low_cardinality_cols]))

所有sklearn的特征转换器(独热编码、标准化、归一化等),只能在训练集上调用fit()方法学习规则,验证集、测试集只能用训练完成的转换器调用transform()应用规则,否则必然出现特征维度、分布不一致的问题。

修复方案
  1. 确保你初始化的OneHotEncoder实例,首先在训练集的低基数分类列上调用fit_transform()完成拟合,生成训练集独热特征OH_X_train,这一步不要重复初始化编码器。
  2. 处理测试集时,不再调用fit_transform(),直接用训练好的编码器调用transform(),同时通过get_feature_names_out()生成字符串类型的列名,顺便解决FutureWarning。

修复后的测试集处理及预测代码如下:

# 测试集独热编码逻辑修复
h_cols_test = pd.DataFrame(
    ohencoder.transform(X_test[low_cardinality_cols]),
    # 生成字符串格式的独热列名,解决特征名类型警告
    columns=ohencoder.get_feature_names_out(low_cardinality_cols),
    index=X_test.index
)

num_X_test = X_test.drop(object_cols, axis=1)
OH_X_test = pd.concat([num_X_test, h_cols_test], axis=1)

# 模型训练与预测逻辑无需改动
model = RandomForestRegressor(n_estimators=100, random_state=0)
model.fit(OH_X_train, y_train)
preds_test = model.predict(OH_X_test)

output = pd.DataFrame({'Id': X_test.index,
                       'SalePrice': preds_test})
output.to_csv('submission.csv', index=False)
修复说明
  • 修复后测试集生成的独热列数和训练集完全对齐,总特征数为155,和模型预期输入维度一致,不会再触发维度报错。
  • 所有特征列名均为字符串类型,不会再触发特征名类型的FutureWarning。
  • 因为你初始化编码器时设置了handle_unknown='ignore',即使测试集出现训练集中没见过的分类值,编码器会自动将对应独热位设为0,不会额外报错。

内容的提问来源于stack exchange,提问作者GreenCompass

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:54:20