使用GridSearchCV查找最优正则参数时如何同时获取训练与验证集分数
问题解答
1. 能否用GridSearchCV调整dropout、L1和L2正则化参数
可以实现。如果你使用的是scikit-learn生态的模型(包括sklearn自带的带正则项的分类/回归模型、通过KerasClassifier/KerasRegressor包装的深度学习模型),只需要将待搜索的参数(如dropout率、L1正则系数、L2正则系数)和候选值整理成参数字典传入GridSearchCV即可,参数名需要和你定义的模型接收的参数名保持一致。
2. 5折交叉验证的拆分逻辑
- 你传入GridSearchCV的全量X、Y会被平均拆分为5份,每一轮迭代会取其中4份作为训练集,剩余1份作为验证集,5轮迭代下来所有数据都会当过1次验证集、4次训练集,不存在数据浪费,也不需要你额外注入独立验证数据。
- 整个交叉验证过程的拆分逻辑由GridSearchCV自动完成,不需要手动提前拆分训练集和验证集。
3. 如何获取训练/验证集分数实现自定义评分
你需要先给GridSearchCV设置return_train_score=True参数,开启后搜索结果的cv_results_属性会同时存储每一组参数对应的平均训练集分数(mean_train_score)和平均验证集分数(mean_test_score),后续你可以通过两种方式实现自定义逻辑:
- 跑完GridSearchCV后遍历
cv_results_的所有参数组合,自行计算训练分和验证分的绝对相对误差,筛选出误差最小的参数组,参考代码如下:
from sklearn.model_selection import GridSearchCV # 此处替换为你自己的带正则、dropout的模型实例 model = your_model param_grid = { "dropout_rate": [0.1, 0.2, 0.3], "l1_alpha": [1e-4, 1e-3, 1e-2], "l2_alpha": [1e-4, 1e-3, 1e-2] } # 开启return_train_score保留训练集分数 grid = GridSearchCV(model, param_grid, cv=5, return_train_score=True) grid.fit(X, y) min_relative_error = float("inf") best_param_group = None for i in range(len(grid.cv_results_["params"])): train_score = grid.cv_results_["mean_train_score"][i] val_score = grid.cv_results_["mean_test_score"][i] current_error = abs((train_score - val_score) / train_score) if current_error < min_relative_error: min_relative_error = current_error best_param_group = grid.cv_results_["params"][i]
- 也可以自定义scoring函数传入GridSearchCV,但原生scoring函数默认仅能获取验证集数据,因此更推荐第一种方式,直接用返回的结果计算更简便。
内容的提问来源于stack exchange,提问作者rdpdo
相关产品推荐
相关产品推荐

