You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用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),传入标签会直接触发参数报错。
  • 预测前不需要重新在训练集上fitbest_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:54:15