4、超参数搜索策略:网格搜索、随机搜索、贝叶斯优化、遗传算法
调参这件事,说白了就是找一组最好的超参数组合。我刚开始做AI时,总觉得调参是门玄学,靠的是运气。后来踩的坑多了,才发现——调参是有套路的。
今天咱们聊聊四种主流的搜索策略。每种策略都有自己的脾气,选对了事半功倍,选错了……嗯,你可能要等上几天甚至几周。
4.1 网格搜索(Grid Search)
网格搜索是最朴素的方法。你想想看,把所有可能的参数组合列出来,然后挨个试一遍。就像你买衣服,把所有尺码都试一遍,总能找到合适的。
我个人习惯在参数空间比较小的时候用网格搜索。比如只有两个参数,每个参数取5个值,总共也就25种组合。GPU跑起来很快,结果也直观。
from sklearn.model_selection import GridSearchCV
param_grid = {
'learning_rate': [0.01, 0.05, 0.1],
'max_depth': [3, 5, 7],
'n_estimators': [50, 100, 200]
}
grid_search = GridSearchCV(
estimator=model,
param_grid=param_grid,
cv=3,
scoring='accuracy'
)
grid_search.fit(X_train, y_train)
print(grid_search.best_params_)
4.2 随机搜索(Random Search)
随机搜索比网格搜索聪明一点。它不试所有组合,而是在参数空间里随机采样。我刚开始觉得这不靠谱,后来发现——随机搜索在大多数情况下比网格搜索更高效。
为什么会这样?因为很多超参数对模型性能的影响不是线性的。有些参数你调了10个值,可能只有1个值起作用。随机搜索能更快地覆盖到那些「好」的区域。
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint, uniform
param_dist = {
'learning_rate': uniform(0.01, 0.1),
'max_depth': randint(3, 10),
'n_estimators': randint(50, 300)
}
random_search = RandomizedSearchCV(
estimator=model,
param_distributions=param_dist,
n_iter=50, # 只采样50次
cv=3,
scoring='accuracy'
)
random_search.fit(X_train, y_train)
print(random_search.best_params_)
4.3 贝叶斯优化(Bayesian Optimization)
贝叶斯优化是进阶玩法。它不像网格搜索那样盲目,也不像随机搜索那样完全随机。它会在每次评估后,根据结果调整下一次的搜索方向。
说白了,就是「边学边调」。它用高斯过程(GP)来建模参数和性能之间的关系,然后选择最有潜力的参数组合去尝试。
from skopt import BayesSearchCV
param_space = {
'learning_rate': (1e-3, 1e-1, 'log-uniform'),
'max_depth': (3, 10),
'n_estimators': (50, 300)
}
bayes_search = BayesSearchCV(
estimator=model,
search_spaces=param_space,
n_iter=30,
cv=3,
scoring='accuracy'
)
bayes_search.fit(X_train, y_train)
print(bayes_search.best_params_)
我在项目中遇到过一个问题:用贝叶斯优化调一个8维参数空间,只用了20次迭代就找到了接近最优的解。而网格搜索需要上万次,随机搜索也需要几百次。差距就是这么明显。
4.4 遗传算法(Genetic Algorithm)
遗传算法是受生物进化启发的搜索策略。它把每组参数看作一个「个体」,通过选择、交叉、变异来进化出最优解。
你想想看,这就像自然界优胜劣汰的过程。好的参数组合活下来,差的被淘汰,然后好的之间「生孩子」,产生更好的后代。
from tpot import TPOTClassifier
tpot = TPOTClassifier(
generations=5,
population_size=20,
offspring_size=10,
mutation_rate=0.9,
crossover_rate=0.1,
scoring='accuracy',
cv=3,
verbosity=2
)
tpot.fit(X_train, y_train)
print(tpot.fitted_pipeline_)
4.5 四种策略对比
| 策略 | 适用维度 | 收敛速度 | 计算成本 | 推荐场景 |
|---|---|---|---|---|
| 网格搜索 | ≤3 | 慢 | 高 | 参数少、训练快 |
| 随机搜索 | ≤10 | 中等 | 中等 | 参数中等、预算有限 |
| 贝叶斯优化 | 3-10 | 快 | 低 | 训练成本高、需要快速收敛 |
| 遗传算法 | ≤20 | 中等 | 中等 | 参数多、需要全局搜索 |
4.6 核心逻辑流程图
最后说一句:没有最好的搜索策略,只有最适合的。你想想看,如果你的模型训练一次要3天,你会用网格搜索吗?肯定不会。但如果训练一次只要3秒,那网格搜索反而是最稳妥的选择。
嗯,调参这件事,说到底就是在计算成本和搜索质量之间找平衡。希望今天的内容能帮你少走一些弯路。