Back ay4's blog · blog

03 分类问题:用阈值和指标判断分类模型表现

2,685 words 6 min read #机器学习

03 分类问题:用阈值和指标判断分类模型表现

分类问题的目标不是预测一个连续数值,而是判断样本属于哪一类。在线性回归和逻辑回归的学习里,逻辑回归通常会先输出一个 0 到 1 之间的概率。比如垃圾邮件检测中,模型可能输出 0.75,意思是它认为这封邮件是垃圾邮件的概率为 75%。如果系统最后需要给出”垃圾邮件”或”非垃圾邮件”这样的类别,就要再加一步:用分类阈值把概率转成类别。

分类阈值

分类阈值就是把概率切成正类和负类的分界线。以垃圾邮件检测为例,如果把阈值设为 0.5,那么预测概率大于等于 0.5 的邮件会被判为垃圾邮件,低于 0.5 的邮件会被判为非垃圾邮件。

阈值不是固定真理,而是一个选择。阈值调高以后,模型会更谨慎地判定正类,假阳性通常会减少,但假阴性可能增加。阈值调低以后,模型更容易判定正类,假阴性通常会减少,但假阳性可能增加。

在垃圾邮件场景里,这两个错误的代价不一样。把正常邮件错放进垃圾箱会打扰用户,甚至造成信息遗漏。把垃圾邮件漏进收件箱也不好,但有时用户还能手动删除。所以阈值怎么选,取决于具体问题更怕哪一种错误。

混淆矩阵

模型输出的概率不等于真实情况。把预测类别和真实类别放在一起看,就得到混淆矩阵。二分类问题里有四种结果:

混淆矩阵

图中四个格子的含义可以这样记:

  • TP,真阳性。真实为正类,模型也预测为正类。垃圾邮件被正确识别为垃圾邮件。
  • FP,假阳性。真实为负类,模型却预测为正类。正常邮件被错判成垃圾邮件。
  • FN,假阴性。真实为正类,模型却预测为负类。垃圾邮件没有被拦截,进了收件箱。
  • TN,真阴性。真实为负类,模型也预测为负类。正常邮件被正确放进收件箱。

矩阵的行通常对应模型预测,列对应真实标签。每一行的总数表示模型预测成某一类的样本数,每一列的总数表示真实属于某一类的样本数。

如果真实正类和真实负类的数量差很多,数据集就是类别不平衡的。比如某个云朵类型只在成千上万张图片里出现几次,或者垃圾邮件只占所有邮件的 1%。这时只看准确率很容易误判模型效果。

常见分类指标

准确率

准确率表示所有分类结果中,模型分对的比例。

Accuracy = TP + TNTP + TN + FP + FN

准确率适合用来粗略观察平衡数据集上的训练进度。如果两类样本数量接近,准确率可以反映模型大体表现。

但在类别严重不平衡时,准确率会骗人。假设只有 1% 的邮件是垃圾邮件,一个永远预测”非垃圾邮件”的模型也能拿到 99% 的准确率,可它没有真正识别垃圾邮件。

召回率

召回率也叫真正率,关注真实正类里有多少被模型抓住。

Recall = TPR = TPTP + FN

在垃圾邮件检测里,召回率回答的是:所有垃圾邮件中,有多少被检测出来了。假阴性会出现在分母里,所以漏掉的正类越多,召回率越低。

当漏报的代价高于误报时,召回率更重要。比如疾病筛查里,如果病人被漏检,后果可能比让健康人多做一次复查更严重。

误报率

误报率关注真实负类里有多少被错判成正类。

FPR = FPFP + TN

在垃圾邮件检测里,误报率回答的是:所有正常邮件中,有多少被错判成垃圾邮件。一个完美模型的误报率是 0。

误报率在不平衡数据集上通常比准确率更有参考价值。但如果真实负类数量很少,误报率会很不稳定。比如只有 4 个真实负类时,错 1 个就是 25%,再错 1 个就跳到 50%。

精确率

精确率关注模型判为正类的样本里,有多少真的属于正类。

Precision = TPTP + FP

在垃圾邮件检测里,精确率回答的是:被模型标成垃圾邮件的邮件里,有多少真的就是垃圾邮件。假阳性越少,精确率越高。

精确率和召回率经常互相拉扯。提高阈值通常会减少假阳性,精确率可能上升,但假阴性可能变多,召回率下降。降低阈值通常会抓住更多正类,召回率可能上升,但假阳性也可能变多,精确率下降。

NaN 出现在指标里是什么意思

有些指标会因为分母为 0 变成 NaN,也就是 not a number。下面这个例子里,模型从不预测正类,所以 TP 和 FP 都是 0。精确率的分母是 TP 加 FP,于是分母为 0,结果就是 NaN。

NaN 指标示例

NaN 不一定表示模型很好,也不一定表示模型很差。它只说明当前公式没有可计算的数值。比如一个从不预测正类的模型,在某些数据上精确率会变成 NaN,但这个模型可能几乎没有用。

指标选择

选择哪个指标,不是为了让模型分数看起来更高,而是要看具体任务的成本和风险。下面这张表可以作为快速判断:

指标选择表

简单说:

  • 数据集比较平衡时,可以用准确率粗略观察训练进度,但评估模型性能时最好和其他指标一起看。
  • 漏报更贵时,看召回率。比如不希望漏掉真正有问题的样本。
  • 误报更贵时,看误报率。比如不希望把正常样本错判成异常。
  • 正向预测必须尽量可靠时,看精确率。比如模型一旦给出正类判断,就希望这个判断尽可能准。

ROC 曲线和 AUC

ROC 曲线用来观察模型在不同阈值下的表现。它的横轴是误报率,纵轴是真正率。做法是不断改变分类阈值,在每个阈值下计算 TPR 和 FPR,然后把这些点连起来。

AUC 是 ROC 曲线下面积。它可以理解为一种排序能力:随机抽一个正例和一个负例,模型把正例排在负例前面的概率。

AUC 预测分布示意

图 2:二分类模型预测结果的分布。AUC 表示随机选取一个正方形位于随机选取一个圆形右侧的概率。

如果 AUC 为 1.0,说明模型总能把随机抽取的正例排在随机抽取的负例前面。具体到垃圾邮件检测,就是随机抽一封垃圾邮件和一封正常邮件,模型总会给垃圾邮件更高的垃圾邮件概率。至于最后每封邮件被分到哪一类,仍然取决于阈值。

ROC 和 AUC 对比

图 4:两个假设模型的 ROC 和 AUC。右侧曲线的 AUC 更大,代表这两个模型中表现更好的一个。

在数据集大致平衡时,AUC 可以用来比较不同模型。AUC 越大,通常说明模型排序能力越好。选择阈值时,ROC 曲线上靠近左上角,也就是 FPR 低、TPR 高的点,通常是较好的候选阈值。但最后选哪个点,还是要回到任务本身:更怕漏报,还是更怕误报。

预测偏差

预测偏差是模型预测均值和真实标签均值之间的差。它适合用来早期检查模型或训练数据是否有问题。

比如某个邮件数据集中,5% 的邮件是垃圾邮件,那么真实标签的平均值是 0.05。一个合理的模型平均来看也应该预测大约 5% 的邮件是垃圾邮件。如果模型平均预测 50% 的邮件是垃圾邮件,就说明训练数据、新数据或模型本身可能有问题。

预测偏差可能来自数据中的偏差或噪声,也可能来自过强的正则化、训练流程中的错误,或者模型拿到的特征不足以完成任务。

多分类

多分类可以看作二分类的扩展。二分类只判断两个类别,多分类要在两个以上的类别中做选择。

如果每个样本只能属于一个类别,可以把多分类拆成多个二分类问题。比如有 A、B、C 三个类别,可以先训练一个分类器区分”A 或 B”和”C”,再训练另一个分类器把”A 或 B”进一步分成”A”和”B”。

手写数字识别就是一个典型多分类问题。输入是一张手写数字图片,输出是 0 到 9 中的某一个数字。

如果一个样本可以同时属于多个类别,那就不是普通多分类,而是多标签分类。比如一张图片可以同时包含”猫”、“沙发”和”室内”这些标签。

复习要点

分类模型常先输出概率,再通过阈值变成类别。阈值会影响 TP、FP、FN、TN,也会影响准确率、召回率、误报率和精确率。

类别不平衡时,准确率要谨慎使用。召回率适合关注漏报,误报率适合关注误报,精确率适合关注正类预测是否可靠。ROC 和 AUC 更关注模型在不同阈值下的整体排序能力,但具体阈值仍然要按任务代价来选。

Comments

Quiet notes for this article.