UAR (Unweighted Average Recall) 指标详解
UAR(Unweighted Average Recall) 是一种评估多分类或不平衡分类任务中模型性能的重要指标,特别是在类别分布不均匀时,用于弥补传统分类指标(如 Accuracy)的不足。
1. 什么是 UAR?
UAR 是各类别召回率(Recall)的算术平均值,不考虑每个类别的样本数量。相比于加权指标(如 Weighted Average Recall),UAR 更关注模型在小样本类别上的表现。
- 公式:
UAR = 1 C ∑ c = 1 C Recall c \text{UAR} = \frac{1}{C} \sum_{c=1}^C \text{Recall}_c UAR=C1∑c=1CRecallc
C C C:类别总数。
Recall c \text{Recall}_c Recallc:第 c c c类的召回率,计算方式为:
Recall c = True Positives for class c Total samples of class c \text{Recall}_c = \frac{\text{True Positives for class c}}{\text{Total samples of class c}} Recallc=Total samples of class cTrue Positives for class c
2. 与 Recall 的区别
普通的 Recall 关注每个类别的召回率,但在计算时会根据类别的样本数量加权。这在类别分布不平衡的情况下会导致大类别主导整体指标。
-
Weighted Recall:
Weighted Recall = 1 N ∑ c = 1 C n c ⋅ Recall c \text{Weighted Recall} = \frac{1}{N} \sum_{c=1}^C n_c \cdot \text{Recall}_c Weighted Recall=N1∑c=1Cnc⋅Recallc
其中 n c n_c nc是类别 c c c的样本数量, N N N是总样本数。 -
UAR 则直接取所有类别召回率的平均值,无论样本数量多少。因此,它对小样本类别的性能更加敏感。
3. 为什么使用 UAR?
-
类别不平衡问题:
在数据集中,某些类别的样本可能占绝大多数(如分类中有 90% 的样本属于一个类别)。传统的准确率或加权指标可能被大类别的表现主导,忽略了小类别的性能。 -
更公平的衡量标准:
UAR 通过对每个类别的召回率进行简单平均,确保所有类别都得到平等的关注,适用于以下场景:- 数据分布高度不均衡。
- 小类别的重要性与大类别相当(如医疗诊断中罕见疾病的识别)。
4. 计算过程
以一个三分类任务为例,类别分别为 A
, B
, C
,样本分布如下:
A
:100 个样本B
:30 个样本C
:20 个样本
预测结果的召回率为:
Recall
A
=
90
/
100
=
0.9
\text{Recall}_A = 90/100 = 0.9
RecallA=90/100=0.9
Recall
B
=
20
/
30
=
0.6667
\text{Recall}_B = 20/30 = 0.6667
RecallB=20/30=0.6667
Recall
C
=
10
/
20
=
0.5
\text{Recall}_C = 10/20 = 0.5
RecallC=10/20=0.5
计算 UAR:
UAR
=
1
3
(
Recall
A
+
Recall
B
+
Recall
C
)
\text{UAR} = \frac{1}{3} \left( \text{Recall}_A + \text{Recall}_B + \text{Recall}_C \right)
UAR=31(RecallA+RecallB+RecallC)
UAR
=
1
3
(
0.9
+
0.6667
+
0.5
)
=
0.6889
\text{UAR} = \frac{1}{3} (0.9 + 0.6667 + 0.5) = 0.6889
UAR=31(0.9+0.6667+0.5)=0.6889
即使类别 C
样本数较少,其召回率仍对最终结果产生了同等影响。
5. 实现 UAR 的方法
在 scikit-learn
中,可以通过手动计算每个类别的召回率,然后取其平均值来实现 UAR:
from sklearn.metrics import recall_score
import numpy as np
# 假设真实标签和预测结果如下:
y_true = [0, 0, 1, 1, 1, 2, 2, 2, 2, 2] # 真实类别
y_pred = [0, 1, 1, 1, 1, 2, 2, 0, 2, 1] # 预测类别
# 计算每个类别的召回率
recalls = recall_score(y_true, y_pred, average=None) # 输出每个类别的召回率
# 计算 UAR
uar = np.mean(recalls)
print(f"UAR: {uar}")
6. UAR 的优势和局限性
优势:
- 对类别不平衡问题敏感。
- 强调所有类别的表现,尤其是小类别。
局限性:
- 在类别分布相对平衡的情况下,与 Weighted Recall 或 Accuracy 差别不大。
- 忽略了类别的重要性权重(某些任务可能需要对某些类别赋予更高权重)。
7. 应用场景
- 医疗诊断:少数类别可能是罕见疾病,UAR 可评估对这些类别的识别能力。
- 异常检测:异常样本(小类别)的识别往往比正常样本更重要。
- 语音识别、多模态学习:如对话情绪分类中的小类别情绪识别。
最后
UAR 是一个公平、类别无关的评估指标,适用于类别不平衡问题。它通过对每个类别的召回率简单平均,确保模型在所有类别上的性能被同等对待,非常适合需要平衡各类别表现的场景。