在深度学习中,对模型的测量和评估至关重要,只有选择与问题相匹配的评估方法,才能够快速地发现在模型选择和训练过程中可能出现的问题,从而迭代地对模型进行优化。
图像分类是计算机视觉中最基础的一个任务,它的目标是将不同的图像划分到不同的类别,实现最小的分类误差,这里我们只考虑单标签分类问题,即每一幅图像都只有唯一的类别。
对于单标签分类任务,其评价指标主要有:
对于二分类而言:
判断样本是否为正类,只需要神鼎一个概率阈值T,预测概率大于 T 的为正类,小于 T 的为负类,T 默认值是 0.5,如果我们减少阈值 T,更多的样本会被识别为 正类,这样可以提高正类的召回率,但同时也会让更多的负类被错分为正类,如果增加阈值 T,则正类的召回率降低,分类精度提高。
如果多分类而言:
如 ImageNet 分类中的 1000类,那么预测类别就是预测概率最大的那一类。
1、准确率
对于单标签任务而言,每个样本都只有一个正确的类别,预测到该类别就是分类正确,没有预测到的就是分类错误,因此分类最直观的指标就是 Accuracy,即准确率,计算方法如下:
A c c u r a c y = T P + T N T P + F P + T N + F N Accuracy = \frac{TP +TN}{TP +FP +TN +FN} Accuracy=TP+FP+TN+FNTP+TN
记样本 x i x_i xi 的类别为 y i y_i yi ,类别种类为 ( 0 , 1 , . . . , N ) (0,1,...,N) (0,1,...,N),预测类别函数为 f f f ,则 TOP-1 Accuracy 的计算方法如下:
T O P − 1 A c c u r a c y = ∑ i = 0 N − 1 ( f ( x i ) = = y i ) N TOP-1 Accuracy = \frac{\sum^{N-1}_{i=0} (f(x_i)==y_i)}{N} TOP−1Accuracy=N∑i=0N−1(f(xi)==yi)
如果给出预测概率最大的5个预测类别,只要其中包含了真实的类别,则判定预测正确计算出来的指标就是 TOP-5 Accuracy。
import torch
def accuracy(output, target, topk=(1,)):
"""Computes the accuracy over the k top predictions for the specified values of k"""
maxk = max(topk)
batch_size = target.size(0)
_, pred = output.topk(maxk, dim=1, largest=True, sorted=True)
pred = pred.t()
correct = pred.eq(target.reshape(1, -1).expand_as(pred))
return [correct[:k].reshape(-1).float().sum(0) * 100. / batch_size for k in topk]
2、精确率 & 召回率
如果只考虑正样本的指标,则有两个很常用的指标 – 精确率 & 召回率
- 正样本精确率 Precision = TP / (TP + FP),表示召回为正样本的样本中,到底有多大比例是真正的正样本;
- 正样本召回率 Recall = TP / (TP + FN),表示真正的正样本有多大比例被召回;
当然,如果对负样本感兴趣的话,也可以计算对应的精确率和召回率。
通常召回率越高,精确率越低,根据两者对应的值可以绘制 Recall-Precision 曲线,如下图,曲线越靠近右上角说明其性能越好,该性能可以用该曲线与坐标轴包围的面积来定量评估。
3、F1-score
有时我们不仅关注正样本的精确率,也关心其召回率,但又不想用准确率来衡量,一个折中的方法是采用 F1-score。
F 1 − s c o r e = 2 × P r e c i s i o n ⋅ R e c a l l P r e c i s i o n + R e c a l l F1-score = 2 \times \frac{Precision \cdot Recall}{Precision + Recall} F1−score=2×Precision+RecallPrecision⋅Recall
只有在精确率和召回率都高的情况下, F1-score 才会很高,因此 F1-score是一个平衡性能的指标。
4、混淆矩阵
详情可以参考这篇博客 「解析」语义分割性能指标 附代码
如果我们想知道类别之间相互误分的情况,查看是否有特定的类别相互混淆,就可以用混淆矩阵画出分类的详细预测结果。对于包含多个类别的任务,混淆矩阵很清晰地反映了各类别之间的错分概率。
如图,对于一个包含11个类别的分类任务,其混淆矩阵为 11x11 的矩阵,其中第 i 行第 j 列的元素表示第 i 类目标被分为第 j 类的概率。可以看出,越好的分类器对角线上的值越大。
5、ROC曲线
准确率、精确率、召回率 和 F1-score 都是单一的数值指标,如果想观察分类算法在不同的参数下的表现,此时可以使用一条曲线,及 ROC(Receiver Operating Characteristic)曲线。
ROC 曲线可以用评价一个分类器在不同阈值下的表现。在 ROC 曲线中,每个点的
- 横坐标是 FPR(False Position Rate)
- 纵坐标是TPR(True position Rate)
其描绘了分类器在 True Position 和 False Position 之间的平衡。TPR 和 FPR 的计算如下:
- TPN = TP / (TP + FN):表示分类器预测的正类中实际正实例占所有正实例的比例;
- FPN = FP / (FP + TN):表示分类器预测的正类中实际负实例占所有负实例的比例,FPR越大,预测正类中的实际负类越多。
ROC 曲线有四个关键点:
- (0,0)点:FPR=TPR=0,表示分类器预测所有的样本都为负样本;
- (1,1)点:FPR=TPR=1,表示分类器预测所有的样本都为正样本;
- (0,1)点:FPR=0,TPR=1,此时FN=0且FP=0,表示最优分类器,所有的样本都被正确分类;
- (1,0)点:FPR=1,TPR=0,此时TP=0且TN=0,表示最差分类器,有所得样本都被错误分类;
ROC 曲线有一个很好的特征:当测试集中的正负样本比例分布变化时,ROC曲线能够保持不变,即它对正负样本不均衡问题不敏感。例如:负样本的数量增加到原来的10倍,TPR不受影响,FPR 的各项也呈比例地增加,本身并不会有太大的变化,所以对不均衡样本问题,通常选择ROC曲线作为评价标准。
ROC 曲线越接近左上角,表示该分类器的性能越好,若一个分类器的ROC曲线完全包住了另一个分类器ROC曲线,那么可以判断前者的性能更好。
如果想通过两条ROC曲线来定量评估两个分类器的性能,就可以使用 AUC指标。
6、AUC
AUC(Area Under Curve) 为ROC曲线下的面积,这个面积的数值不会大于1。它的含义是一个概率,即随机挑选一个正样本 及 一个负样本,AUC 表征的是分类器对正样本给出的预测值 高于 负样本给出的预测值的概率。
当然,前提是正样本的预测值的确应该高于负样本。
不同 AUC 值表示不同的含义:
- AUC=1:在任何阈值下分类器都可以 100% 识别所有类别,这是理想的分类器,基本不存在;
- AUC=0.5:相当于随机预测,此时分类器不可用;
- 0.5<AUC<1:优于随机预测,这也是实际作用中大部分分类器所处的状态;
- AUC<0.5:总是比随机预测更差;
AUC 作为一个评价标准,常和 ROC 曲线一起使用,因为 ROC曲并不能清晰地说明那个分类器的效果更好,而 AUC值的大小直接量化评估了分类器的性能。