如何在sklearn的make_pipeline中正确使用StandardScaler
问题结论
你的理解完全正确,不需要额外手动操作嵌入在流水线里的StandardScaler,按你写的常规方式调用fit、predict方法,就能走完完全正确的特征缩放+模型训练预测流程,不会出现数据泄露问题。
流水线内部执行逻辑
make_pipeline构造的是按顺序执行的处理链,每一步的执行逻辑是自动衔接的:
- 调用
clf.fit(X_train, y_train)时,会按流水线定义的顺序从上到下执行:- 首先对
StandardScaler执行fit_transform:用训练集X_train计算特征均值、标准差完成缩放器拟合,同时输出缩放后的训练集特征 - 将上一步输出的缩放后训练集特征和标签
y_train传入RandomForestClassifier,完成模型拟合
- 首先对
- 调用
clf.predict(X_test)时,不会重新拟合任何前置处理步骤,会直接复用训练阶段拟合好的缩放器:- 用训练集上算出的均值、标准差对
X_test做标准缩放,全程不会用到测试集自身的统计量,和你手动拆分步骤的处理逻辑完全一致 - 将缩放后的测试集特征传入训练好的随机森林模型,输出预测结果
- 用训练集上算出的均值、标准差对
手动调用流水线内缩放器的方法
如果你确实需要单独取出流水线里的缩放器做自定义操作,可以通过流水线的named_steps属性获取,示例代码如下:
# 取出嵌入在流水线中的缩放器,默认键名为类名全小写 pipe_scaler = clf.named_steps["standardscaler"] # 取出后和你手动初始化的scaler用法完全一致 scaled_data = pipe_scaler.transform(X_custom)
小提示:如果构造流水线时给步骤自定义了命名,把对应键名换成你自定义的名称即可。
内容的提问来源于stack exchange,提问作者Sheldon
相关产品推荐
相关产品推荐

