Scikit-learn GridSearchCV与交叉验证参数搜索
请详解sklearn中GridSearchCV和RandomizedSearchCV的用法和原理。如何为Pipeline中的不同步骤设置超参数网格?说明Refit参数、cv策略选择、并行化(n_jobs)及自定义评分函数的方法。对比GridSearchCV与HalvingGridSearchCV的性能差异。
回答
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(分类)、GroupKFoldn_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精调。