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

GridSearchCV调参报错‘neurons为无效参数’的解决方法

KerasClassifier与GridSearchCV超参数调优报错解决

问题场景

使用GridSearchCV对Keras模型进行超参数调优,TensorFlow与Keras版本均为2.15.0,运行代码时返回错误,提示Invalid parameter neurons for estimator KerasClassifier,并建议在KerasClassifier构造函数中设置该参数。

报错信息

Invalid parameter neurons for estimator KerasClassifier.
This issue can likely be resolved by setting this parameter in the KerasClassifier constructor:
`KerasClassifier(neurons=2)`

问题原因

GridSearchCV会将param_grid中的参数直接传递给KerasClassifier实例,但neurons和optimizer是模型构建函数create_model的参数,并非KerasClassifier自身的参数,因此会被判定为无效参数。

解决方法

利用sklearn的双下划线参数传递规则,将模型构建函数的参数通过build_kwargs__参数名的形式加入param_grid,告诉GridSearchCV把这些参数传递给build_fn(即create_model函数)。

修改后的关键代码

  1. 调整参数网格param_grid:
param_grid = {
    'build_kwargs__neurons': [2, 8, 16],
    'batch_size': [4, 16],
    'build_kwargs__optimizer': ['SGD', 'RMSprop', 'Adam']
}
  1. KerasClassifier的定义无需额外修改,保持原代码即可:
model1 = KerasClassifier(build_fn=create_model, epochs=10, verbose=1)

完整修改后代码

# 定义Keras模型构建函数
def create_model(neurons, optimizer):
    model = Sequential()
    model.add(Dense(neurons, input_dim=30, activation='relu')) 
    model.add(Dropout(0.2))
    model.add(Dense(1)) 
    model.add(Activation('sigmoid'))  
    model.compile(loss='binary_crossentropy',
                  optimizer=optimizer,             
                  metrics=['accuracy'])
    return model

# 定义参数范围(使用build_kwargs__前缀传递模型构建参数)
param_grid = {
    'build_kwargs__neurons': [2, 8, 16],
    'batch_size': [4, 16],
    'build_kwargs__optimizer': ['SGD', 'RMSprop', 'Adam']
} 

# 包装Keras模型为sklearn兼容的分类器
model1 = KerasClassifier(build_fn=create_model, epochs=10, verbose=1)

# 初始化网格搜索
grid = GridSearchCV(estimator=model1, param_grid=param_grid, n_jobs=1, cv=3)

# 执行网格搜索
grid_result = grid.fit(X, Y)

# 输出结果
print("Best accuracy of: %f using %s" % (grid_result.best_score_, 
                                         grid_result.best_params_))

means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']

for mean, stdev, param in zip(means, stds, params):
    print("%f (%f) with: %r" % (mean, stdev, param))

# 加载最优模型并预测
best_model = grid_result.best_estimator_
y_pred = best_model.predict(X)
y_pred = (y_pred > 0.5)

# 生成混淆矩阵
from sklearn.metrics import confusion_matrix
import seaborn as sns
cm = confusion_matrix(Y, y_pred)
sns.heatmap(cm, annot=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:32:05