如何使用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
相关产品推荐
相关产品推荐

