第一次接触机器学习分类问题时,很多人都是从二分类场景入手的。比如判断邮件是否为垃圾邮件,或者诊断患者是否患病。这时候的混淆矩阵非常简单,只有四个格子:TP、FP、FN、TN。但当我第一次遇到10个类别的图像分类任务时,突然发现原来的理解完全不够用了——每个类别的预测结果都需要单独计算,整个评估过程变得复杂得多。
让我们从一个实际案例开始。假设我们正在开发一个水果识别系统,需要区分苹果、香蕉和橙子三类。对于"苹果"这个类别来说:
这里有个容易混淆的点:TN的计算。在多分类中,TN不是简单地"预测为负类",而是"预测为其他所有类别"。比如对于苹果类别,预测为香蕉或橙子都算作"不是苹果"。
我曾经在一个电商商品分类项目中犯过错误:误以为TN就是模型预测为"明确否定"的样本。实际上,在多分类里,TN更像是"非此即彼"的概念。理解这点后,再看混淆矩阵就清晰多了。
当我们有了每个类别的TP、FP、FN、TN后,就可以计算各类指标了。以准确率为例,很多人以为多分类的准确率就是所有类别准确率的平均值,这其实是个常见误区。
准确率的正确定义是:
code复制总正确预测数 / 总样本数
= (TP₁ + TP₂ + ... + TPₖ) / N
其中k是类别数,N是总样本数。也就是说,它直接看模型在所有类别上的整体正确率。
但在实际项目中,我发现单纯看准确率会掩盖很多问题。比如在一个医学影像分类项目中,某些罕见病的识别准确率可能很低,但因为样本量少,对整体准确率影响很小。这时候就需要更细致的指标:
精确率(Precision):预测为该类别的样本中,确实属于该类别的比例
code复制Precision = TP / (TP + FP)
召回率(Recall):实际属于该类别的样本中,被正确预测的比例
code复制Recall = TP / (TP + FN)
F1分数:精确率和召回率的调和平均数
code复制F1 = 2 * (Precision * Recall) / (Precision + Recall)
当我们需要评估模型在所有类别上的整体表现时,通常会面临两种选择:宏平均(Macro-average)和微平均(Micro-average)。这两种方法我在实际项目中都用过,它们各有适用场景。
宏平均的计算逻辑是:
它的特点是:
微平均则是:
它的特点是:
在实际项目中,数据分布往往是决定选择哪种平均方式的关键。我曾经负责过一个客户投诉分类系统,类别分布极不均衡:
如果使用宏平均,客服态度类别的低性能会明显拉低整体指标;而用微平均,物流问题的表现会主导结果。经过多次实验,我们最终选择:
让我们用一个具体例子说明两种平均方式的差异。假设有三个类别的分类结果如下:
| 类别 | TP | FP | FN |
|---|---|---|---|
| A | 10 | 5 | 2 |
| B | 20 | 10 | 5 |
| C | 5 | 15 | 1 |
宏平均精确率:
微平均精确率:
可以看到,在这个例子中,由于C类表现较差但样本量少,宏平均比微平均略低。如果C类样本量增加,差异会更明显。
在金融风控项目中,我遇到过正样本占比不到0.1%的情况。这时候直接计算指标几乎没意义,我们采用了这些方法:
成熟的分类系统通常不会只依赖一个指标。我们常用的评估体系包括:
好的可视化能快速发现问题。我常用的方法有:
例如,通过热力图可能发现"哈士奇"和"狼"的图片经常被混淆,这提示我们需要:
虽然本文主要讨论单标签多分类问题,但值得一提的是多标签场景(一个样本可能属于多个类别)的评估会有所不同。在这种情况下:
我在一个新闻话题标注项目中就遇到过这种情况。一篇文章可能同时属于"政治"和"经济"两个类别,这时候评估指标需要特别设计,不能简单套用单标签的方法。