Scikit-learn Pipeline:构建可复用的 ML 流水线 Scikit-learn Pipeline构建可复用的 ML 流水线1. Pipeline 基础fromsklearn.pipelineimportPipelinefromsklearn.preprocessingimportStandardScalerfromsklearn.decompositionimportPCAfromsklearn.ensembleimportRandomForestClassifier# 创建流水线pipePipeline([(scaler,StandardScaler()),(pca,PCA(n_components10)),(clf,RandomForestClassifier(n_estimators100))])# 训练pipe.fit(X_train,y_train)# 预测y_predpipe.predict(X_test)# 评分scorepipe.score(X_test,y_test)2. ColumnTransformerfromsklearn.composeimportColumnTransformerfromsklearn.preprocessingimportStandardScaler,OneHotEncoderfromsklearn.imputeimportSimpleImputer numeric_features[age,income,score]categorical_features[city,gender]preprocessorColumnTransformer([(num,Pipeline([(imputer,SimpleImputer(strategymedian)),(scaler,StandardScaler()),]),numeric_features),(cat,Pipeline([(imputer,SimpleImputer(strategymost_frequent)),(encoder,OneHotEncoder(handle_unknownignore)),]),categorical_features),])# 完整流水线pipePipeline([(preprocessor,preprocessor),(classifier,RandomForestClassifier())])3. 自定义 Transformerfromsklearn.baseimportBaseEstimator,TransformerMixinclassFeatureEngineer(BaseEstimator,TransformerMixin):def__init__(self,add_interactionTrue):self.add_interactionadd_interactiondeffit(self,X,yNone):returnselfdeftransform(self,X):XX.copy()X[price_per_sqft]X[price]/X[area]ifself.add_interaction:X[age_income]X[age]*X[income]returnX# 使用pipePipeline([(feature_eng,FeatureEngineer()),(scaler,StandardScaler()),(clf,RandomForestClassifier())])4. GridSearch Pipelinefromsklearn.model_selectionimportGridSearchCV param_grid{pca__n_components:[5,10,15],clf__n_estimators:[50,100,200],clf__max_depth:[5,10,None],}gridGridSearchCV(pipe,param_grid,cv5,scoringaccuracy)grid.fit(X_train,y_train)print(f最佳参数:{grid.best_params_})总结组件作用Pipeline串联处理步骤ColumnTransformer按列分别处理FeatureUnion并行特征提取自定义 Transformer封装业务逻辑