官方介绍:

average : {'micro', 'macro', 'samples', 'weighted', 'binary'} or None, \
            default='binary'
        This parameter is required for multiclass/multilabel targets.
        If ``None``, the metrics for each class are returned. Otherwise, this
        determines the type of averaging performed on the data:

        ``'binary'``:
            Only report results for the class specified by ``pos_label``.
            This is applicable only if targets (``y_{true,pred}``) are binary.
        ``'micro'``:
            Calculate metrics globally by counting the total true positives,
            false negatives and false positives.
        ``'macro'``:
            Calculate metrics for each label, and find their unweighted
            mean.  This does not take label imbalance into account.
        ``'weighted'``:
            Calculate metrics for each label, and find their average weighted
            by support (the number of true instances for each label). This
            alters 'macro' to account for label imbalance; it can result in an
            F-score that is not between precision and recall.
        ``'samples'``:
            Calculate metrics for each instance, and find their average (only
            meaningful for multilabel classification where this differs from
            :func:`accuracy_score`).

核心概念:为什么需要 average

在多分类(如识别猫、狗、鸟)或多标签(如为文章打上“科技”、“财经”、“体育”等多个标签)问题中,模型会为每个样本预测一个或多个类别。我们计算精确率(Precision)、召回率(Recall)、F1-score 等指标时,不再像二分类问题那样只有“正类”和“负类”两个维度。

average参数的作用就是​​指定一种策略,将多个类别的评估结果汇总成一个单一的数字​​,以便于我们快速、宏观地比较不同模型的性能。


各参数详解与应用场景

假设我们有一个三分类问题的结果,其混淆矩阵简化如下(TP = True Positive, FP = False Positive, FN = False Negative):

类别 TP FP FN 样本数(Support)
0 10 5 2 12 (10+2)
1 20 3 0 20 (20+0)
2 12 8 5 17 (12+5)
1. average='binary'
  • ​含义​​:​​二分类模式​​。只报告由 pos_label参数指定的那个类别的指标,完全忽略其他类别。将所有其他类别都视为“负类”。

  • ​使用场景​​:

    • ​仅适用于二分类问题​​。这是 Scikit-learn 中许多指标(如 f1_score, precision_score, recall_score)的默认值。
    • 如果你在一个多分类问题上错误地使用了 average='binary',而 pos_label又使用默认值(通常是1),那么它只会计算​​类别1​​的指标(如上例中,P=20/(20+3)≈0.87, R=20/(20+0)=1.0, F1≈0.93),这完全不能代表模型在整个数据集上的表现。
  • ​结论​​:​​只在标准的二分类问题中使用​​。

2. average='micro'
  • ​含义​​:​​微平均​​。先​​全局统计​​所有的 TP、FP、FN 的总数量,然后用这些总和来计算一个全局的指标。

    • 全局 TP = 10 + 20 + 12 = 42
    • 全局 FP = 5 + 3 + 8 = 16
    • 全局 FN = 2 + 0 + 5 = 7
    • Micro-Precision = 42 / (42 + 16) ≈ 0.724
    • Micro-Recall = 42 / (42 + 7) ≈ 0.857
    • Micro-F1 = (2 * 0.724 * 0.857) / (0.724 + 0.857) ≈ 0.785
  • ​特点​​:​​平等看待每个样本​​。无论样本属于哪个类别,它对最终指标的贡献都是相同的。因此,它受​​大类​​(样本数量多的类别)的性能影响更大。

  • ​使用场景​​:

    • 当你关心整个数据集上的​​整体性能​​,并且认为每个样本的权重应该相同时。
    • 在类别样本量​​不平衡​​的数据集上,如果你想衡量模型对​​大多数样本​​的识别能力,微平均是一个很好的选择。
  • ​一个重要特性​​:在多分类任务中,micro-average的 Precision、Recall、F1 三者​​值相等​​,并且等于​​准确率(Accuracy)​​。

3. average='macro'
  • ​含义​​:​​宏平均​​。​​先独立计算每个类别的指标​​,然后简单地计算这些指标的​​算术平均值​​。

    • P0 = 10 / (10 + 5) ≈ 0.667
    • P1 = 20 / (20 + 3) ≈ 0.870
    • P2 = 12 / (12 + 8) = 0.600
    • ​Macro-Precision​​ = (0.667 + 0.870 + 0.600) / 3 ≈ 0.712
  • ​特点​​:​​平等看待每个类别​​。无论类别的大小,每个类别对最终指标的贡献都是相同的。一个小众类别(如“2”)的性能会和一个大众类别(如“1”)的性能被同等对待。

  • ​使用场景​​:

    • 当你认为​​所有类别都同等重要​​时,无论它们的样本数量多少。例如,在医疗诊断中,一个罕见病(样本少)的重要性不亚于一个常见病(样本多)。
    • 当你想了解模型在​​小类别​​上的表现,而不希望其被大类别“淹没”时。
  • ​缺点​​:可能会被表现极差的少数类别拉低平均值,从而不能很好地反映模型在大多数样本上的表现。

4. average='weighted'
  • ​含义​​:​​加权平均​​。也是先独立计算每个类别的指标,然后计算这些指标的​​加权平均​​,​​权重是每个类别的真实样本数(Support)​​。

    • P0 ≈ 0.667, Support=12
    • P1 ≈ 0.870, Support=20
    • P2 = 0.600, Support=17
    • 总样本数 = 12 + 20 + 17 = 49
    • ​Weighted-Precision​​ = (0.667 * 12 + 0.870 * 20 + 0.600 * 17) / 49 ≈ 0.731
  • ​特点​​:是 macromicro之间的一种折衷。它通过类别样本量来调整权重,既考虑了每个类别的性能,又考虑了类别的重要性(样本越多越重要)。

  • ​使用场景​​:

    • 处理​​类别不平衡​​数据集时的​​首选​​。它比 macro更能反映模型在整体数据上的表现,同时又不像 micro那样完全被大类别主导。
    • 当你希望指标的数值能够考虑到类别分布时。
5. average='samples'
  • ​含义​​:​​按样本平均​​。这个指标的计算方式与前几种完全不同,它​​专为多标签问题设计​​。它为​​每个样本​​计算其所有标签的指标(基于真实标签和预测标签),然后对所有样本的指标求平均。

  • ​使用场景​​:

    • ​仅适用于多标签分类​​(一个样本可以有多个标签)。对于单标签多分类问题(一个样本只有一个标签),samples的结果与 micro相同。
    • 当你关心的是​​每个样本的预测质量​​,而不是每个标签的预测质量时。例如,一篇文章被预测为 [科技, 财经] 而它的真实标签是 [科技],那么对于这个样本,它的 Precision 就是 1/2=0.5(预测对了1个,多预测了1个),Recall 是 1/1=1.0(真实有1个,预测对了1个)。
6. average=None
  • ​含义​​:​​不进行平均​​。返回一个数组,其中包含​​每个类别​​的指标值。

  • ​使用场景​​:

    • 进行​​详细的模型诊断​​时。你可以清楚地看到模型在哪个类别上表现好,在哪个类别上表现差,从而进行有针对性的改进。
    • 这是最全面的方式,在你完成最终模型评估后,分析模型行为时非常有用。

总结与选择建议

参数 核心思想 适用场景 对类别不平衡的敏感性
'binary' 只看指定的一个类 ​仅限二分类​ -
'micro' ​平等看待每个样本​ 关心整体性能,尤其是大类的表现 ​敏感​​(受大类影响)
'macro' ​平等看待每个类别​ 所有类别同等重要,关心小类的表现 ​不敏感​
'weighted' ​按样本量加权看待每个类别​ ​处理类别不平衡时的首选​​,兼顾类别重要性 ​敏感​​(通过权重)
'samples' ​平等看待每个样本​​的多标签 ​仅限多标签分类​​,关心每个样本的预测质量 -
None 不汇总,看全部细节 模型诊断和详细分析 -

​一般性建议:​

  1. ​二分类问题​​:使用 average='binary'

  2. ​多分类问题​​:

    • 如果​​类别平衡​​,macroweighted差别不大,用 macro可以看平均性能。
    • 如果​​类别不平衡​​,想更好地反映整体性能,优先使用 weighted
    • 如果想​​诊断模型在特定类别上的问题​​,一定要使用 None来查看所有类别的单独指标。
  3. ​多标签问题​​:根据你的目标选择 micro, macro, weightedsamplessamples提供了独特的视角。

Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐