RandomizedSearchCV结合KerasRegressor时参数无效问题求助
问题解决办法
核心错误点
你遇到的问题源于两个关键错误:
- Scikeras参数传递规则:新版Scikeras的
KerasRegressor要求模型构建函数的参数必须加上model__前缀,才能被RandomizedSearchCV正确传递给模型构建逻辑; - 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
相关产品推荐
相关产品推荐

