本课目标

掌握 scikit-learn 的三件武器:Pipeline 防数据泄露、GridSearchCV 自动调参、无监督聚类,形成传统 ML 的完整工具链。


上一讲你写了五行代码跑通了一个 ML 项目。这五行代码在生产环境中会变成五百行——预处理、特征工程、调参、评估、上线。scikit-learn 给了你三个工具来管住这些复杂度。本讲逐个拆。

核心内容

Pipeline:把预处理和模型"焊"在一起

新手最常见的翻车场景:先对全量数据做标准化,再切训练测试集。测试集的信息泄露进了训练——评估结果虚高,上真数据就崩。

Pipeline 把每一步串起来,保证预处理只在训练集上拟合,测试集严格隔离:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression

pipe = Pipeline([
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler()),
    ('clf', LogisticRegression(max_iter=1000)),
])
pipe.fit(X_train, y_train)

Pipeline 的工程红利不止防泄露:整个流水线是一个可序列化对象joblib.dump(pipe, 'model.pkl') 一把梭,线上加载即用——彻底消除"线上线下预处理不一致"的经典事故。

Pipeline = ML 的"事务边界"。事务内部的操作要么全部正确执行,要么不执行。Pipeline 保证训练时怎么处理数据、预测时一模一样地处理。

GridSearchCV:让机器帮你调参

手动调参就像手动挡开长途——能到,但累。GridSearchCV 穷举参数组合、交叉验证打分,给你最优解:

from sklearn.model_selection import GridSearchCV

param_grid = {
    'clf__C': [0.01, 0.1, 1, 10],
    'clf__penalty': ['l1', 'l2'],
    'clf__solver': ['liblinear'],
}
search = GridSearchCV(pipe, param_grid, cv=5, scoring='f1', n_jobs=-1)
search.fit(X_train, y_train)
print(search.best_params_, search.best_score_)

cv=5 把训练集再切五份轮流验证,调参结论更稳。代价是训练时间 ×5 ×参数组合数——参数网格别开太大,优先调对效果影响最大的参数。

KMeans:没有标签时怎么办?

聚类是 ML 中最被低估的工具。经典场景:电商用户按"消费金额/频次/客单价"自动分成四个群体——不需要人工打标,运营直接差异化触达。

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4, n_init=10, random_state=42)
labels = kmeans.fit_predict(X_scaled)

K 值选择:肘部法则(SSE 下降拐点)或轮廓系数。别拍脑袋定 K=3——你的数据可能有 5 个天然群体。

动手练习

  1. 在房价数据上套 Pipeline + GridSearchCV,优化随机森林的参数
  2. 用 KMeans 对房价数据的地理特征聚类,可视化分群结果