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

使用scikeras KerasClassifier时cross_val_score与fit报TypeError求助

解决Scikeras KerasClassifier的validation_batch_size参数错误问题

问题分析

你遇到的TypeError本质是Scikeras与TensorFlow/Keras版本兼容性,以及Scikeras参数传递机制和旧版Keras封装不同导致的:

  • Scikeras默认会向Keras的fit()方法传递validation_batch_size参数,但旧版TensorFlow的training_v1.fit()不支持该参数。
  • 你直接将epochs、batch_size等fit()参数传给KerasClassifier,不符合Scikeras的命名空间参数规则,加剧了参数传递混乱。

解决方案

1. 修正Scikeras参数传递方式

Scikeras用命名空间前缀区分模型构建、编译、训练阶段的参数,必须为fit()方法的参数添加fit__前缀:

estimator = KerasClassifier(
    model=base_model,
    fit__epochs=300,
    fit__batch_size=200,
    fit__verbose=0,
    validation_batch_size=None  # 显式禁用自动传递该参数
)

2. 优化模型构建函数(推荐)

将模型编译逻辑从构建函数中剥离,交给Scikeras统一处理,避免参数冲突:

def base_model():
    # 仅创建网络结构,不编译
    model = Sequential()
    model.add(Dense(8, input_dim=10, activation='relu'))
    model.add(Dense(4, activation='softmax'))
    return model

# 初始化时指定编译参数
estimator = KerasClassifier(
    model=base_model,
    fit__epochs=300,
    fit__batch_size=200,
    fit__verbose=0,
    compile__loss='categorical_crossentropy',
    compile__optimizer='adam',
    compile__metrics=['accuracy'],
    validation_batch_size=None
)

3. 升级库版本确保兼容

执行以下命令升级到兼容版本:

pip install --upgrade scikeras tensorflow

建议使用scikeras>=0.11.0和tensorflow>=2.8.0,避免旧版training_v1的API限制。

4. 验证cross_val_score调用

保持交叉验证代码不变,确保输入数据X和encoded_y为标准numpy数组:

kfold = KFold(n_splits=10, shuffle=True)
results = cross_val_score(estimator, X, encoded_y, cv=kfold)
print("%.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

验证训练代码

调整后的estimator可以正常调用fit():

estimator.fit(X_train, Y_train)
y_preds = estimator.predict(X_test)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:00:39