【机器学习】Macro-F1(宏平均 F1)是什么?
宏观直觉(给初学者)
一句话:
macro-F1 = 先分别算每个类别的F1,再对所有类别做等权平均。
它让小众类别(比如某些稀有攻击)和大类(比如 Normal)同样重要,不会被“大样本”掩盖。
English 1-liner:
Macro-F1 is the unweighted mean of per-class F1 scores. It gives equal voice to each class—great for imbalanced data.
公式(不用背,理解就好)
-
每个类别 ccc:
Precisionc=TPcTPc+FPc,Recallc=TPcTPc+FNc,F1c=2⋅Precisionc⋅RecallcPrecisionc+Recallc \text{Precision}_c=\frac{TP_c}{TP_c+FP_c},\quad \text{Recall}_c=\frac{TP_c}{TP_c+FN_c},\quad F1_c=\frac{2\cdot \text{Precision}_c\cdot \text{Recall}_c}{\text{Precision}_c+\text{Recall}_c} Precisionc=TPc+FPcTPc,Recallc=TPc+FNcTPc,F1c=Precisionc+Recallc2⋅Precisionc⋅Recallc
-
Macro-F1:
Macro-F1=1K∑c=1KF1c \text{Macro-F1}=\frac{1}{K}\sum_{c=1}^K F1_c Macro-F1=K1c=1∑KF1c
其中 KKK 是类别数(多分类时 K>2K>2K>2,二分类时 K=2K=2K=2)。
为什么在你的课题里很关键?
你的项目要比较二分类(正常vs攻击)和多分类(DoS/DDoS/Recon/Mirai…)。
现实中样本分布极不平衡:Normal很多、某些攻击很少。只看Accuracy,模型把大部分样本都猜“Normal”也可能很高;而macro-F1会惩罚你忽视小类的行为,因为每一类的F1都要算、而且等权进入平均。
结合你的案例:两个小算例
A) 多分类(Normal / DoS / Mirai)
假设在测试集上,你得到(来自 classification_report
的)每类F1:
- Normal:0.95
- DoS:0.80
- Mirai(很稀有):0.30
则
Macro-F1=0.95+0.80+0.303=0.683 \text{Macro-F1}=\frac{0.95+0.80+0.30}{3}=\mathbf{0.683} Macro-F1=30.95+0.80+0.30=0.683
解读: 虽然 Normal 很准,但 Mirai 被严重漏掉,导致 Macro-F1 被“拉低”。这就是小类不被忽视的信号——写报告时可以据此讨论“多分类对稀有家族的召回不足”。
B) 二分类(Attack=1 / Normal=0)
常见做法是只报正类(Attack)的F1;但macro-F1会把 Attack 的F1 和 Normal 的F1 平均:
- F1(Attack) = 0.86
- F1(Normal) = 0.76
Macro-F1 = (0.86 + 0.76)/2 = 0.81
解读: 这比只看“Attack的F1=0.86”更全面,因为它也在问:把正常误报成攻击了吗?(Normal的F1能反映这点)
它跟别的平均方式的区别
- Macro-F1(等权):每类“一人一票”,对不平衡最公平。
- Weighted-F1(按样本数加权):大类权重大,更接近整体。
- Micro-F1(先汇总再算):整体层面,常与Accuracy接近,容易被大类主导。
在你的论文里:主报 Macro-F1,同时可在附录/表格里放 Weighted/Micro 作为补充。
在你的脚本输出里怎么找 Macro-F1?
summary_binary.csv
与summary_multiclass.csv
有一列macro_f1
(就是Macro-F1)。classification_report_*.csv
的macro avg
行 也给出 macro 平均(precision/recall/F1)。- 你的脚本还会画
binary_macro_f1.png
/multiclass_macro_f1.png
——这两张柱状图正是各模型的 Macro-F1 对比,直接贴到PPT和报告里。
报告/答辩可直接粘贴的表述(中英)
中文(放“指标选择”小节)
“我们采用 macro-F1 作为主指标:先分别计算每个类别的F1,再等权平均,从而公平反映稀有攻击家族的识别能力,避免仅凭整体准确率掩盖小类的漏检问题。”
English
“We prioritize macro-F1: it averages per-class F1 scores with equal weights, fairly reflecting performance on minority attack families and avoiding the ‘high-accuracy but poor minority recall’ pitfall.”
小技巧(业务解读)
- 当 macro-F1 明显低:通常意味着某些小类F1过低 → 查
classification_report
看哪类的 recall(召回)特别差;把其在混淆矩阵中的错配(常被误判成哪一类)截图放进讨论。 - 二 vs 多的选择:如果多分类相对二分类 macro-F1 提升很有限,但推理时延/模型体积/FPR上涨明显,在线告警更倾向二分类;否则,若你真的需要家族级判断,多分类更有价值。
##(可选)用一句“门槛线”帮助结论落地
- 示例决策规则:多分类相对二分类 Macro-F1 ↑ < 0.02 且代价↑ > 30% → 选二分类;否则选多分类。
(这个阈值可在讨论里说“基于业务容忍度设置”。)