模型指标理解(accuracy, roc curve, precision-recall curve等)

发布时间 2023-08-08 18:30:19作者: 欧阳维斯诺夫斯基

背景

一个点估计模型(CTR,churn rate)之类的,都会输出一个目标事件概率。通常评估模型和进行model selection的时候需要用指标,常用的有accuracy, precision, recall, f1以及roc_curve, precision-recall curve等。选取什么样的指标跟数据分布以及业务场景相关,本文想要简单讨论哪个评价指标适用哪个场景。

 

阈值相关:accuracy,precision,recall都是阈值相关的指标。

阈值相关的评价指标通常用于业务决策或者干预逻辑依赖于阈值。这要求需要模型输出准确和稳定,因为线上所设的阈值希望能够consistant,而不是每一次上线都调整一次阈值。可以说必配calibration模型,以求模型的输出可以准确拟合线上的真实分布。而

 

阈值无关:auc over (roc_curve, precision-recall curve)

auc的特点是无决策阈值以及分布无关,只考虑排序。如果业务逻辑是基于排序的展现,或者是投放,那么直接采用auc就是最直观的。下面对比一下roc还是precision-recall curve。下文假设模型预测已经按照p'从小到大排序,最左的是预测值最低的样本,我们统一按照从右到左(即从大到小)来调整阈值。(记住这个图)

roc_curve 

roc curve的计算逻辑是通过调整threshold,计算TP rate和FP rate,然后用横轴FPR,纵轴TPR画图。注意,TPR = TP/(TP+FN), FPR = FP/(FP+TN)。 即TPR的分母为label=1的个数,而FPR的分母是label=0的个数,这两个分母对于给定的数据都是不变的。也就是说,ROC描述的是在阈值从右到左的调整过程中,就看每调整一个单位threshold,FPR增长得多还是TPR增长得多。ROC曲线的梯度代表的是label=0的增长的速度比label=1的增长速度。从右往左的调整过程中,由于FN会慢慢增加,因此FPR也慢慢增加。

假如模型是表现良好的,那么排在右边的样本大部分都是label1=1的样本,因此threshold大的时候,样本的TPR增长速度大于FPR的增长速度,曲线先往上增长,后面TPR不再增长的时候,FPR还在增长,因此这时候的曲率趋于0。

下面考虑两个最简单的baseline:完全随机以及条件随机。完全随机即所有y'~Bernoulli(0.5),而条件随机则为y'~Bernoulli(E(y)). 在完全随机的情况下,roc每次增长一个正样本就会增长一个负样本,因此斜率一直是1。最后算出来的auc也就是0.5。而条件随机则需要计算一下,但是计算后发现roc也都是在对角线上。核心原因在于随机采样对于正负样本都是一样的对待,因此实际上没有任何的区分正负样本(也就是排序)的能力。

precision-recall curve

由于roc的曲线描绘的是TPR和FPR,分母和decision threshold没有关系,因此单看roc其实无助于我们结合业务来评价模型。这时候考虑precision-recall curve trade off。由于recall随着threshold从右往左移动也是单调增加的,因此以recall为横轴,precision为纵轴。如果是完美的模型,即上图中蓝绿完全分开的情况下,则precision在经历了一段时间的1后,会骤降到0。所以precision-recall curve是从左上角出发,往右下角延伸的曲线。

优劣

根据【2】,在样本class分布不均衡的情况下,看precision-recall curve比看roc curve更好,因为roc curve没有考虑到样本的分布。而precision-recall,比如如【2】中的setting,99%都是0。那么在threshold移动的过程中,precision很容易出现断崖式下滑。而roc curve则还是容易在曲线上方,只要模型稍微有一点排序能力。虽然两个metric都依然能衡量模型的排序能力,但是precision-recall会更严格。

 

怎么选用?

模型的输出分布收到采样率,label权重等影响,因此accuracy,f1等最佳点不一定出现在th=0.5,或者任意固定的threshold上。当我们用fix threshold去比较两个模型,则很容易导致误判。因此这种情况下,考虑采用auc来评价模型,然后后续用isotonic regression来校准,会是一种model selection的更普遍的办法。之所以用isotonic而不用logistic regression,是因为logistic会改变model的排序,需要再用auc评价一次,但isotonic则不会影响。

另一个选项是先做完isotonic regression,再去用auc选模型,因为实际线上最后也是用校准之后的模型来运行的。只要需要用auc选模型的情况下,都建议用isotonic来做校准。

 

但是要记住,auc并不是万能钥匙。一些情况下,比如说风控,或者医疗情况下,当FP或者FN的cost较大的情况下,还是要看precision。

 

[1] https://machinelearningmastery.com/threshold-moving-for-imbalanced-classification/
[2] https://machinelearningmastery.com/roc-curves-and-precision-recall-curves-for-classification-in-python/