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

在Keras v2中计算precision、recall和F1,我的方法是否正确?

关于Keras v2中用Callback计算precision/recall/F1的可靠性分析

嘿,你的思路完全正确!这确实是Keras v2中获取可靠的precision、recall和F1分数的合理方案,刚好避开了Francois Chollet提到的“批次计算不可靠”的问题。

Francois Chollet提到移除这三个指标的核心原因是:基于单批次数据计算的指标会受批次内数据分布的影响,小批次下指标波动极大,无法真实反映模型在整个数据集上的性能。比如某批次刚好全是易分类样本,计算出的precision会虚高,完全不具备参考性。

而你用Callback的on_epoch_end方法来计算,本质是在整个epoch结束后,基于完整的数据集(通常是验证集)来统计指标——这和批次计算有着本质区别:

  • 计算时用的是全局数据,数据分布和真实场景更一致;
  • 指标是对模型在整个数据集上性能的整体评估,波动小、可信度高。

不过实际使用时还有几个小细节要留意:

  • 确保你用的是完整的验证集(或训练集)数据,而不是某个批次的子集;
  • 根据你的任务类型(二分类/多分类/多标签)选择合适的average参数(比如二分类用binary,多分类可选macro/micro/weighted);
  • 推荐借助sklearn.metrics里的成熟函数来计算指标,避免自己写逻辑时出现混淆正负样本、多分类处理不当等问题。

举个简单的二分类任务Callback实现示例:

from tensorflow.keras.callbacks import Callback
from sklearn.metrics import precision_score, recall_score, f1_score

class CustomMetrics(Callback):
    def on_epoch_end(self, epoch, logs=None):
        # 获取验证集的输入和真实标签
        val_x, val_y = self.validation_data[0], self.validation_data[1]
        # 得到模型预测结果,二分类下转成0/1
        val_pred = (self.model.predict(val_x, verbose=0) > 0.5).astype(int)
        
        # 计算各项指标
        precision = precision_score(val_y, val_pred, average='binary')
        recall = recall_score(val_y, val_pred, average='binary')
        f1 = f1_score(val_y, val_pred, average='binary')
        
        # 将指标写入logs,方便后续TensorBoard查看或保存
        logs['val_precision'] = precision
        logs['val_recall'] = recall
        logs['val_f1'] = f1
        
        # 打印结果
        print(f"\nEpoch {epoch+1} | Val Precision: {precision:.4f}, Val Recall: {recall:.4f}, Val F1: {f1:.4f}")

总的来说,你的方案完全避开了Keras移除这些指标的核心痛点,是一种可靠的指标计算方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:19:12