LightGBM评估指标中至关重要的参数【average】介绍
LightGBM评估指标中至关重要的参数【average】介绍
- 核心概念:为什么需要 `average`?
- 各参数详解与应用场景
- 1. `average='binary'`
- 2. `average='micro'`
- 3. `average='macro'`
- 4. `average='weighted'`
- 5. `average='samples'`
- 6. `average=None`
- 总结与选择建议
官方介绍:
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, thisdetermines 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 unweightedmean. This does not take label imbalance into account.``'weighted'``:Calculate metrics for each label, and find their average weightedby support (the number of true instances for each label). Thisalters 'macro' to account for label imbalance; it can result in anF-score that is not between precision and recall.``'samples'``:Calculate metrics for each instance, and find their average (onlymeaningful 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),这完全不能代表模型在整个数据集上的表现。
- 仅适用于二分类问题。这是 Scikit-learn 中许多指标(如
-
结论:只在标准的二分类问题中使用。
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
-
特点:是
macro
和micro
之间的一种折衷。它通过类别样本量来调整权重,既考虑了每个类别的性能,又考虑了类别的重要性(样本越多越重要)。 -
使用场景:
- 处理类别不平衡数据集时的首选。它比
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 | 不汇总,看全部细节 | 模型诊断和详细分析 | - |
一般性建议:
-
二分类问题:使用
average='binary'
。 -
多分类问题:
- 如果类别平衡,
macro
和weighted
差别不大,用macro
可以看平均性能。 - 如果类别不平衡,想更好地反映整体性能,优先使用
weighted
。 - 如果想诊断模型在特定类别上的问题,一定要使用
None
来查看所有类别的单独指标。
- 如果类别平衡,
-
多标签问题:根据你的目标选择
micro
,macro
,weighted
或samples
。samples
提供了独特的视角。