Scikit-learn Pipeline:构建可复用的 ML 流水线
1. Pipeline 基础
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
# 创建流水线
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)
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
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())
])
from sklearn.base import BaseEstimator, TransformerMixin
class FeatureEngineer(BaseEstimator, TransformerMixin):
def __init__(self, add_interaction=True):
self.add_interaction = add_interaction
def fit(self, X, y=None):
return self
def transform(self, X):
X = X.copy()
X['price_per_sqft'] = X['price'] / X['area']
if self.add_interaction:
X['age_income'] = X['age'] * X['income']
return X
# 使用
pipe = Pipeline([
('feature_eng', FeatureEngineer()),
('scaler', StandardScaler()),
('clf', RandomForestClassifier())
])
4. GridSearch + Pipeline
from sklearn.model_selection import GridSearchCV
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 |
封装业务逻辑 |