背景
之前文章讲了如果用 tensorflow 训练模型之后,如果对模型体积有要求,或者希望优化模型网络结构的时候,我们会调整模型的一些网络结构。但是如果证明调整后的网络结构与之前的网络结构相比的优劣性呢。
最简单的,我们一般会跑一个准确率,那么除了这个准确率之外还有其他的指标能证明模型的优劣吗,这篇文章给大家讲下评估分类模型优劣的其他几个指标。
名称解释
举个例子,假设一个二分类模型,模型的作用是用来区分一堆数据中真的数据和假的数据。
假设一共有 22 个数据,22 个数据中真数据有 12 个,假数据有 10 个。而分类模型认为其中 8 个数据是真的,当然,这 8 个数据中有 5 个是真的,而另外 3 个是假的,却被模型错误的认为是真的。如下图所示:
那让我们定义以下概念:
TP = 5
FP = 3
TN = 7
FN = 7
真正率、真阳率、灵敏度
真正率(true positive rate, TPR),真阳率,灵敏度(sensitivity),指的是被模型预测的正样本的比例:
TPR = TP / (TP + FN)
在例子中指的是 5/12
这个比例高适合于那些需要“宁可错杀一千,不可放过一个”的模型,比如地震预测,地震预测错多次也没关系,重要的是真的发生地震的时候一定要预测出来。
真负率、特异度
真负率(true negative rate, TNR),特异度(specificity),指的是被模型正确预测的负样本的比例:
TNR = TN / (TN + FP)
在例子中是 7/10
这个比例高适合于那些需要“不能冤枉一个好人”的业务模型,比如预测一些人是否罪犯,宁可放过一些罪犯,也不能冤枉一个好人。
假正率、假阳率
假正率(false positive rate, FPR),假阳率,指的是被模型错误预测的正样本比例:
FPR = FP / (TN + FP)
在例子中指的是 3/10
假负率
假负率(false negative rete, FNT),指的是被模型错误预测的负样本的比例:
FNR = FN / (TP + FN)
在例子中指的是 7/12
精确度、精度、查准率
精度(precision)指的是模型查出来的所有数据中,有多少是准的。
p = TP / (TP + FP)
在例子中指的是 5/8
召回率、查全率、真正率、真阳率、灵敏度
召回率(recall)指的是所有对的数据中,有多少能被模型查出来。但其实召回率就是前面提到的真阳率。
r = TP / (TP + FN)
在例子中指的是 5/12
F1
F1分数(F1 Score),又被称为平衡F分数(balanced F Score),是一个兼顾精确率和召回率的调和平均数。定义如下:
但如果你的模型对精确率和召回率考虑的权重不一样时,可以定义 F-β 分数如下:
当 β 为 1 是,召回率和精确率的权重一样,也就是 F-1 分数。当 β 大于 1 时,召回率的权重高于精确率,如 F-2 分数。当 β 小于 1 时,精确率的权重高于召回率,如 F-0.5 分数。
ROC
ROC全称受试者工作特征曲线(receiver operating characteristic curve),又称为感受性曲线(sensitivity curve)。绘制方式是以假阳率(FPR)为横坐标,以真阳率为(TPR)为纵坐标,对于模型输出的特征值,以不同的阈值进行划分,得到曲线。
举个简单的例子:
假设 5 个数据点,模型输出的特征值分别是
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
其中前 5 个数据点为负,后 5 个数据点为正,也就是说,10 个数据的标签时如下形式
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
那么,当我的阈值分别取以下值的时候
[1. 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1]
假阳率和真阳率分别是以下值
假阳率:[0. 0. 0. 0. 0. 0.2 0.4 0.6 0.8 1. ]
真阳率:[0.2 0.4 0.6 0.8 1. 1. 1. 1. 1. 1. ]
按照 ROC 的定义,得到的曲线如图
在 ROC 曲线中,左上角的点代表取这个阈值的时候,假阳率最低,真阳率最高,是最佳阈值,上图中的最佳阈值是 0.6。
AUC
AUC(Area Under Curve)被定义为 ROC 曲线下的面积,顾名思义。这个值存在的意义是开发者希望用一个定量的数字来表示模型的性能。
由上图可知,AUC 的取值范围在 0 到 1 ,越大越好。但 AUC 小于 0.5 的模型我们认为是没有意义的,分类效果太差。
上图中的 AUC 是 1。
PRC
PRC(Precision Recall Curve),精度召回率曲线,以召回率(查全率)为横坐标,精度(查准率)为纵坐标,和 RPC 类似,对于模型输出的特征值,以不同的阈值进行划分,得到曲线。
还是上面那个例子,5 个数据点,模型输出的特征值分别是
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
其中前 5 个数据点为负,后 5 个数据点为正,也就是说,10 个数据的标签时如下形式
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
那么,当我的阈值分别取以下值的时候
[0.6 0.7 0.8 0.9 1]
假阳率和真阳率分别是以下值
查全率(召回率):[1. 0.8 0.6 0.4 0.2 0. ]
查准率(精度):[1. 1. 1. 1. 1. 1.]
绘制的曲线如图
在 PRC 曲线中,最右上角的点,查全率和查准率都最高,也就是最佳阈值,在这个例子中,是 0.6(在这个例子中 ROC 曲线和 PRC 曲线得到的最佳阈值是同一个数,但并不总是这样)。
损失函数曲线
损失函数曲线(Loss Curve),是以训练次数为横轴,以当次的损失率为纵轴绘制的曲线。
损失函数
关于损失函数的定义可以参考其他机器学习教程,这里就不细说了,简单来说,是如下定义:
这里的 X,Y 并不是变量,而是常量,指的是 n 个样本及 n 个样本的标签值。损失函数是一个关于 f(x) 中参数的公式。
每次训练后,在训练集和交叉验证集(或测试集)上分别跑下损失函数的值,大概是一个如下的曲线:
这个曲线可以显示欠拟合和过拟合的程度,从上面曲线可以看出来,在训练集上,损失函数值是逐渐趋于0的,而在验证集上损失函数在下降一段时间后开始上升,这说明出现了过拟合。
MNIST 问题中的 Loss 曲线
可以看出一直没有出现过拟合的情况
ROC和PRC曲线比较
ROC 曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC 曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。下图是 ROC 曲线和 Precision-Recall 曲线的对比:
在上图中,(a) 和 (c) 为ROC曲线,(b) 和 (d) 为Precision-Recall曲线。(a) 和 (b) 展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c) 和 (d) 是将测试集中负样本的数量增加到原来的 10 倍后,分类器的结果。可以明显的看出,ROC 曲线基本保持原貌,而 Precision-Recall 曲线则变化较大。
也就是 PRC 曲线会面临一个问题,当需要获得更高 recall 时,model 需要输出更多的样本,precision 可能会伴随出现下降/不变/升高,得到的曲线会出现浮动差异(出现锯齿),无法像 ROC 一样保证单调性。
结论:AUC 用得比较多的一个重要原因是,实际环境中正负样本极不均衡,PR 曲线无法很好反映出分类器性能,而 ROC 受此影响小。
总结
以上各个指标都不能全面的覆盖分类器的各种性能,在实际应用中,应该合理的组合使用以上指标来判断分类器的效果。