使用KerasClassifier时如何计算测试集损失与准确率
问题原因
KerasClassifier是scikit-learn接口的封装类,本身不具备原生Keras模型的evaluate()方法,交叉验证返回的results['estimators']里存的都是训练后的KerasClassifier封装实例,直接调用Keras原生方法自然会报错。
正确实现方法
封装器内部把训练好的原生Keras模型存在model属性中,先提取这个原生模型,再调用evaluate()即可。
步骤1:提取最优折对应的原生Keras模型
# best_model是你从results['estimators']筛选出的最优KerasClassifier实例 best_tf_model = best_model.model
步骤2:在测试集上执行评估,获取损失和指标
# evaluate返回值顺序和你模型compile时指定的loss、metrics顺序完全一致 # 示例:如果你的模型编译时写的是model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) test_loss, test_acc = best_tf_model.evaluate(x_test, y_test, batch_size=8, verbose=1) print(f"测试集损失值:{test_loss:.4f}") print(f"测试集准确率:{test_acc:.4f}")
补充说明
- 预测场景可以按需选择接口:
- 要直接输出类别标签(sklearn风格输出):直接调用封装器的
best_model.predict(x_test)即可 - 要输出预测概率:调用原生模型的
best_tf_model.predict(x_test)
- 要直接输出类别标签(sklearn风格输出):直接调用封装器的
- 不要直接使用你最开始初始化的全局
KerasClassifier实例做评估/预测:交叉验证过程中每折都会重新初始化、独立训练新的封装器实例,你初始定义的model对象没有经过任何训练,输出结果完全无效。 - 如果编译模型时传入了多个指标(比如precision、recall、f1等),按
compile时metrics参数的传入顺序依次接收evaluate()的返回值即可。
内容的提问来源于stack exchange,提问作者Luigi Montaleone
相关产品推荐
相关产品推荐

