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

如何使用scikit-learn处理含缺失值和分类变量的数据并完成预测

错误原因

  • 你在处理测试集时额外删除了测试集里有缺失值的列:此前处理训练数据时你已经同步对全量训练集X和测试集X_test删除了训练集有缺失的列,此时二者的列是完全对齐的。你后续单独对X_test_new删缺失列,直接删掉了部分训练阶段保留的特征,导致输入编码器的列数不匹配。
  • 你在测试集上重新筛选了低基数类别列:独热编码器OH_encoder是在训练集的low_cardinality_cols上拟合的,必须使用和训练阶段完全一致的列名做输入,不能在测试集上单独计算新的低基数列。
  • 训练阶段的代码存在隐藏问题:你直接使用了object_cols变量但未提前定义,运行时会报错。

修正方案

先补全训练阶段的遗漏代码

在训练阶段筛选低基数列之前,先定义类别列:

# 新增:定义类别型列,放在筛选low_cardinality_cols之前
object_cols = [col for col in X.columns if X[col].dtype == "object"]

# Columns that will be one-hot encoded
low_cardinality_cols = [col for col in object_cols if X_train[col].nunique() < 10]

替换测试集处理的全部代码

删掉你原来写的测试集处理逻辑,替换为以下对齐训练流程的代码:

X_test_new = X_test.copy()

# 直接使用训练阶段的low_cardinality_cols做独热编码,不要单独筛测试集的列
OH_cols_test = pd.DataFrame(OH_encoder.transform(X_test_new[low_cardinality_cols]))

# 还原索引
OH_cols_test.index = X_test_new.index

# 删除原有类别列,保留数值列
num_X_test = X_test_new.drop(object_cols, axis=1)

# 拼接数值列和独热列,得到最终可用于预测的测试集
OH_X_test = pd.concat([num_X_test, OH_cols_test], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:21:03