如何正确使用GridSearchCV、cross_val_score完成ANN调参与预测
KerasRegressor 搭配 GridSearchCV 超参搜索与预测的正确流程
先给结论:你梳理的流程里存在2处逻辑错误、1处语法错误,下面逐个拆解操作规则和对应疑问:
正确基准流程
- 第一步:按固定比例拆分数据集为训练集、测试集,全程禁止测试集参与任何训练、超参调整环节,这步你的逻辑是对的,记得固定随机种子保证拆分结果可复现。
- 第二步:在训练集上执行GridSearchCV搜索,调用
GridSearchCV.fit(X_Train, Y_Train)的写法没问题。注意GridSearchCV默认会在内部对传入的训练集做K折交叉验证,遍历所有超参组合后,会自动选出交叉验证得分最高的超参,再用这组超参在全量训练集上重训一次模型,最终存到best_estimator_属性里。 - 第三步:用
best_estimator_直接在测试集上做单次预测,计算R2、MSE等泛化指标,这才是测试集的正确用法。 - 第四步:确认模型泛化能力符合要求后,持久化保存模型用于后续复用。
针对你提出的疑问逐一解答
1. 测试集上调用cross_val_score是否必要?得分是否应该和GridSearchCV最优得分相近?
完全没必要,属于错误用法:
- 测试集的定位是完全独立的 hold-out 验证数据,只需要用一次做最终泛化能力评估,在上面跑交叉验证没有任何统计意义,还会变相让测试集信息参与模型评估,违背了拆分测试集的初衷。
- 两个得分本来就不该相近:GridSearchCV输出的
best_score_是训练集内部K折交叉验证的平均得分,属于训练环节的验证结果;测试集是模型从未见过的数据,得分通常会低于训练集交叉验证得分,不存在“应当相近”的逻辑。
2. 直接调用best_estimator_做预测的相关疑问
- 首先你写的
model.best_estimator_.predict( X_Test, Y_Test)是语法错误:predict方法仅接受特征矩阵作为入参,不需要传入标签Y_Test,正确写法是model.best_estimator_.predict(X_Test),传入标签会直接触发参数报错。 - 预测前不需要重新在训练集上fit
best_estimator_:GridSearchCV跑完所有超参组合的搜索后,已经自动用最优超参在全量训练集上完成了重训,best_estimator_存的就是这次重训完成的可用模型,直接拿来预测就行。重复fit会重新随机初始化模型权重,覆盖已经训练好的参数,反而会导致结果波动、不可复现。 - GridSearchCV得到的最优模型权重默认会保留在
best_estimator_实例中:只要当前Python进程没有结束,你可以随时调用这个实例的predict、evaluate方法,不需要重新训练。 - 后续复用模型必须单独持久化保存:不管是GridSearchCV对象本身,还是
best_estimator_实例,都存储在内存里,进程关闭后就会释放。你可以直接调用model.best_estimator_.model.save('best_ann.h5')保存原生Keras模型文件,后续加载不需要重新跑调参或训练,直接就能用于预测。
补充提示:做神经网络超参搜索前,建议固定random、numpy、tensorflow三个库的全局随机种子,否则相同超参下多次训练的结果会有随机波动,影响调参判断。
内容的提问来源于stack exchange,提问作者AnnaS
相关产品推荐
相关产品推荐

