目标标签仅为允许标签子集场景下的F1 score计算问题
问题根因
你当前使用的macro平均F1会为每一个出现的预测/真实标签单独计算类别F1再取算术平均,在你的场景中:
- 真实标签
target不存在类别3,因此类别3的召回率默认为0,对应类别F1直接为0,拉低了整体平均得分
可选计算方案
1. 仅计算标签中存在的类别(推荐多数场景)
如果你的验证集本身就是不存在类别3的样本,评估需求仅衡量模型在现有真实类别上的表现,可以调用f1_score时添加labels参数指定仅计算真实标签中覆盖的类别:
from sklearn.metrics import f1_score import numpy as np predicted = [1,1,2,3,2,1] target = [1,1,2,2,2,1] # 提取真实标签中存在的唯一类别 valid_labels = np.unique(target) f1 = f1_score(target, predicted, average='macro', labels=valid_labels)
这个方案会自动忽略没有真实样本的类别3,仅计算类别1、2的F1再取平均,符合你在当前验证集上的实际效果衡量需求。
2. 使用加权平均(weighted)
如果希望保留对所有预测类别的统计,但降低稀有/缺失类别的权重,可以将平均策略改为weighted,该策略会按每个类别在真实标签中的样本数量为权重计算加权平均F1:
f1 = f1_score(target, predicted, average='weighted')
因为类别3在真实标签中样本数为0,权重为0,不会对最终得分产生影响。但要注意该策略会偏向样本数多的类别。
3. 自定义类别权重(适合已知类别分布的场景)
如果你明确知道三分类的全局类别分布(比如训练集的分布),可以单独计算每个类别的F1后按预设权重手动计算平均,不受验证集标签分布的影响。
注意事项
如果你的验证集本应包含类别3、只是漏标注了,那优先修正验证集的标注问题,再使用标准macro平均计算,才能准确衡量模型的全局三分类性能。
内容的提问来源于stack exchange,提问作者user14675723
相关产品推荐
相关产品推荐

