深入理解实际场景下 AUC vs F1 的区别——不说废话

(创作不易,转载请注明出处~)

面试的时候经常被问的一个问题是 AUC和F1 score有什么区别。笔者看了很多博文,感觉相当一部分在分析混淆矩阵和auc、f1的定义上花了太多笔墨,但对于两者的区别和联系,有种到了门前就差临门一脚的感觉。因此笔者去stack overflow上找了很多回答,感觉收获很多,在此简明扼要的写一下收获。如有纰漏欢迎指正。

1、定义:

AUC的优化目标:TPR和(1-FPR)
F1的优化目标:Recall和Precision

这里不再对混淆矩阵(TP、FP、TN、FN)相关的一些很细的概念做详细解释,推荐去看一下auc的维基百科。这里解释一下为什么auc的优化目标是TPR和(1-FPR)。

AUC曲线
大家知道AUC指的是ROC曲线下的面积大小。而ROC曲线是由TPR和FPR为轴的曲线。如果希望auc更大,那么在给定TPR的情况下,我们是希望FPR越小越好的,同样给定FPR,希望TPR越大越好,这样才能给曲线拉向对角线上方。所以我们可以认为:优化auc就是希望同时优化TPR和(1-FPR)。另外,TPR又被成为sensitivity(灵敏度),(1-FPR)又被成为specificity(特异度)

优化F1就是希望同时优化recall和precision这个比较好理解,因为F1的计算公式就是:
F 1 s c o r e = 2 ∗ r e c a l l ∗ p r e c i s i o n r e c a l l + p r e c i s i o n F1score = \frac{2*recall*precision}{recall + precision} F1score=recall+precision2recallprecision

2、两者的关系:

相同点
分析的起点是这两个指标存在一个共同目标。事实上:
r e c a l l = T P R = T P T P + F N recall = TPR = \frac{TP}{TP + FN} recall=TPR=TP+FNTP
也就是说auc和f1 score都希望将样本中实际为真的样本检测出来(检验阳性)。

不同点
区别就在于auc除了希望提高recall之外,另一个优化目标是
s p e c i f i c i t y = 1 − F P R = T N F P + T N specificity = 1-FPR = \frac{TN}{FP+TN} specificity=1FPR=FP+TNTN
希望提高非真样本在检验中呈阴性的比例,也就是降低非真样本呈阳性的比例(假阳性),也就是检验犯错误的概率

而F1score的另一个优化目标是:
p r e c i s i o n = T P T P + F P precision = \frac{TP}{TP+FP} precision=TP+FPTP
希望提高检验呈阳性的样本中实际为真的比例,也就是提高检验的准确率/命中率

那么说到这里,大家应该可以理解这里两个指标在recall之外,其实是存在内在矛盾的。如果说召回率衡量我们训练的模型(制造的一个检验)对既有知识的记忆能力(召回率),那么两个指标都是希望训练一个能够很好拟合样本数据的模型,这一点上两者目标相同。但是auc在此之外,希望训练一个尽量不误报的模型,也就是知识外推的时候倾向保守估计,而f1希望训练一个不放过任何可能的模型,即知识外推的时候倾向激进,这就是这两个指标的核心区别。

3、如何选择

3.1 一个经常使用的例子
关于如何选择这两个指标,网上很多人的意见是:auc不容易受样本不平衡的影响,所以对于imbalance的情况优先使用auc
可以用一个很极端的例子来理解一下,比如我们有100个样本,其中90个为正,10个为负,然后我们训练一个模型,直接将100个样本都判定为阳性。这个时候混淆矩阵:

TP = 90 FN = 0
FP = 10 TN = 0

(预测为阳并正确的有90个,预测为阳并错误的有10个)

这个时候:
TPR = recall = TP/(TP+FN) = 1
1 - FPR = 1 - FP/(FP+TN) = 0
precision = TP/(TP+FP) = 0.9

可以看到这个很“笨”的模型的F1score的值仍然会很高,但是AUC的值就会很低。所以网友的结论是很有道理的。

不过我觉得这个例子举得并不好,因为实际生产中的样本不平衡往往是负样本远远超过正样本,比如推荐领域的点击相比于展示后未点击的样本要少很多,ctr一般都不会超过30%。又比如传染病监测,发病的人数相对于总人数应该是占少数的。所以我们来做类似的分析:
有100个样本,其中90个为负,10个为正,这个时候如果我们直接将100个样本都判定为阴性。混淆矩阵:

TP = 0 FN = 10
FP = 0 TN = 90

(预测为阴并正确的有90个,预测为阴并错误的有10个)

TPR = recall = TP/(TP+FN) = 0
1 - FPR = 1 - FP/(FP+TN) = 1
precision = TP/(TP+FP) = 0
可见这个时候,“笨”模型往往连最基础的目标recall(拟合训练数据)的目标都不能达到。所以我觉得这个网友们常举得例子实际上有些脱离实际。

3.2 贴近实际的分析
对于真实的生产环境中更常见的 正样本较少的样本不平衡情况,我们不能使用极端情况来分析。那么就要回到第二节最后两句话了。

在很好的记忆训练数据中的正样本的基础下:
auc希望训练一个尽量不误报的模型,也就是知识外推的时候倾向保守估计,而f1希望训练一个不放过任何可能的模型,即知识外推的时候倾向激进,这就是这两个指标的核心区别。

所以在实际中,选择这两个指标中的哪一个,取决于一个trade-off。如果我们犯检验误报错误的成本很高,那么我们选择auc是更合适的指标。如果我们犯有漏网之鱼错误的成本很高,那么我们倾向于选择f1score。
放到实际中,对于检测传染病,相比于放过一个可能的感染者,我们愿意多隔离几个疑似病人,所以优选选择F1score作为评价指标。而对于推荐这种场景,由于现在公司的视频或者新闻库的物料总量是很大的,潜在的用户感兴趣的item有很多,所以我们更担心的是给用户推荐了他不喜欢的视频,导致用户体验下降,而不是担心漏掉用户可能感兴趣的视频。所以推荐场景下选择auc是更合适的。

你可能感兴趣的:(算法,推荐系统,深度学习,统计学,机器学习)