分类准确率是正确预测的总数除以对数据集进行的预测总数。
作为一种性能度量,准确率不适用于不平衡分类问题。
主要原因是,多数类别(或多个类别)的样本数量过多,会淹没少数类别的样本数量,这意味着即使是不熟练的模型也能达到 90% 或 99% 的准确率分数,具体取决于类别不平衡的严重程度。
代替使用分类准确率,可以使用精确率和召回率指标。
在本教程中,您将学习如何计算和理解不平衡分类的精确率和召回率。
完成本教程后,您将了解:
- 精确率量化了实际属于正类别的正类别预测的数量。
- 召回率量化了数据集中所有正样本中做出的正类别预测的数量。
- F 值提供了一个单一的分数,该分数在同一个数字中平衡了精确率和召回率。
通过我的新书《使用 Python 进行不平衡分类》**启动您的项目**,其中包括*分步教程*和所有示例的*Python 源代码文件*。
让我们开始吧。
- 2020 年 1 月更新:改进了关于精确率和召回率目标的语言。修复了关于精确率和召回率旨在最小化什么的错别字(感谢评论!)。
- 2020 年 2 月更新:修复了召回率和 F1 的变量名中的错别字。

如何计算不平衡分类的精确率、召回率和 F-Measure
图片由Waldemar Merger拍摄,部分权利保留。
教程概述
本教程分为五个部分;它们是:
- 不平衡分类的混淆矩阵
- 不平衡分类的精确率
- 不平衡分类的召回率
- 不平衡分类的精确率 vs. 召回率
- 不平衡分类的 F 值
不平衡分类的混淆矩阵
在深入了解精确率和召回率之前,回顾混淆矩阵很重要。
对于不平衡分类问题,多数类别通常被称为负结果(例如“*无变化*”或“*阴性检测结果*”),而少数类别通常被称为正结果(例如“变化”或“阳性检测结果”)。
混淆矩阵不仅提供了对预测模型性能的更多洞察,还提供了哪些类别被正确预测、哪些被错误预测以及正在犯哪些类型错误的信息。
最简单的混淆矩阵适用于二分类问题,包含负类(类别 0)和正类(类别 1)。
在此类混淆矩阵中,表格中的每个单元格都有一个特定且易于理解的名称,总结如下:
1 2 3 |
| 正向预测 | 负向预测 正类别 | 真阳性 (TP) | 假阴性 (FN) 负类别 | 假阳性 (FP) | 真阴性 (TN) |
精确率和召回率指标是根据混淆矩阵中的单元格定义的,特别是像真阳性和假阴性这样的术语。
现在我们已经复习了混淆矩阵,让我们更仔细地看看精确率指标。
不平衡分类的精确率
精确率是量化正确正向预测数量的指标。
因此,精确率计算的是少数类别的准确率。
它计算方法是正确预测的正向示例数除以预测的正向示例总数。
精确率评估在被分类为正向的实例中,正确分类的实例所占的比例…
——第 52 页,《从不平衡数据集学习》,2018 年。
二分类的精确率
在一个具有两个类别的不平衡分类问题中,精确率被计算为真阳性数量除以真阳性和假阳性的总和。
- 精确率 = 真阳性 / (真阳性 + 假阳性)
结果是一个介于 0.0(无精确率)到 1.0(完全或完美精确率)之间的值。
让我们通过一些例子来具体化这个计算。
考虑一个少数类别与多数类别比例为 1:100 的数据集,其中包含 100 个少数类别样本和 10,000 个多数类别样本。
一个模型进行了预测,预测了 120 个样本属于少数类别,其中 90 个正确,30 个不正确。
该模型的精确率计算如下:
- 精确率 = 真阳性 / (真阳性 + 假阳性)
- 精确率 = 90 / (90 + 30)
- 精确率 = 90 / 120
- 精确率 = 0.75
结果是精确率为 0.75,这是一个合理但并不出色的值。
您可以看到,精确率简单来说就是所有正向预测中正确正向预测的比例,或者是少数类别预测的准确率。
考虑相同的数据集,模型预测 50 个样本属于少数类别,其中 45 个是真阳性,5 个是假阳性。我们可以这样计算该模型的精确率:
- 精确率 = 真阳性 / (真阳性 + 假阳性)
- 精确率 = 45 / (45 + 5)
- 精确率 = 45 / 50
- 精确率 = 0.90
在这种情况下,尽管模型预测属于少数类别的样本数量少得多,但正确正类样本的比例要好得多。
这突出了虽然精确率很有用,但它并不能说明全部情况。它没有评论有多少真实的正类样本被预测为负类,即所谓的假阴性。
想要开始学习不平衡分类吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
多分类的精确率
精确率不限于二分类问题。
在具有两个以上类别的不平衡分类问题中,精确率计算为所有类别中的真阳性总和除以所有类别中的真阳性和假阳性总和。
- 精确率 = C 中的 Sum c TruePositives_c / C 中的 Sum c (TruePositives_c + FalsePositives_c)
例如,我们可能有一个不平衡的多类别分类问题,其中多数类别是负类别,但有两个正少数类别:类别 1 和类别 2。精确率可以量化两个正类别中正确预测的比例。
考虑一个少数类别与多数类别的比例为 1:1:100 的数据集,即每个正类别的比例为 1:1,少数类别与多数类别的比例为 1:100,并且每个少数类别有 100 个样本,多数类别有 10,000 个样本。
一个模型进行预测,预测第一个少数类别有 70 个样本,其中 50 个正确,20 个不正确。它预测第二个类别有 150 个样本,其中 99 个正确,51 个不正确。该模型的精确率可以计算如下:
- 精确率 = (真阳性_1 + 真阳性_2) / ((真阳性_1 + 真阳性_2) + (假阳性_1 + 假阳性_2))
- 精确率 = (50 + 99) / ((50 + 99) + (20 + 51))
- 精确率 = 149 / (149 + 71)
- 精确率 = 149 / 220
- 精确率 = 0.677
我们可以看到,随着少数类别数量的增加,精确率指标的计算也会相应地进行扩展。
使用 Scikit-Learn 计算精确率
可以使用 precision_score() scikit-learn 函数计算精确率分数。
例如,我们可以使用此函数计算上一节中场景的精确率。
首先,在 100 个正样本对 10,000 个负样本的情况下,模型预测了 90 个真阳性和 30 个假阳性。完整示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 计算 1:100 数据集(90 个真阳性和 30 个假阳性)的精确率 from sklearn.metrics import precision_score # 定义实际值 act_pos = [1 for _ in range(100)] act_neg = [0 for _ in range(10000)] y_true = act_pos + act_neg # 定义预测值 pred_pos = [0 for _ in range(10)] + [1 for _ in range(90)] pred_neg = [1 for _ in range(30) + [0 for _ in range(9970)] y_pred = pred_pos + pred_neg # 计算预测值 precision = precision_score(y_true, y_pred, average='binary') print('Precision: %.3f' % precision) |
运行示例计算精确率,与我们手动计算的结果一致。
1 |
精确率:0.750 |
接下来,我们可以使用相同的函数来计算多类别问题的精确率,该问题具有 1:1:100 的比例,其中每个少数类别有 100 个样本,多数类别有 10,000 个样本。模型预测类别 1 有 50 个真阳性和 20 个假阳性,类别 2 有 99 个真阳性和 51 个假阳性。
在多类别分类中使用 `precision_score()` 函数时,重要的是通过“`labels`”参数指定少数类别,并将“`average`”参数设置为“`micro`”以确保计算按预期进行。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 计算 1:1:100 数据集的精确率,其中 50tp、20fp、99tp、51fp from sklearn.metrics import precision_score # 定义实际值 act_pos1 = [1 for _ in range(100)] act_pos2 = [2 for _ in range(100)] act_neg = [0 for _ in range(10000)] y_true = act_pos1 + act_pos2 + act_neg # 定义预测值 pred_pos1 = [0 for _ in range(50)] + [1 for _ in range(50)] pred_pos2 = [0 for _ in range(1) + [2 for _ in range(99)] pred_neg = [1 for _ in range(20) + [2 for _ in range(51) + [0 for _ in range(9929)] y_pred = pred_pos1 + pred_pos2 + pred_neg # 计算预测值 precision = precision_score(y_true, y_pred, labels=[1,2], average='micro') print('Precision: %.3f' % precision) |
同样,运行示例计算多类别示例的精确率,与我们的手动计算结果一致。
1 |
精确率:0.677 |
不平衡分类的召回率
召回率是量化所有可能做出的正向预测中正确正向预测数量的指标。
与只评论所有正向预测中正确正向预测的精确率不同,召回率提供了对遗漏正向预测的指示。
通过这种方式,召回率提供了正类别覆盖率的一些概念。
对于不平衡学习,召回率通常用于衡量少数类别的覆盖率。
——第 27 页,《不平衡学习:基础、算法和应用》,2013 年。
二分类的召回率
在具有两个类别的不平衡分类问题中,召回率计算为真阳性数量除以真阳性和假阴性的总和。
- 召回率 = 真阳性 / (真阳性 + 假阴性)
结果是一个介于 0.0(无召回)到 1.0(完全或完美召回)之间的值。
让我们通过一些例子来具体化这个计算。
如上一节所述,考虑一个少数类别与多数类别比例为 1:100 的数据集,其中包含 100 个少数类别样本和 10,000 个多数类别样本。
一个模型进行预测,正确预测了 90 个正类别预测,错误预测了 10 个。我们可以这样计算该模型的召回率:
- 召回率 = 真阳性 / (真阳性 + 假阴性)
- 召回率 = 90 / (90 + 10)
- 召回率 = 90 / 100
- 召回率 = 0.9
该模型的召回率很高。
多分类的召回率
召回率不限于二分类问题。
在具有两个以上类别的不平衡分类问题中,召回率计算为所有类别中的真阳性总和除以所有类别中的真阳性和假阴性总和。
- 召回率 = C 中的 Sum c TruePositives_c / C 中的 Sum c (TruePositives_c + FalseNegatives_c)
如上一节所述,考虑一个少数类别与多数类别比例为 1:1:100 的数据集,即每个正类别的比例为 1:1,少数类别与多数类别的比例为 1:100,并且每个少数类别有 100 个样本,多数类别有 10,000 个样本。
模型预测类别 1 有 77 个正确示例和 23 个不正确示例,类别 2 有 95 个正确示例和 5 个不正确示例。我们可以这样计算该模型的召回率:
- 召回率 = (真阳性_1 + 真阳性_2) / ((真阳性_1 + 真阳性_2) + (假阴性_1 + 假阴性_2))
- 召回率 = (77 + 95) / ((77 + 95) + (23 + 5))
- 召回率 = 172 / (172 + 28)
- 召回率 = 172 / 200
- 召回率 = 0.86
使用 Scikit-Learn 计算召回率
可以使用 recall_score() scikit-learn 函数计算召回率分数。
例如,我们可以使用此函数计算上述场景的召回率。
首先,我们可以考虑 1:100 不平衡的情况,分别有 100 个和 10,000 个样本,模型预测 90 个真阳性和 10 个假阴性。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 计算 1:100 数据集(90 个真阳性和 10 个假阴性)的召回率 from sklearn.metrics import recall_score # 定义实际值 act_pos = [1 for _ in range(100)] act_neg = [0 for _ in range(10000)] y_true = act_pos + act_neg # 定义预测值 pred_pos = [0 for _ in range(10)] + [1 for _ in range(90)] pred_neg = [0 for _ in range(10000)] y_pred = pred_pos + pred_neg # 计算召回率 recall = recall_score(y_true, y_pred, average='binary') print('Recall: %.3f' % recall) |
运行示例后,我们可以看到分数与上述手动计算结果一致。
1 |
召回率:0.900 |
我们还可以使用 `recall_score()` 来处理不平衡的多类别分类问题。
在这种情况下,数据集具有 1:1:100 的不平衡,每个少数类别有 100 个样本,多数类别有 10,000 个样本。模型预测类别 1 有 77 个真阳性和 23 个假阴性,类别 2 有 95 个真阳性和 5 个假阴性。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 计算 1:1:100 数据集(77tp、23fn 和 95tp、5fn)的召回率 from sklearn.metrics import recall_score # 定义实际值 act_pos1 = [1 for _ in range(100)] act_pos2 = [2 for _ in range(100)] act_neg = [0 for _ in range(10000)] y_true = act_pos1 + act_pos2 + act_neg # 定义预测值 pred_pos1 = [0 for _ in range(23) + [1 for _ in range(77)] pred_pos2 = [0 for _ in range(5) + [2 for _ in range(95)] pred_neg = [0 for _ in range(10000)] y_pred = pred_pos1 + pred_pos2 + pred_neg # 计算召回率 recall = recall_score(y_true, y_pred, labels=[1,2], average='micro') print('Recall: %.3f' % recall) |
同样,运行示例计算多类别示例的召回率,与我们手动计算的结果一致。
1 |
召回率:0.860 |
不平衡分类的精确率 vs. 召回率
您可以决定在不平衡分类问题中使用精确率或召回率。
最大化精确率将最小化假阳性数量,而最大化召回率将最小化假阴性数量。
- 精确率:当最小化假阳性是重点时适用。
- 召回率:当最小化假阴性是重点时适用。
有时,我们希望对正类别进行出色的预测。我们希望高精确率和高召回率。
这可能具有挑战性,因为召回率的增加往往以精确率的下降为代价。
在不平衡数据集中,目标是在不损害精确率的情况下提高召回率。然而,这些目标往往是相互冲突的,因为为了增加少数类别的 TP,FP 的数量也经常增加,从而导致精确率降低。
——第 55 页,《不平衡学习:基础、算法和应用》,2013 年。
尽管如此,我们不必选择其中一个指标,而是可以选择一个新指标,将精确率和召回率结合成一个分数。
不平衡分类的 F 值
分类准确率之所以被广泛使用,是因为它是衡量模型性能的单一指标。
F 值提供了一种将精确率和召回率结合为一个单一指标的方法,该指标同时捕捉了这两个属性。
单独来看,精确率或召回率都不能说明全部情况。我们可能精确率极高但召回率极差,反之亦然,可能精确率极差但召回率极高。F 值提供了一种用一个分数来表达这两种关注点的方法。
一旦计算出二分类或多分类问题的精确率和召回率,这两个分数就可以结合起来计算 F 值。
传统的 F 值计算方法如下:
- F 值 = (2 * 精确率 * 召回率) / (精确率 + 召回率)
这是这两个分数的调和平均值。这有时也称为 F 分数或 F1-分数,可能是处理不平衡分类问题时最常用的指标。
…F1-measure,它同等权重精确率和召回率,是在不平衡数据学习时最常使用的变体。
——第 27 页,《不平衡学习:基础、算法和应用》,2013 年。
与精确率和召回率一样,差的 F 值分数为 0.0,最好或完美的 F 值分数为 1.0。
例如,完美的精确率和召回率分数将导致完美的 F 值分数。
- F 值 = (2 * 精确率 * 召回率) / (精确率 + 召回率)
- F 值 = (2 * 1.0 * 1.0) / (1.0 + 1.0)
- F 值 = (2 * 1.0) / 2.0
- F 值 = 1.0
让我们用一个实际的例子来具体说明这个计算。
考虑一个二分类数据集,其中少数类别与多数类别的比例为 1:100,包含 100 个少数类别样本和 10,000 个多数类别样本。
考虑一个模型,它预测正类别有 150 个样本,其中 95 个正确(真阳性),这意味着有 5 个被遗漏(假阴性),55 个不正确(假阳性)。
我们可以这样计算精确率:
- 精确率 = 真阳性 / (真阳性 + 假阳性)
- 精确率 = 95 / (95 + 55)
- 精确率 = 0.633
我们可以这样计算召回率:
- 召回率 = 真阳性 / (真阳性 + 假阴性)
- 召回率 = 95 / (95 + 5)
- 召回率 = 0.95
这表明该模型的精确率较差,但召回率极佳。
最后,我们可以这样计算 F 值:
- F 值 = (2 * 精确率 * 召回率) / (精确率 + 召回率)
- F 值 = (2 * 0.633 * 0.95) / (0.633 + 0.95)
- F 值 = (2 * 0.601) / 1.583
- F 值 = 1.202 / 1.583
- F 值 = 0.759
我们可以看到,良好的召回率弥补了较差的精确率,从而得到了一个尚可或合理的 F 值。
使用 Scikit-Learn 计算 F 值
可以使用 f1_score() scikit-learn 函数计算 F 值分数。
例如,我们使用此函数计算上述场景的 F 值。
这是 1:100 不平衡的情况,分别有 100 个和 10,000 个样本,模型预测 95 个真阳性、5 个假阴性和 55 个假阳性。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 计算 1:100 数据集(95tp、5fn、55fp)的 F1 值 from sklearn.metrics import f1_score # 定义实际值 act_pos = [1 for _ in range(100)] act_neg = [0 for _ in range(10000)] y_true = act_pos + act_neg # 定义预测值 pred_pos = [0 for _ in range(5) + [1 for _ in range(95)] pred_neg = [1 for _ in range(55) + [0 for _ in range(9945)] y_pred = pred_pos + pred_neg # 计算分数 score = f1_score(y_true, y_pred, average='binary') print('F-Measure: %.3f' % score) |
运行示例计算 F 值,结果与我们的手动计算结果一致,存在一些微小的舍入误差。
1 |
F 值:0.760 |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
教程
论文
- 分类任务性能度量系统分析, 2009.
书籍
- 不平衡学习:基础、算法与应用 (Imbalanced Learning: Foundations, Algorithms, and Applications), 2013.
- 从不平衡数据集中学习 (Learning from Imbalanced Data Sets), 2018.
API
- sklearn.metrics.precision_score API.
- sklearn.metrics.recall_score API.
- sklearn.metrics.f1_score API.
文章
总结
在本教程中,您学习了如何计算和理解不平衡分类的精确率和召回率。
具体来说,你学到了:
- 精确率量化了实际属于正类别的正类别预测的数量。
- 召回率量化了数据集中所有正样本中做出的正类别预测的数量。
- F 值提供了一个单一的分数,该分数在同一个数字中平衡了精确率和召回率。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
“精确率:适用于假阴性成本更高的情况。
召回率:适用于假阳性成本更高的情况。”
这似乎是反的。通常,精确率是不是通过提高分类阈值(即,需要更高的正类别概率才能做出真实决策)来提高的,这会导致更少的假阳性和更多的假阴性?同样,召回率是不是通常通过降低分类阈值(即,需要更低的正类别概率才能做出真实决策)来提高的,这会导致更多的假阳性和更少的假阴性?
感谢您维护一个出色的博客。
谢谢,已更新!
Jason,关于 DS 和 ML 的系列文章非常棒。感谢您花时间撰写。
Curtis 的评论是正确的。
精确率 = TP / (TP + FP)
所以当 FP => 0 时,我们得到精确率 => 1
同样
召回率 = TP / (TP + FN)
所以当 FN => 0 时,我们得到召回率 => 1
顺便说一下,在文本分类的背景下,我发现使用那些
所谓的“显著词”可以让你选择那些能够实现
精确率和召回率之间更好平衡的特征
谢谢,我已经更新了教程。
哎呀——Curtis 抓得很准——这看起来相当基本,我猜原因可能是假日气氛太浓——不过 Jason,这仍然是一篇很棒的文章,谢谢你。我是一个忠实的粉丝。
马克·K
在多类别问题中,计算精确率和召回率有三种模式:微观、宏观和加权。您能否详细说明何时使用哪种模式?
好建议,谢谢!
首先,请参阅此处的描述:
https://scikit-learn.cn/stable/modules/generated/sklearn.metrics.precision_score.html
请详细阐述以下段落:
主要原因是,多数类别(或多个类别)的样本数量过多,会淹没少数类别的样本数量,这意味着即使是不熟练的模型也能达到 90% 或 99% 的准确率分数,具体取决于类别不平衡的严重程度。
通过忽略少数类别并建模多数类别,模型将表现“良好”。
这有帮助吗?
Jason,很棒的帖子。我与 Curtis 有同样的疑问。如果您有时间解释以下陈述背后的逻辑,我将不胜感激。
“精确率:适用于假阴性成本更高的情况。
召回率:适用于假阳性成本更高的情况。”
谢谢,我已经更新了教程。
嗨,Jason,我可以使用 `f1_score(y_true, y_pred, average='weighted')` 进行二分类吗?
或许可以测试一下?
谢谢,我用了它,但是精确率、召回率和 F 值似乎几乎相似,只是小数点后几位不同,这有效吗?
或许可以研究测试集上具体的预测,并了解分数是如何计算的。
你好,我有点困惑!
计算平衡和不平衡类别的精确率、召回率和 F 值有什么区别?
这些指标通常对不平衡数据集更有用。
主要考虑因素是确保“正类”是类标签 1 或通过 pos_label 参数标记。
谢谢
没错
我想知道如何计算平衡数据的精确率、召回率和 F 值?
它与不平衡数据的方法不同吗?
没有区别,只要你清楚地标记“正”类别。
我刚刚认识了你的网站
你有一些有用的内容
我受益匪浅
谢谢你
谢谢。
嗨,Jason,
谢谢你的教程。它真的很有帮助。你的课程材料很棒。
我买了你的两门课程。
我想知道,对于平衡数据集,如何将一个类别标记为正或负?
当数据不平衡时,数据增强会使其成为平衡数据集。那么哪种方法更好——
1. 通过数据增强制作平衡数据集
2. 保持数据不平衡,并定义精确率、召回率等。
再次感谢。
阿拉卡南达
谢谢你的支持!
没有最好的方法,我建议评估多种方法,并发现哪种方法对您的特定数据集效果好或最好。
杰森,很棒的文章!精确率和召回率的概念对于评估网络安全中的模型性能很有用。为了说明您的解释,这是一篇关于应用于网络安全中秘密检测的准确率与精确率与召回率的博客文章:
https://blog.gitguardian.com/secrets-detection-accuracy-precision-recall-explained/
感谢分享,Jean。
你好。感谢您的教程。我想问一个问题。我如何设置哪个是正类,哪个是负类?我正在使用 tensorflow 2. 版本,它提供了像精确率和召回率这样的指标。那么我不知道这个结果是哪个类的结果。您能给我一个线索吗?
不客气。
您可以设置“pos_label”参数来指定哪个是正类别,例如
https://scikit-learn.cn/stable/modules/generated/sklearn.metrics.precision_score.html
是否有可能计算网络搜索(如搜索引擎中的信息检索搜索)的召回率?如果可以,我们如何计算。
不,你无法访问完整的数据集或真实情况。
你好,
我正在思考标题,对于其他类型的分类,是否有所述的这三个指标(精确率、召回率、F 值)的特定计算方法?本博客中提到的计算方法是否只适用于不平衡分类?
我知道其目的是根据不平衡分类的目标展示哪个指标最重要。但是,这三个指标的计算方式,对于不平衡或非不平衡情况,它们是否不同?
没有区别。
它们是分类的指标,但在类别不平衡的任务中更有意义/更相关。
谢谢你的澄清。
不客气。
在总结部分——“你发现你发现了如何计算和理解不平衡分类的精确率和召回率。”有一个错别字。我只是想指出一下。感谢你的精彩文章!
谢谢,已修复!
那么,如果二分类设置中类别高度不平衡,哪种方式更可取?(Average='micro' 或 'macro' 或 'binary')?
好问题,请看这个
https://machinelearning.org.cn/precision-recall-and-f-measure-for-imbalanced-classification/
什么时候会使用平均值 = “macro”/“weighted” f-score?对于具有显著类别不平衡的多类别问题,使用“weighted”平均 f-score 是否有意义?
好问题,这将解释每种方法的精确率差异。
https://scikit-learn.cn/stable/modules/generated/sklearn.metrics.precision_score.html
或许可以改编上述示例,尝试每种方法并比较结果。
您好,感谢这篇精彩的教程。学到了很多。我有一个简短的评论。如果使用 scikit-learn 的混淆矩阵排序,即在列和行中都切换正负类别,会减少混淆。
谢谢。
嗨,Jason,
一如既往,好文章!我有两个问题。
问题一:在您的《不平衡分类评估指标之旅》文章中,您提到阈值指标的局限性在于它们假设训练数据集中观察到的类别分布将与测试集中的分布匹配。您还将精确率和召回率归类为阈值指标。如果数据不平衡,我们通常会使训练集平衡,并保持测试集不变(不平衡)。这意味着这两个集合不会遵循相同的分布……那么为什么我们可以使用精确率-召回率来解决不平衡二分类问题?
问题二:您能否解释一下,对于每个类别(假设我们有一个二分类问题)分别计算精确率-召回率并解释结果是否有意义?
谢谢!
是的,您绝不能改变测试或验证数据集的分布。只能训练。
我建议为数据集选择一个指标进行优化。如果您想使用相关指标或指标的子集(例如,为单个类别计算)作为解释模型行为的诊断工具,那么就去使用吧。
很棒的文章,谢谢您的发布。
只是关于这行的一个问题:精确率,因此,计算少数类别的准确率。
召回率不是少数类别的准确率吗?因为它计算的是所有少数样本中有多少被正确预测为少数类别。这将真实反映少数类别的性能。
而精确率是在被*预测*为正(属于少数类别)的样本中,有多少是实际正的。这并不能真正反映少数类别的准确率。
如果我错了,请纠正我。谢谢!
我认为将精确率或准确率视为一个类别的准确率并没有帮助。
嗨,Jason,
非常感谢您提供一篇很棒的文章。我遇到了多类别分类问题,同时有平衡和不平衡数据集。在所有数据集上,我的准确率和召回率指标完全相同?
我该如何解释这种行为?原因可能是什么?
这将是一个巨大的帮助!
期待您的回复!
我建议使用并优化一个指标。
嗨,Jason,
非常感谢您的回复。优化一个是什么意思?您是说我必须关注其他指标,比如 F1-Score 吗?
不,我的意思是选择一个指标,然后优化它。
如果你有多个指标,你会得到相互冲突的结果,必须在它们之间做出选择。
嗨,Jason,
给定 FPR 和 FNR,是否有可能在二分类问题中检索到精确率和召回率。我问这个问题是因为我正在研究的一个不平衡分类问题的一些文献只报告了 FPR 和 FNR,我想知道是否可以将这些数字转换为精确率和召回率?
本教程向您展示如何计算这些指标。
https://machinelearning.org.cn/precision-recall-and-f-measure-for-imbalanced-classification/
我仍然对从 {‘micro’, ‘macro’, ‘samples’,’weighted’, ‘binary’} 中选择平均值来计算 F1 分数感到困惑。我看到文献 [1-2] 中对此问题有一些相互矛盾的建议。对于严重不平衡的数据,哪种选择更合适?
来源
[1] https://sebastianraschka.com/faq/docs/computing-the-f1-score.html
[2] https://stackoverflow.com/questions/66974678/appropriate-f1-scoring-for-highly-imbalanced-data/66975149#66975149
这可能会令人困惑,也许您可以尝试一些小例子。
对于严重不平衡的二分类,我应该使用 {‘micro’、‘macro’、‘samples’、‘weighted’、‘binary’} 中的哪个 F1?
如果你只有两个类别,那么你不需要设置“average”参数,因为它只适用于两个以上类别(多类别)分类。
如何测量不平衡数据集的 F2 分数。请提供 F2 分数的代码。
F-beta 分数是 (1+beta^2)/((beta^2)/recall + 1/precision)
F2 是 beta=2
更简单,更 Pythonic
而不是
act_pos = [1 for _ in range(100)]
你可以写
act_pos = [1] * 100
太棒了,谢谢!
嗨,jason
我有一个关于准确率、召回率和精确率之间关系的问题
我有一个类别不平衡的数据集,我通过使用SMOTE和随机过采样/欠采样来解决类别不平衡问题
模型训练后,我得到了这个结果(准确率=0.93,召回率=0.928,精确率
=0.933),我们可以看到精确率大于准确率!
问题是,当我得到这样的结果时,这是否正常?我的意思是召回率接近准确率,精确率大于准确率?
没关系。事实上,所有数字都不低,所以你的模型非常适合数据。
太好了,谢谢您的快速回复
你好!
我如何在深度神经网络(我使用 Keras)的训练中将召回率用作损失函数,该网络用于多分类问题?
谢~~~谢!
你好 Arturo…请看以下内容
https://machinelearning.org.cn/how-to-calculate-precision-recall-f1-and-more-for-deep-learning-models/
你好 Machine Learning Mastery,
我认为,如果能像您绘制不平衡二分类问题的混淆矩阵表那样,提供以下混淆矩阵表,那么更容易理解不平衡多分类问题的精确率/召回率计算。
| 正类1 | 正类2 | 负类0
正预测类1 | 真阳性 (TP) | 真阳性 (TP) | 假阴性 (FN)
正预测类2 | 真阳性 (TP) | 真阳性 (TP) | 假阴性 (FN)
负预测类0 | 假阳性 (FP) | 假阳性 (FP) | 真阴性 (TN)
# 具体数字
| 正类1 | 正类2 | 负类0 | 总计
正预测类1 | 真阳性 (50) | 真阳性 (0) | 假阴性 (50) | 100
正预测类2 | 真阳性 (0) | 真阳性 (99) | 假阴性 (1) | 100
负预测类0 | 假阳性 (20) | 假阳性 (51) | 真阴性 (9929) | 10000
精确率 = (50+99) / ((50+99) + (20+51))
精确率
你好 Jade…谢谢您的反馈!您有什么具体问题可以解决吗?
实际上我之前的帖子中有一些错别字。这是更新后的版本。
| 正类1 | 正类2 | 负类0
正预测类1 | 真阳性 (TP) | 假阳性 (FP) | 假阳性 (FP)
正预测类2 | 假阳性 (FP) | 真阳性 (TP) | 假阳性 (FP)
负预测类0 | 假阴性 (FN) | 假阴性 (FN) | 真阴性 (TN)
| 正类1 | 正类2 | 负类0 | 总计
正预测类1 | 真阳性 (50) | 假阳性 (0) | 假阳性 (50) | 100
正预测类2 | 假阳性 (1) | 真阳性 (99) | 假阳性 (1) | 100
负预测类0 | 假阴性 (20) | 假阴性 (51) | 真阴性 (9929) | 10000
你好 Jade…谢谢您的反馈!
非常感谢这些精彩的例子。请原谅我。我有一个句子语料库,我使用余弦相似度对一个查询进行了语义搜索,并得到了前5个结果,但需要应用精确率、召回率和F分数来评估。我该如何开始呢?我会手动计算正负结果吗?或者有没有其他方法可以使用?谢谢