sklearn中Pipeline预处理与手动列预处理有何差异?为何RMSE结果不同
两种预处理方式得分存在差异的核心原因如下:
- 最主要的差异来自
ColumnTransformer的默认行为
你定义的preprocessor仅指定了对categorical_cols做序数编码,没有设置remainder参数,该参数默认值为drop,意味着所有不在categorical_cols中的数值特征会被直接丢弃。
而手动处理的逻辑是仅替换分类列的编码结果,所有数值列完整保留在训练、验证、测试数据中,模型可以用到全部特征,效果自然更优。如果要让Pipeline版本和手动版本效果对齐,需要将预处理器的定义修改为:preprocessor=ColumnTransformer( transformers=[('ord',OrdinalEncoder(),list(categorical_cols))], remainder='passthrough' # 保留所有未指定转换规则的列 ) - 第二个潜在差异为预处理器的拟合范围问题
当前你的手动逻辑是在每折循环内,单独用当前训练折的数据拟合预处理器,完全不会用到验证折的信息,符合交叉验证的无泄露要求。如果后续把预处理器整合到Pipeline中时,不小心在循环外就提前对全量数据集做了拟合,就会产生数据泄露,进一步拉高RMSE得分。
内容的提问来源于stack exchange,提问作者Anandha Krishnan Aji
相关产品推荐
相关产品推荐

