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

计算多标签数据集macro平均F1值报UndefinedMetricWarning如何解决

问题场景

多标签分类模型评估过程中,使用如下代码以macro平均模式逐标签计算F1分数,结果追加存储到结果列表:

f1_score_results.append(f1_score(y_train[col], y_pred_train[col_idx], average='macro'))

代码可正常输出F1计算结果,但运行时会抛出UndefinedMetricWarning警告:
UndefinedMetricWarning警告内容截图

为排查警告原因,编写代码打印训练集、测试集的特征及标签字段全局唯一值数量:

print(len(np.unique(X_train)))
print(len(np.unique(X_test)))
print(len(np.unique(y_train)))
print(len(np.unique(y_test)))

代码运行输出如下:
唯一值统计结果截图

警告产生原因

UndefinedMetricWarning的核心触发逻辑是:计算分类指标时,存在类别在真实标签或预测结果中完全没有样本,导致精确率、召回率计算时分母为0,对应F1值无定义。
结合代码场景具体分析:

  1. macro平均F1的计算逻辑是先单独计算每个类别的F1值,再对所有类别F1做算术平均,不区分类别样本量大小。只要有任意一个类别在当前计算的标签列、对应预测结果中样本数为0,就会触发该警告,此时sklearn默认会将该类别的F1值记为0参与后续平均。
  2. 之前打印的是整个特征矩阵、整个标签矩阵的全局唯一值数量,这类全局统计结果无法定位问题——代码是逐列遍历计算单个标签的F1,全局标签有2种取值不代表每一个单独的标签列都同时包含2个类别。多标签数据集中很常见部分标签列样本极度不均衡,甚至在训练集某拆分中只存在单一类别的情况,这就是警告的直接来源。
可落地解决方法

根据业务场景选择对应方案即可:

  • 方案1:计算前校验单标签列的类别分布,过滤无效列
    逐列计算F1前先判断当前标签列是否包含所有预期类别,如果某列仅存在单一类别,直接跳过该列计算,或单独标记这类列的评估结果,不参与macro平均。参考代码:
    # 替换为数据集实际全量标签集合,二分类场景一般为[0,1]
    EXPECTED_LABELS = [0, 1]
    for col_idx, col in enumerate(label_cols):
        col_unique_labels = np.unique(y_train[col])
        # 当前列类别数不足,跳过计算
        if len(col_unique_labels) < len(EXPECTED_LABELS):
            print(f"标签列{col}仅包含类别{col_unique_labels.tolist()},无有效二分类分布,跳过F1计算")
            continue
        f1_score_results.append(
            f1_score(y_train[col], y_pred_train[col_idx], average='macro', labels=EXPECTED_LABELS)
        )
    
  • 方案2:显式声明计算参数,消除警告
    调用f1_score时传入labels参数明确需要覆盖的全量类别,同时传入zero_division参数显式指定0分母场景下的指标取值,和sklearn默认行为保持一致的同时消除警告。参考代码:
    f1_score_results.append(
        f1_score(
            y_train[col],
            y_pred_train[col_idx],
            average='macro',
            labels=[0,1], # 替换为实际全量标签集合
            zero_division=0 # 类别无样本时对应指标按0计算
        )
    )
    
  • 方案3:业务允许的前提下直接过滤指定警告
    如果确认单类别标签列的存在符合业务预期,且默认将无样本类别F1记为0的计算逻辑满足评估要求,可以直接通过warnings模块过滤该类警告,避免干扰正常日志输出:
    import warnings
    from sklearn.exceptions import UndefinedMetricWarning
    # 仅过滤UndefinedMetricWarning类警告
    warnings.filterwarnings('ignore', category=UndefinedMetricWarning)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:03:48