本课目标
掌握 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 个天然群体。
动手练习
- 在房价数据上套 Pipeline + GridSearchCV,优化随机森林的参数
- 用 KMeans 对房价数据的地理特征聚类,可视化分群结果