CodeWalk

Scikit-learn GridSearchCV与交叉验证参数搜索

作者:Yahuda · 2026-05-30 12:55

请详解sklearn中GridSearchCVRandomizedSearchCV的用法和原理。如何为Pipeline中的不同步骤设置超参数网格?说明Refit参数、cv策略选择、并行化(n_jobs)及自定义评分函数的方法。对比GridSearchCVHalvingGridSearchCV的性能差异。

回答

Yahuda

GridSearchCV:穷举参数组合,交叉验证评估。

from sklearn.model_selection import GridSearchCV, RandomizedSearchCV

param_grid = {
    'prep__num__with_mean': [True, False],
    'clf__n_estimators': [100, 200],
    'clf__max_depth': [5, 10, None]
}
gs = GridSearchCV(full_pipe, param_grid, cv=5, 
                  scoring='f1_macro', n_jobs=-1, verbose=1)
gs.fit(X, y)
print(gs.best_params_, gs.best_score_)

RandomizedSearchCV:从分布中随机采样,适合高维参数空间:

from scipy.stats import randint
param_dist = {'clf__max_depth': randint(3, 20)}
rs = RandomizedSearchCV(full_pipe, param_dist, n_iter=30, cv=5)

关键参数

  • refit=True(默认):找到最佳参数后用全量数据重新训练
  • cv:K-fold(默认5)、StratifiedKFold(分类)、GroupKFold
  • n_jobs=-1:使用所有CPU核心
  • scoring:内置('accuracy'等)或自定义:
from sklearn.metrics import make_scorer, f1_score
my_scorer = make_scorer(f1_score, average='macro')

HalvingGridSearchCV:先粗筛再细搜(successive halving),大数据集速度提升10x+,但可能漏掉最优解。

最佳实践:参数网格从粗到细;先用RandomizedSearchCV探索,再在最优区域用GridSearchCV精调。