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

为何用GridSearchCV最优参数在cross_val_score中结果不一致?

问题分析与解决方案

问题核心原因

你遇到的结果不一致,核心问题是种子设置的时机错误:
你仅在脚本开头设置了一次NumPy和TensorFlow的种子,但GridSearchCV会遍历大量参数组合,每次都会构建新模型,这会持续消耗TensorFlow的随机状态。当GridSearchCV找到最佳参数时,对应的模型初始化状态已经和你单独用cross_val_score时的模型初始化状态完全不同——后者是在脚本开头设置种子后直接构建的,而前者是在构建了几百个模型之后才生成的,随机状态已经被推进了无数步,最终导致训练结果差异。

另外,两个buildModel函数存在细微结构差异:第一个的输入层显式指定了input_dim=X_train.shape[1],第二个没有,虽然Keras会自动推断输入维度,但这种不一致可能带来潜在的初始化差异。

修复步骤

1. 将种子重置移到模型构建函数内部

确保每次构建新模型时,都重新初始化种子,这样无论前面构建了多少模型,每个新模型的权重初始化、Dropout掩码的随机状态都是一致的。

修改第一个代码块的buildModel:

def buildModel(layers,dropout,l2,lr):
    # 每次构建模型前强制重置种子
    seed(1)
    tf.random.set_seed(2)
    
    model = Sequential()
    for i, nodes in enumerate(layers):
        if i==0: 
            model.add(Dense(nodes, input_dim=X_train.shape[1], activation='tanh',kernel_regularizer=regularizers.l2(l2)))
            model.add(Dropout(dropout))
        else:
            model.add(Dense(nodes,activation='tanh',kernel_regularizer=regularizers.l2(l2)))
            model.add(Dropout(dropout))
 
    model.add(Dense(1))
    
    model.compile(optimizer=SGD(learning_rate=lr,momentum=0.6),loss='mse',metrics=['mean_squared_error'])
    
    return model

修改第二个代码块的buildModel:

def buildModel():
    # 每次构建模型前强制重置种子
    seed(1)
    tf.random.set_seed(2)
    
    model = Sequential()
    # 和第一个函数保持一致,显式指定input_dim
    model.add(Dense(4, input_dim=X_train.shape[1], activation='tanh',kernel_regularizer=regularizers.l2(0.1)))
    model.add(Dropout(0.1))
            
    model.add(Dense(1))
    
    model.compile(optimizer=SGD(learning_rate=0.1,momentum=0.6),loss='mse',metrics=['mean_squared_error'])
    
    return model

2. 额外需要控制的种子/随机状态

除了你已经设置的项,还需要关注以下随机源:

  • TensorFlow操作级种子:如果自定义初始化器(比如手动指定Glorot初始化),可以给初始化器单独设置种子,例如kernel_initializer=tf.keras.initializers.GlorotUniform(seed=3)
  • tf.data随机操作:如果使用tf.data.Dataset的shuffle等操作,必须设置seed参数
  • 多进程训练:如果GridSearchCV设置了n_jobs>1,必须在buildModel内部设置种子——多进程会复制父进程状态,但每个进程的随机状态独立,仅在脚本开头设置会导致进程间结果不一致
  • Scikit-learn随机组件:如果使用其他带随机逻辑的组件(如特征选择、采样),都要设置对应的random_state参数

内容的提问来源于stack exchange,提问作者Zmkan3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:35:19