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
相关产品推荐
相关产品推荐

