Scikit-learn Pipeline:构建可复用的 ML 流水线
1. Pipeline 基础
fromsklearn.pipelineimportPipelinefromsklearn.preprocessingimportStandardScalerfromsklearn.decompositionimportPCAfromsklearn.ensembleimportRandomForestClassifier# 创建流水线pipe=Pipeline([('scaler',StandardScaler()),('pca',PCA(n_components=10)),('clf',RandomForestClassifier(n_estimators=100))])# 训练pipe.fit(X_train,y_train)# 预测y_pred=pipe.predict(X_test)# 评分score=pipe.score(X_test,y_test)
2. ColumnTransformer
fromsklearn.composeimportColumnTransformerfromsklearn.preprocessingimportStandardScaler,OneHotEncoderfromsklearn.imputeimportSimpleImputer numeric_features=['age','income','score']categorical_features=['city','gender']preprocessor=ColumnTransformer([('num',Pipeline([('imputer',SimpleImputer(strategy='median')),('scaler',StandardScaler()),]),numeric_features),('cat',Pipeline([('imputer',SimpleImputer(strategy='most_frequent')),('encoder',OneHotEncoder(handle_unknown='ignore')),]),categorical_features),])# 完整流水线pipe=Pipeline([('preprocessor',preprocessor),('classifier',RandomForestClassifier())])
3. 自定义 Transformer
fromsklearn.baseimportBaseEstimator,TransformerMixinclassFeatureEngineer(BaseEstimator,TransformerMixin):def__init__(self,add_interaction=True):self.add_interaction=add_interactiondeffit(self,X,y=None):returnselfdeftransform(self,X):X=X.copy()X['price_per_sqft']=X['price']/X['area']ifself.add_interaction:X['age_income']=X['age']*X['income']returnX# 使用pipe=Pipeline([('feature_eng',FeatureEngineer()),('scaler',StandardScaler()),('clf',RandomForestClassifier())])
4. GridSearch + Pipeline
fromsklearn.model_selectionimportGridSearchCV param_grid={'pca__n_components':[5,10,15],'clf__n_estimators':[50,100,200],'clf__max_depth':[5,10,None],}grid=GridSearchCV(pipe,param_grid,cv=5,scoring='accuracy')grid.fit(X_train,y_train)print(f"最佳参数:{grid.best_params_}")
总结
| 组件 | 作用 |
|---|
| Pipeline | 串联处理步骤 |
| ColumnTransformer | 按列分别处理 |
| FeatureUnion | 并行特征提取 |
| 自定义 Transformer | 封装业务逻辑 |