机器学习系列 | 01:多类别分类任务(multi-class)中为何precision,recall和F1相等?

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 在 multi-class 分类任务中,如果使用 micro 类指标,那么 micro-precision, micro-recall和micro-F1值都是相等的。本文主要针对这个现象进行解释。

背景:

在 multi-class 分类任务中,如果使用 micro 类指标,那么 micro-precision, micro-recall和micro-F1值都是相等的。本文主要针对这个现象进行解释。

更多、更及时内容欢迎微信公众号小窗幽记机器学习 围观。

precision, recall和F1 score的定义

true positive(TP): 真实 positive,预测 positive
False positive(FP): 真实 negative,预测 positive
false negative(FN): 真实 positive,预测 negative

image.png

Precision 计算如下:
$$ P = \frac{TP}{TP+FP} $$

精确度可以直观地理解为分类器只将真正positive样本预测为正的能力。比如,在类别平衡的测试集(50%是positive的,50%是negative的)中,一个分类器将所有样本都分类为positive,那么该分类器的精确度为0.5。如果没有假阳性(false positives),即只将true positives 归为positives,则精确度为1.0。所以基本上,分类器给出的假阳性(false positives)越少,它的精度就越高。

Recall 计算如下:
$$ R = \frac{TP}{TP+FN} $$
召回可以理解为真正为positive测试样品的数量中实际被分类为positive的占比。如果一个分类器对每个样本都识别为positive ,而不管它是否真的是positive,那么该分类器的recall是1.0,但精度较低。

因此,精确度和召回率越高,分类器的性能就越好,因为它能检测到大部分的positive 样本(即高召回率), 而不检测到许多不应该检测到的样本(即高精度)。为了量化这一点,可以使用另一个称为F1评分的度量指标。

F1 score 计算如下:
$$ F1 = 2 \frac{P * R}{P + R} $$

F1 score 是精确度和召回率之间的调和平均数。精度和召回率越高,F1得分越高。从该式子可以看出,如果$P=R$,那么$F1=P=R$:
$$ F1 = 2 \frac{P * R}{P + R} = 2 \frac{P * P}{P + P} = 2 \frac{P^2}{2P} = \frac{P^2}{P} = P $$

所以这解释了如果精确度和召回率是一样,F1分数和精确度和召回率是一样。那为什么在multi-class任务中使用micro平均时, recall和 precision是一样的?下面具体举个实例说明。

micro averaging的计算及其示例

在multi-class任务中计算precision 和 recall,需要知道TP, FP和FN样本的数量。假设有3个类(1,2,3),每个样本恰好属于一个类,即multi-class任务。下表显示分类器对9个测试样本的预测以及它们的正确标签。

Label        1    2    3    2    3    3    1    2    2
Prediction    2    2    1    2    1    3    2    3    2

image.png

TP 是被预测有正确标签的样本数量。在本例中,TP = 4(均为绿色单元格)
FP 不应该获得的标签的但是获取了标签数量。例如,在第一列中应该被预测为1,但被预测为2。所以在这种情况下,类2出现一个 false positive。即,对于类别2来说,是FP。另一方面,如果预测是正确的(第2列),则不会被统计到FP。在本例中,FP = 5(均为红色单元格)

FN 是应该被预测但没有被预测的标签数量。再看第一列,1应该被预测到,但没有。所以在这种情况下,类1有一个FN。与FP情况一样,如果预测正确,则不计算FN(第2列)。即,对于类别1来说,是FN。在本例中,FP = 5(均为红色单元格)

换句话说,如果有false positive,也总会有false negative,反之亦然,因为总是有一类被预测。如果预测了A类,真标签是B,那么对于A类别就有FP,对于B类别就有FN。如果预测是正确的,即预测了A类,A也是真标签,那么既没有false positive,也没有false negative,只有true positive。 因此不存在只增加FP或FN而不同时增加两者的可能性。即,两者一定是同时变化的,那么一起增加,要么同时不增加。这就是为什么在使用micro平均方案时precision 和 recall总是相同。
micro precision 和 micro recall 计算如下:
$$ \text{micro precision}=\frac{TP_1+TP_2+TP_3}{TP_1+FP_1+TP_2+FP_2+TP_3+FP_3} $$

$$ \text{micro recall}=\frac{TP_1+TP_2+TP_3}{TP_1+FN_1+TP_2+FN_2+TP_3+FN_3} $$
简而言之,micro precision 分子是全部的TP,分母是全部类别的TP+FP;micro recall的分母是全部类别的TP+FN。

上述实例precision, recall 和 F1 score的计算如下:
Precision $P = \frac{4}{4+5} = \frac{4}{9} = 0.4444$
Recall $R = \frac{4}{4+5} = \frac{4}{9} = 0.4444$
F1 score $F1 = 2 \frac{\frac{4}{9} * \frac{4}{9}}{\frac{4}{9} + \frac{4}{9}} = \frac{\frac{4}{9}^2}{\frac{4}{9}} = \frac{4}{9} = 0.4444$

注意:
由于micro平均不区分不同的类别,只是平均他们的度量分数,这种平均方案不容易由于测试集的不均匀分布(例如,3个类别,其中一个类别有98%的样本)而产生不准确的值。即,样本类别分布不均衡的场景,选用micro平均更适合。在不均匀分布的数据集的情况下,除了使用micro平均,也可以考虑加权平均,即weighted averaging。

macro averaging 和 weighted averaging

需要特别注意,上面的解释只适用于micro averaging(微平均)!当使用 macro averaging时,计算每个标签的指标,并找到它们的未加权平均值。所以macro averaging并没有考虑到各类标签样本的不平衡。
如果对上述micro averaging示例计算macro averaging,那么对于每个类1、2、3,分别计算精度、召回率和F1得分的值,然后取平均值,而不管它们在数据集中的出现频率如何。因此,如果两个类各只出现1%,第三个类出现98%,较大的类(类别3)总是被正确预测,但较小的类(类别1和类别2)经常出错,那么F1分数仍然会非常糟糕,而使用micro averaging or weighted averaging则会好很多。简而言之,macro averaging 给所有类别相同的权重,该方法能够平等看待每个类别,所以值会受稀有类别影响。

当使用 weighted averaging(加权平均)时, 在计算过程也会考虑各个类别出现的频率,这样F1 score 会很高(因为只有2%的样本预测主要是错误的)。这取决于你选择什么用例。如果较小的类非常重要,那么weighted averaging 可能是一个糟糕的选择,应该选择macro averaging。

macro averaging 示例

为了完整起见,这里将进一步展示使用macro averaging时如何计算精度、召回率和F1。在这种情况下,首先要分别为每一个类计算精度、召回率和F1。现在可以把每个类看作一个二进制标签(类预测是/否)。在前面micro averaging例子中(见上表),每个类的TP, FN, FP值和计算得到的精度(P),召回率(R)和F1得分如下:

Class 1: TP = 0 ; FN = 2 ; FP = 2 => P = 0 ; R = 0 ; F1 = 0
Class 2: TP = 3 ; FN = 1 ; FP = 2 => P = $\frac{3}{5}$ ; R = $\frac{3}{4}$ ; F1 = $\frac{2}{3}$
Class 3: TP = 1 ; FN = 2 ; FP = 1 => P = $\frac{1}{2}$ ; R = $\frac{1}{3}$ ; F1 = $\frac{2}{5}$

将全部类别联合:
TP = 4 ; FN = 5 ; FP = 5 (顺便说一下,这些值与 micro average示例中的值相同)。

最终计算结果如下:

Precision (average over all classes): (3/5 + 1/2)/3 = 0.36667
Recall (average over all classes): (3/4+1/3)/3 = 0.36111
F1 (average over all classes): (2/3+2/5)/3 = 0.35556

这些数值与micro averaging 不同,比 micro averaging 低得多。因为第1类甚至没有一个 true positive ,所以对于类别1来说精确度和召回率都很差。

使用weighted-average获取到的结果应该与micro-average的结果近似,weighted-average同样考虑样本的不均衡。

Weighted-average给不同类别不同权重(权重根据该类别的真实分布比例确定),每个类别乘权重后再进行相加。该方法考虑了类别不平衡情况,它的值更容易受到常见类(majority class)的影响。

$$ \text{Weighted-Precision}=\text{P}_{class1} \times \text{W}_{class1} + \text{P}_{class2} \times \text{W}_{class2}+... $$
Weighted-Recall的计算同理。

代码示例

from sklearn.metrics import precision_score, recall_score, f1_score

# These values are the same as in the table above
labels      = [1,2,3,2,3,3,1,2,2]
predicitons = [2,2,1,2,1,3,2,3,2]

print("Precision (micro): %f" % precision_score(labels, predicitons, average='micro'))
print("Recall (micro):    %f" % recall_score(labels, predicitons, average='micro'))
print("F1 score (micro):  %f" % f1_score(labels, predicitons, average='micro'), end='\n\n')

print("Precision (macro): %f" % precision_score(labels, predicitons, average='macro'))
print("Recall (macro):    %f" % recall_score(labels, predicitons, average='macro'))
print("F1 score (macro):  %f" % f1_score(labels, predicitons, average='macro'), end='\n\n')

print("Precision (weighted): %f" % precision_score(labels, predicitons, average='weighted'))
print("Recall (weighted):    %f" % recall_score(labels, predicitons, average='weighted'))
print("F1 score (weighted):  %f" % f1_score(labels, predicitons, average='weighted'))

运行结果如下:

Precision (micro): 0.444444
Recall (micro):    0.444444
F1 score (micro):  0.444444

Precision (macro): 0.366667
Recall (macro):    0.361111
F1 score (macro):  0.355556

Precision (weighted): 0.433333
Recall (weighted):    0.444444
F1 score (weighted):  0.429630
相关文章
|
4月前
|
机器学习/深度学习 数据采集 算法
深度学习和机器学习中针对非时间序列的回归任务,有哪些改进角度?
本文探讨了在深度学习和机器学习中针对非时间序列的回归任务的多种改进策略,包括数据预处理、数据集增强、特征选择、模型选择、模型正则化与泛化、优化器选择、学习率调整、超参数调优以及性能评估与模型解释,旨在提升模型的性能和可解释性。
84 1
深度学习和机器学习中针对非时间序列的回归任务,有哪些改进角度?
|
21天前
|
机器学习/深度学习 自然语言处理
在模型训练中,如何平衡通用性和特定任务的需求
在模型训练中平衡通用性和特定任务需求是关键挑战。策略包括预训练与微调、多任务学习、结合任务无关与相关特征、选择适当架构、领域适应、数据增强、超参数调整、注意力机制、层级化训练、模型集成、利用中间表示、持续评估、避免过拟合、考虑伦理偏见、优化资源效率及收集用户反馈。这些方法有助于训练出既通用又专业的模型。
|
2月前
|
机器学习/深度学习
如何用贝叶斯方法来解决机器学习中的分类问题?
【10月更文挑战第5天】如何用贝叶斯方法来解决机器学习中的分类问题?
|
2月前
|
机器学习/深度学习 存储 自然语言处理
【机器学习】基于逻辑回归的分类预测
【机器学习】基于逻辑回归的分类预测
|
2月前
|
机器学习/深度学习 传感器 算法
机器学习入门(一):机器学习分类 | 监督学习 强化学习概念
机器学习入门(一):机器学习分类 | 监督学习 强化学习概念
|
2月前
|
机器学习/深度学习 算法 数据可视化
机器学习的核心功能:分类、回归、聚类与降维
机器学习领域的基本功能类型通常按照学习模式、预测目标和算法适用性来分类。这些类型包括监督学习、无监督学习、半监督学习和强化学习。
47 0
|
4月前
|
监控 测试技术
在模型训练中,如何衡量和平衡通用性和特定任务需求的重要性?
在模型训练中,如何衡量和平衡通用性和特定任务需求的重要性?
|
4月前
|
机器学习/深度学习 人工智能 算法
【人工智能】机器学习、分类问题和逻辑回归的基本概念、步骤、特点以及多分类问题的处理方法
机器学习是人工智能的一个核心分支,它专注于开发算法,使计算机系统能够自动地从数据中学习并改进其性能,而无需进行明确的编程。这些算法能够识别数据中的模式,并利用这些模式来做出预测或决策。机器学习的主要应用领域包括自然语言处理、计算机视觉、推荐系统、金融预测、医疗诊断等。
81 1
|
4月前
|
机器学习/深度学习 自然语言处理
在模型训练中,如何平衡通用性和特定任务的需求?
在模型训练中,如何平衡通用性和特定任务的需求?
|
4月前
|
机器学习/深度学习
如何用贝叶斯方法来解决机器学习中的分类问题?
如何用贝叶斯方法来解决机器学习中的分类问题?