多分类场景下tf.keras.metrics精确率召回率使用问题咨询
问题背景
我正在构建一个4分类任务模型,标签采用one-hot编码,计划使用精确率(Precision)、召回率(Recall)评估模型性能。查阅tf.keras官方文档中Precision、Recall指标的说明时,产生了若干使用疑问,同时附上了自己编写的模型编译代码,需要澄清具体用法。
核心疑问
- 计算多分类任务的全局精确率与召回率(即所有标签的聚合平均结果)时,框架默认采用macro平均还是micro平均?现有官方文档未像scikit-learn文档一样明确说明该计算逻辑。
- 如果需要单独计算每个类别的精确率与召回率,是否可以通过为每个类别传入
class_id参数,以one-vs-rest二分类逻辑实现?编写的示例代码是否符合要求? - 对于仅包含4个类别的分类任务,设置
top_k=2参数是否适用,是否具备实际评估价值? - 在度量每个类别的模型性能时,设置
top_k=1参数与不设置top_k参数,计算结果存在什么差异?
附:编写的模型编译代码
model.compile( optimizer='sgd', loss=tf.keras.losses.CategoricalCrossentropy(), metrics=[tf.keras.metrics.CategoricalAccuracy(), ##class 0 tf.keras.metrics.Precision(class_id=0,top_k=2), tf.keras.metrics.Recall(class_id=0,top_k=2), ##class 1 tf.keras.metrics.Precision(class_id=1,top_k=2), tf.keras.metrics.Recall(class_id=1,top_k=2), ##class 2 tf.keras.metrics.Precision(class_id=2,top_k=2), tf.keras.metrics.Recall(class_id=2,top_k=2), ##class 3 tf.keras.metrics.Precision(class_id=3,top_k=2), tf.keras.metrics.Recall(class_id=3,top_k=2), ])
答疑内容
1. 全局精确率/召回率的默认平均逻辑
tf.keras内置的Precision、Recall默认没有内置macro/micro平均的选项,不指定class_id时,它会全局累计所有样本、所有类别的真阳性(TP)、假阳性(FP)、假阴性(FN)计数,再统一计算指标值,本质和micro平均的计算结果一致——相当于把所有类别的预测结果摊平成二分类混淆矩阵后算指标,不会单独计算每个类别的指标再做平均。
如果需要macro平均结果,需要单独实例化每个类别的指标,训练完成后对4个类别的指标值取算术平均即可。
2. 单类别指标计算逻辑与代码正确性
给指标传入class_id参数时,确实是按one-vs-rest的二分类逻辑计算对应类别的指标:仅将标签中class_id对应位置为1的样本划分为正样本,其余所有样本为负样本,累计该类别的TP、FP、FN后输出精确率、召回率。
你写的代码语法层面没有问题,但所有单类别指标都设置了top_k=2,输出的不是常规意义上的单类别精确率、召回率,是top2命中规则下的指标值,这点要注意。
3. 4分类任务设置top_k=2的实际价值
top_k参数的判定规则是:只要模型预测概率排名前k的类别包含真实标签,就算该样本对对应类别的预测为正。对于4分类任务,top_k=2的指标有一定参考意义,但不适合作为核心评估指标:
- 参考价值体现在:它可以衡量模型把真实类别排到预测结果前两位的能力,适合排查模型的混淆倾向,比如看模型是不是总把真实类别和某一个固定混淆类排在前两位,在粗排、推荐类不需要严格输出top1结果的场景中实用性较强。
- 但如果你的任务要求输出唯一确定的分类结果(比如常规的图像分类、文本分类),
top_k=2的指标参考性很弱:4分类场景下随机猜测的top2命中率就能达到50%,指标数值会虚高,完全不能反映模型最终输出唯一类别的准确程度。
4. top_k=1与不设置top_k的计算差异
Precision、Recall的top_k参数默认值为None,二者计算逻辑有本质区别:
- 不设置
top_k(即保持默认None)时,指标会按照默认0.5的分类阈值判定每个类别的预测结果:只要某个类别的预测概率≥0.5,就判定为预测正类,<0.5则判定为负类,判定过程和其他类别的预测概率无关。这套逻辑是为多标签分类任务设计的。 - 设置
top_k=1时,不会用0.5的固定阈值做判定,每个样本只会把预测概率最高的1个类别判定为预测正类,其余所有类别都判定为负类。这套逻辑和单标签多分类任务的推理规则完全一致——也就是你推理时用argmax取概率最高类别作为输出的判定逻辑。
提醒:你的任务是标准单标签多分类(使用
CategoricalCrossentropy损失、one-hot标签),如果要计算符合实际推理逻辑的单类别精确率、召回率,应该给所有单类别指标设置top_k=1,不要留空也不要设为2,否则指标计算逻辑和实际推理逻辑不匹配,结果没有参考意义。
内容的提问来源于stack exchange,提问作者Eden

