多分类评估怎么做?macro、micro、weighted 平均有什么区别?
简化版
多分类要把二分类的精确率/召回率/F1 扩展到多个类别。做法是先对每个类别分别算指标(用「该类 vs 其余」的思路),再用某种平均汇总成一个数。三种平均:macro(宏平均)——各类指标直接算术平均,每个类别权重相等,小类和大类一样重要,适合关注少数类/类别不平衡;micro(微平均)——把所有类别的 TP、FP、FN 先加总再算指标,被大类主导,等价于整体准确率(多分类下 micro-F1 = accuracy);weighted(加权平均)——各类指标按该类样本数加权平均,兼顾类别规模。选择:在意每个类(尤其小类)用 macro,在意整体样本用 micro/weighted。
详细版
三种平均对比:
| 平均方式 | 算法 | 特点 | 适用 |
|---|---|---|---|
| macro(宏) | 各类指标算术平均 | 每类等权,小类影响大 | 关注少数类、类别不平衡 |
| micro(微) | 汇总所有 TP/FP/FN 再算 | 被大类主导;=整体准确率 | 关注整体、样本级性能 |
| weighted(加权) | 各类指标按样本数加权平均 | 兼顾类别规模 | 想要按规模折中 |
关键区别(不平衡时最明显):
- macro:把每个类当作同等重要——一个小类表现差,会明显拉低 macro 值(保护少数类)。
- micro:把每个样本当作同等重要——大类样本多,主导结果(小类差了也看不太出来)。
多分类混淆矩阵: C×C 矩阵,对角线是各类分对数;每个类用「该类 vs 其余」得到自己的 TP/FP/FN。
完整版教学
一、从二分类到多分类:先分类算,再平均
精确率、召回率、F1 本是二分类指标。多分类(C 个类别)要先把它们扩展到每个类别,再汇总:
- 对每个类别 k,用「该类为正、其余所有类为负(One-vs-Rest)」的视角,算出这个类的 TP、FP、FN,进而得到该类的精确率、召回率、F1。
- 这样得到 C 组「每类指标」后,用某种平均方式汇总成一个整体数值——不同的平均方式(macro / micro / weighted)就是本题的核心。
先看多分类的混淆矩阵:它是 C×C 的,行是真实类、列是预测类,对角线是各类分对的数量,非对角线是各种混淆。每个类的 TP/FP/FN 都能从这个矩阵读出。
二、macro(宏平均):每个类别一票
macro 先算出每个类别各自的指标,然后直接取算术平均(不管每类多少样本):
macro-F1 = (F1_类1 + F1_类2 + ... + F1_类C) / C
特点:每个类别权重相等——一个只有 10 个样本的小类,和一个有 10000 个样本的大类,在 macro 里贡献一样大。
- 优点:保护少数类——如果模型在某个小类上表现很差,macro 会明显下降、把问题暴露出来。
- 适用:类别不平衡、且我们同等关心每个类别(尤其小类) 的场景,比如疾病多分类里每种罕见病都重要。
三、micro(微平均):每个样本一票
micro 不分类别,而是把所有类别的 TP、FP、FN 先分别加总,再用总数算一个整体指标:
micro-Precision = ΣTP / (ΣTP + ΣFP) (所有类的 TP、FP 加起来)
micro-Recall = ΣTP / (ΣTP + ΣFN)
micro-F1 = 由上面两个算
特点:每个样本权重相等——样本多的大类主导结果,小类的好坏几乎被淹没。
重要结论:在单标签多分类里,每个样本恰好一个真实类、一个预测类,所以 ΣFP = ΣFN(一个样本被错判,既是某类的 FP 又是另一类的 FN),于是 micro-Precision = micro-Recall = micro-F1 = 整体准确率(Accuracy)。所以多分类里报 micro-F1,其实就是在报准确率。
四、weighted(加权平均):按样本数折中
weighted 介于两者之间——算出各类指标后,按每个类别的样本数(支持度 support)加权平均:
weighted-F1 = Σ (该类样本占比 × 该类F1)
特点:大类权重大、小类权重小,但小类仍有一席之地(不像 micro 那样几乎被淹没)。它是「考虑类别规模」的折中——比 macro 更偏向整体表现,比 micro 更照顾类别结构。
五、三者怎么选——看你在乎什么
关键区别在**「谁一票」**:
| 一票单位 | 谁主导 | 适用 | |
|---|---|---|---|
| macro | 每个类别 | 各类平等(小类影响大) | 关注少数类、类别平等重要 |
| micro | 每个样本 | 大类(样本多的) | 关注整体样本级性能 |
| weighted | 按样本数加权 | 大类为主但兼顾小类 | 想按规模折中 |
选择原则:
- 在意每个类别、尤其少数类 → macro(不平衡时最能反映小类问题)。
- 在意整体样本预测对多少 → micro(=准确率) 或 weighted。
- 不平衡场景里,macro 和 micro 差距大本身就是信号:说明模型在小类和大类上表现悬殊。
六、常见追问
- 多分类 micro-F1 为什么等于准确率? 单标签下 ΣFP=ΣFN,导致 micro 的 P=R=F1=正确样本/总样本=准确率。
- 不平衡多分类该看哪个? macro(每类等权,暴露小类问题),别只看 micro/准确率。
- macro 和 weighted 区别? macro 各类等权(小类影响大);weighted 按样本数加权(大类影响大)。
- 多标签分类呢? 每个样本可属多个类,micro/macro 仍适用但 micro-F1 不再等于准确率,需按标签集合评估。
- 怎么快速诊断? 看每类的 P/R/F1(sklearn 的 classification_report),再结合 macro/micro 平均。
七、从三分类混淆矩阵算出三种平均
设行是真实类、列是预测类,混淆矩阵为 [[40,5,5],[4,20,6],[1,4,15]],总计 100 个样本,正确 75 个。A/B/C 的召回率分别是 40/50=0.80、20/30≈0.667、15/20=0.75,macro-recall≈0.739;按 support 加权后 weighted-recall=(50×0.8+30×0.667+20×0.75)/100=0.75。
单标签多分类:
ΣTP = 正确预测数
ΣFP = ΣFN = 错误预测数
micro-P = micro-R = micro-F1 = Accuracy
| 汇总 | 本例含义 | 容易掩盖什么 |
|---|---|---|
| macro | 三个类各占 1/3 | 不体现真实流量占比 |
| micro | 100 个样本各一票 | 少数类错误 |
| weighted | 按 50/30/20 加权每类指标 | 小类权重仍然小 |
weighted 不是数学上保证落在 macro 与 micro 之间的“折中”;尤其 weighted-F1 与 micro-F1 可以不同方向变化。等式“micro-F1=accuracy”也只适用于每个样本恰有一个真实标签和一个预测标签的单标签多分类。
记忆钩子:macro 问“平均一个类别表现怎样”,micro 问“平均一个标签决策怎样”,weighted 问“按真实流量加权后怎样”。
八、常见误区与追问
- 误区:多分类场景下 micro-F1 永远等于 accuracy。 该结论依赖单标签完整预测,多标签任务不成立。
- 误区:weighted-F1 一定介于 macro-F1 和 micro-F1 之间。 加权的是每类 F1,micro 则先汇总计数,运算顺序不同。
- 追问:某类没有真实样本时 Recall 怎么办? 分母为零,应声明 zero-division 规则并检查数据切分。
- 追问:为什么必须看 per-class 指标? 任何单个平均值都可能隐藏具体哪个类别失败。
- 追问:类别层级不同怎么办? 可同时报告叶子类指标和按业务层级聚合后的指标。
九、加强记忆
多分类评估:先对每个类别用「该类 vs 其余」算 P/R/F1,再平均汇总。三种平均按**「谁一票」** 区分:macro(宏) = 各类指标算术平均、每个类别等权,小类和大类一样重要,保护少数类,适合不平衡/关注小类;micro(微) = 汇总所有 TP/FP/FN 再算、每个样本等权,被大类主导,且单标签多分类下 micro-F1 = 整体准确率;weighted(加权) = 各类指标按样本数加权平均,大类为主但兼顾小类。选择:在意每个类(尤其小类)用 macro,在意整体样本用 micro/weighted;macro 和 micro 差距大说明模型在大小类上表现悬殊。