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

如何在Keras中获取每个类别的精确率、召回率和F1分数

获取CRF层模型的类别精确率、召回率和F1分数

针对你用Keras 2.1.5 + keras-contrib 2.0.8搭建的CRF模型,要计算测试集上每个类别的精确率、召回率和F1,核心是先拿到真实标签和模型预测的标签,再用分类评估工具计算。下面是具体步骤:

1. 导出预测标签和真实标签

首先,你需要从测试集中提取真实标签y_test,然后用模型生成预测标签y_pred。结合CRF层的特性,有两种方式获取预测标签:

方式一:直接用CRF层的predict_classes方法

如果你的模型最后一层是CRF实例(比如crf = CRF(num_classes)),可以直接调用它的predict_classes方法获取序列标签:

import numpy as np
from keras_contrib.layers import CRF

# 假设你的模型已经训练完成,crf是你定义的CRF层实例
y_pred = crf.predict_classes(x_test)

方式二:从模型输出概率推导标签

如果model.predict()返回的是每个时间步的类别概率(形状为(样本数, 序列长度, 类别数)),可以通过argmax得到最终标签:

y_pred_probs = model.predict(x_test)
y_pred = np.argmax(y_pred_probs, axis=-1)  # 对最后一维(类别维度)取最大值,得到对应标签

2. 处理序列padding(如果有)

如果你的训练/测试序列是经过padding补全长度的(比如用0作为padding标签),需要过滤掉这些无效的padding标签,避免干扰指标计算:

# 假设0是padding的标签值,只保留非padding的有效部分
mask = y_test != 0
y_test_flat = y_test[mask].flatten()
y_pred_flat = y_pred[mask].flatten()

3. 计算每个类别的指标

用sklearn.metrics里的classification_report可以直接生成包含精确率、召回率、F1的详细报告:

from sklearn.metrics import classification_report

# 替换成你的类别名称列表,比如["O", "B-PER", "I-PER", "B-LOC"]
class_names = ["类别0", "类别1", "类别2", ...]

print(classification_report(y_test_flat, y_pred_flat, target_names=class_names))

这个报告会输出每个类别的精确率(precision)、召回率(recall)、F1分数(f1-score),以及整体的宏平均、微平均指标。

注意事项

  • 如果你的任务是实体级别的序列标注(比如命名实体识别),上面的方法计算的是token级别的指标。如果需要实体级指标,你需要额外编写代码将token标签转换为实体,再计算实体的精确率/召回率/F1。
  • 确保y_test和y_pred的形状完全匹配,且标签ID与类别名称的对应关系正确,否则会导致指标计算错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:09:18