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

RandomizedSearchCV结合KerasRegressor时参数无效问题求助

问题解决办法

核心错误点

你遇到的问题源于两个关键错误:

  1. Scikeras参数传递规则:新版Scikeras的KerasRegressor要求模型构建函数的参数必须加上model__前缀,才能被RandomizedSearchCV正确传递给模型构建逻辑;
  2. KerasRegressor初始化错误:你直接传入了build_model()(已构建完成的模型实例),而非函数本身build_model,导致参数无法动态调整模型结构。

修正步骤

1. 修正KerasRegressor初始化

将初始化代码从传入已构建的模型,改为传入模型构建函数本身:

# 错误写法
# keras_reg = KerasRegressor(build_model())

# 正确写法
keras_reg = KerasRegressor(build_model)

这样KerasRegressor会在每次参数搜索时,调用build_model并传入对应的参数,动态生成新模型。

2. 修改参数字典的参数名

给每个模型参数添加model__前缀,明确告知RandomizedSearchCV这些参数是传递给模型构建函数的:

param_distribs = {
    "model__n_hidden": (0,1,2,3),
    "model__n_neurons": np.arange(1,100),
    "model__learning_rate": reciprocal(0.001,0.01)
}

3. 完整修正后的代码示例

def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):
    model = keras.models.Sequential()
    model.add(keras.layers.InputLayer(input_shape=input_shape))
    for layer in range(n_hidden):
        model.add(keras.layers.Dense(n_neurons, activation="relu"))
    model.add(keras.layers.Dense(1))
    optimizer = keras.optimizers.SGD(learning_rate=learning_rate)
    model.compile(loss="mse", optimizer=optimizer)
    return model

import scikeras
from scikeras.wrappers import KerasRegressor
# 传入模型构建函数本身
keras_reg = KerasRegressor(build_model)

from scipy.stats import reciprocal
import numpy as np
# 参数名添加model__前缀
param_distribs = {
    "model__n_hidden": (0,1,2,3),
    "model__n_neurons": np.arange(1,100),
    "model__learning_rate": reciprocal(0.001,0.01)
}

from sklearn.model_selection import RandomizedSearchCV
rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3, verbose=2)
rnd_search_cv.fit(X_train, y_train, epochs=100,
                  validation_data=(X_valid, y_valid),
                  callbacks=[keras.callbacks.EarlyStopping(patience=10)])

为什么课程里的代码能运行?

课程中使用的大概率是旧版的keras.wrappers.scikit_learn.KerasRegressor(Keras原生的scikit-learn包装器),而非新版的scikeras.wrappers.KerasRegressor。旧版包装器不需要添加model__前缀,且允许直接传入已构建的模型(虽非规范用法,但部分场景下可运行)。新版Scikeras为了更规范地兼容scikit-learn的参数传递逻辑,引入了嵌套参数前缀机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:07:51