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

Scikit-learn中macro accuracy相关问题:recall等价性及计算方法

问题解答

输出的recall是否等价于macro accuracy?

不等价。

原因如下:

  • 你例子中precision_recall_fscore_support输出的macro recall,是对所有出现在y_true或y_pred中的类别分别计算recall后取算术平均。你的数据里y_pred出现了类别0,所以会被纳入计算:

    • 类别2的recall:17/18 ≈ 0.9444
    • 类别0的recall:由于y_true中没有该类样本,TP=0、FN=0,sklearn将其recall设为0
    • 最终macro recall = (0.9444 + 0)/2 ≈ 0.4722
  • 而macro accuracy的标准定义是:对所有有真实样本的类别,计算该类别的正确预测数占其真实样本数的比例(即该类别的recall),再取算术平均。你的数据中只有类别2有真实样本,所以macro accuracy = 17/18 ≈ 0.9444,和输出的recall明显不同。

如何通过Scikit-learn计算macro accuracy?

Scikit-learn没有直接提供macro_accuracy函数,但可以通过以下两种方式实现:

方法1:基于recall_score手动筛选有效类别

import numpy as np
from sklearn.metrics import recall_score

y_true = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
y_pred = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2]

# 获取每个类别的recall
per_class_recall = recall_score(y_true, y_pred, average=None)
# 获取所有有真实样本的类别索引
unique_classes = np.unique(y_true)
valid_mask = [np.sum(y_true == c) > 0 for c in unique_classes]
# 计算macro accuracy
macro_accuracy = np.mean(per_class_recall[valid_mask])
print(macro_accuracy)  # 输出:0.9444444444444444

方法2:手动统计每个类别的正确数与真实数

import numpy as np

y_true = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
y_pred = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2]

unique_classes = np.unique(y_true)
accuracy_scores = []
for c in unique_classes:
    # 统计该类别的真实样本数
    true_count = np.sum(y_true == c)
    if true_count == 0:
        continue
    # 统计该类别的正确预测数
    correct_count = np.sum((y_true == c) & (y_pred == c))
    accuracy_scores.append(correct_count / true_count)

macro_accuracy = np.mean(accuracy_scores)
print(macro_accuracy)  # 输出:0.9444444444444444

注:如果你的场景需要把y_pred中出现但y_true中没有的类别也纳入macro accuracy计算(这种情况很少见),那直接使用recall_score(y_true, y_pred, average='macro')的结果即可,但这不符合macro accuracy的常规定义。

内容的提问来源于stack exchange,提问作者S.EB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:42:57