F1 分数的微、宏加权平均

2025年3月17日 | 阅读 8 分钟

在分类任务中,有两种技术可以组合多个类别的 F1 分数:宏平均和微平均加权。模型的准确性由其 F1 分数决定,该分数考虑了精确率和召回率。它的范围从 0 到 1,1 代表最佳可能分数。它是精确率和召回率的调和平均值。

如果分类问题是多类的,则可以为每个类别单独计算 F1 分数。在不考虑每个类别 1 中样本百分比的情况下,每个类别 F1 分数的平均值称为宏平均 F1 分数。将所有类 1 的真正例、假正例和假负例加起来,可以得到微平均 F1 分数。按每个类别 1 中样本数量加权每个类别的 F1 分数的平均值是加权平均 F1 分数。

微 F1 分数

在计算微 F1 分数时,会考虑所有类别中真正例、假负例和假正例的总数。通过将所有真正例、假负例和假正例加起来,可以全局计算 F1 分数。当您希望为每个数据点分配相同的权重而不考虑类别时,微 F1 分数是合适的。

Micro, Macro Weighted Averages of F1 Score
Micro, Macro Weighted Averages of F1 Score

其中:

TPi:类别 i 的真正例

FPi:类别 i 的假正例

FNi:类别 i 的假负例

示例

让我们通过一个例子来理解微 F1。假设我们有以下多类别问题的预测结果

ClassTP(真正例)FP(假正例)FN(假负例)F1 分数
010230.8
12010120.6
25110.8
求和351316

正如您所见,每个类别的普通 F1 分数已经确定。我们只需要确定三个类别 F1 分数的平均值来得到宏 F1 分数,如下所示

微 F1 分数是 35 / (35 + 0.5 * (13 + 16)) = 0.71

宏 F1 分数

所有类别的 F1 分数平均值决定了宏 F1 分数。

通过对为每个类别单独计算的 F1 分数取平均值来获得宏 F1 分数。在同等评估模型在每个类别的性能时,无论类别不平衡如何,宏 F1 分数都是合适的。

Micro, Macro Weighted Averages of F1 Score

其中:

n类别总数

F1i类别 i 的 F1 分数

示例

让我们看一个例子来解决宏 F1 问题。使用以下多类别问题的预测结果。

ClassTPFPFNF1 分数
010230.8
12010120.6
25110.8
求和351316

正如您所见,每个类别的普通 F1 分数已经确定。我们只需要确定三个类别 F1 分数的平均值来得到宏 F1 分数,如下所示

宏 F1 分数是 (0.8+0.6+0.8)/3 = 0.73

加权 F1 分数?

加权 F1 分数是在机器学习中用于评估模型性能的指标,特别是在存在类别不平衡的情况下。我们来分解一下

F1 分数

F1 分数将精确率和召回率合并为一个值。它是通过精确率和召回率的调和平均值计算得出的。精确率表示阳性预测的准确性,而召回率衡量模型在多大程度上识别出实际的阳性案例。F1 分数的范围是 0 到 1,其中 1 是最好的。

加权平均 F1 分数

加权平均 F1 分数会考虑每个类别的支持度(即数据集中类别的数量)。它是通过将所有类别 F1 分数的平均值与其支持度加权来计算的。例如,如果只有一条观测值的实际标签是 Boat,其支持度将是 12。

样本加权 F1 分数

它非常适合类别不平衡的数据分布。它是类别 F1 分数的加权平均值,其中每个类别的样本数量决定了权重。请记住,F1 分数的范围仅在 0 和 1 之间,它是评估模型整体性能的有价值指标。

如何计算加权 F1 分数?

通过根据每个类别的 F1 分数中的实例数量为其分配权重来计算加权平均值。

Micro, Macro Weighted Averages of F1 Score

其中

N 是类别总数。

Supporti 是类别 i 中的实例数量。

通过 Python 代码计算

这是一个 Python 代码示例,用于在 SkLearn IRIS 数据集上训练的模型上计算微平均和宏平均的精确率和召回率分数。该数据集包含三个不同的类别:setosa、versicolor 和 virginica。模型使用单个特征进行训练,以生成具有每个单元格中数字的混淆矩阵。观察分配给 iris 的训练数据 X.data[:, [1]]。

输出

Micro, Macro Weighted Averages of F1 Score

使用单个特征,在 IRIS 数据集上训练的模型将具有此混淆矩阵。用于计算微平均和宏平均精确率分数的 Python 代码如下所示

所有类别的真正例预测(对角线)

precisionScore_manual_microavg, precisionScore_manual_macroavg

Sklearn 的 recall_score、f1-score 和 precision_score 方法也可用于计算相同的内容。要找到微平均、宏平均和加权平均分数,必须将“average”参数传递三个级别。

输出

Micro, Macro Weighted Averages of F1 Score

F1 分数,也称为 F 度量,是衡量分类模型性能的常用指标。在处理多类分类时,我们使用平均技术来计算 F1 分数,从而产生不同的平均分数,例如宏、微和加权分数。在分类报告中。下一节将描述平均分数,如何使用 Python 代码计算平均分数,以及为什么以及如何选择最佳分数。

不平衡数据集哪个更好?

微 F1 和宏 F1 分数在不平衡数据集方面都有优点和需要考虑的方面

微 F1 点宏 F1 分数
所有类别的 TP、FP 和 FP 总数用于计算微 F1 分数,从而确定 F1。宏 F1 分数计算每个类别的 F1 分数,然后对所有类别的结果取平均值。
它为每个数据点分配相同的权重,忽略类别不平衡。尽管如此,它为每个类别分配相同的权重。
当强调数据集中主要类别的性能时,微 F1 分数更适用。当您希望确保模型在所有类别上都表现良好,而不管其不平衡程度如何时,宏 F1 分数会派上用场。

为什么 Scikit-Learn 分类报告没有微平均?

是的,scikit-learn 的 classification_report 提供了精确率、召回率和 F1 分数的微平均。然而,分类报告的输出并没有专门将其标识为“Micro”。相反,它是所有类别精确率、召回率和 F1 分数的加权平均值,每个类别根据其出现的实例数量做出贡献。

它是如何工作的?

  1. 精确率微平均:要计算微平均精确率,请将所有类别的真正例相加,然后将该总数除以所有类别中所有假正例和真正例的总和。
  2. 召回率微平均:要计算微平均召回率,请将每个类别中的所有真正例相加,然后将该总数除以每个类别中所有假负例和真正例的总和。
  3. F1 分数微平均:微平均召回率和精确率的调和平均值是微平均 F1 分数。

这些值根据每个类别的总实例数进行加权,表示所有类别的聚合性能指标,并在分类报告中显示,而没有明确标记为微平均。

微 F1 和宏 F1 的区别

微 F1宏 F1
微 F1 分数首先确定每个类别的 F1 分数,然后根据每个类别的实例数量对结果进行加权平均。宏 F1 分数在确定每个类别的 F1 分数后,计算所有类别的无加权平均值。
较大的类别获得更多的权重,并且所有类别都被同等对待。所有类别都被同等对待,而不管其大小。
在评估模型的整体性能时,考虑所有类别的真正例、假正例和假负例的总数,微 F1 分数是一个有用的工具。在单独评估模型在每个类别的性能,然后对所有类别的结果取平均值时,宏 F1 分数非常有用。
由于它确保评估不会偏向多数类,因此在类别不平衡时特别有用。由于它对小类别性能更敏感,因此它可以更准确地衡量模型在所有类别(包括不平衡类别)上的整体性能。

我应该选择微 F1 还是宏 F1?

在微平均和宏平均 F1 分数之间进行选择将取决于您的分类任务的具体情况以及您的目标

何时使用微 F1?

  • 当您主要关心模型在所有类别上的整体性能时,尤其是在存在类别不平衡的情况下,请使用微 F1 分数。
  • 当数据集不平衡时,微 F1 分数可以通过为较大类别分配更多权重来更准确地衡量模型的整体性能。
  • 当类别大小明显不同,或者您希望优先考虑多数类别的性能时,它效果很好。

何时使用宏 F1?

  • 当您希望评估模型在所有类别上的性能,而不管其大小如何,请使用宏 F1 分数。
  • 宏 F1 分数在对所有类别的结果取平均值之前,提供有关模型在各个类别上性能的信息。
  • 当您不希望评估偏向多数类别,并希望确保模型在所有类别上都表现良好时,它很有用。

结论

F1 分数的加权平均、宏平均和微平均的选择取决于分类任务的目标和类别分布。虽然宏 F1 分数同等对待所有类别,但微 F1 分数优先考虑整体性能并倾向于较大的类别。加权平均会平衡类别大小。了解这些指标可以更轻松地选择最佳评估技术,并确保对模型进行全面评估。