搭建好 Pipeline 并调用 fit() 后,整个流水线(包括所有预处理步骤和最终模型)会变成一个完整的对象,你可以直接将它序列化保存为一个文件,部署时加载该文件即可直接对原始数据进行预测,无需再单独处理预处理逻辑。
核心原理
Pipeline 在 fit() 时会自动完成以下操作:
- 依次对前 N-1 个步骤(Transformer)执行
fit+transform - 对最后一个步骤(Estimator)执行
fit - 所有步骤的已拟合状态(如 StandardScaler 的均值/方差、PCA 的主成分、模型的权重等)全部保存在 Pipeline 对象内部
因此,保存 Pipeline 就等于保存了整个训练流程的所有状态。
完整代码示例
python
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
import joblib
# 1. 搭建 Pipeline
pipe = Pipeline([
('imputer', SimpleImputer(strategy='mean')), # 缺失值填充
('scaler', StandardScaler()), # 标准化
('classifier', LogisticRegression()) # 分类模型
])
# 2. 训练(所有步骤一次性拟合)
pipe.fit(X_train, y_train)
# 3. 保存整个 Pipeline 为一个文件
joblib.dump(pipe, 'model_pipeline.joblib')
# ===== 部署时 =====
# 4. 加载
loaded_pipe = joblib.load('model_pipeline.joblib')
# 5. 直接传入原始数据预测(预处理自动执行)
predictions = loaded_pipe.predict(X_new_raw)
关键注意事项
- 推荐用
joblib而非pickle:sklearn 官方推荐,对包含大量 NumPy 数组的模型更高效,且支持压缩(compress=3) - 必须包含所有预处理步骤:任何在 Pipeline 外部做的预处理(如手动 drop 列、特征工程)不会自动保存,需全部纳入 Pipeline 中
- 复杂场景用
ColumnTransformer:当数值列和类别列需要不同预处理时,可配合ColumnTransformer实现分支处理,再与模型串联成完整 Pipeline - 版本兼容性:保存和加载环境的 sklearn 版本需保持一致,否则可能报错
简单来说,Pipeline + joblib 的组合就是 sklearn 生态中实现**"训练一次,到处预测"**的标准方案。