在图像分类和目标检测领域,选择合适的评估指标对于模型选择、超参数调整、正则化技术的需求等方面至关重要。本文将介绍一些常用的评估指标。
图像分类问题可以是二分类或多分类问题。例如,二分类问题包括癌症检测、猫狗识别等;多标签分类问题包括MNIST、CIFAR等。
通常首先考虑的指标是准确度,它计算正确预测与错误预测的比例。但在数据不平衡的情况下,这个指标是否总是有效呢?
下一步通常是绘制混淆矩阵,它包含四个类别:真正例、真负例、假正例和假负例。利用这个矩阵,可以计算出各种有用的指标。
from sklearn.metrics import confusion_matrix, accuracy_score
# 阈值可以针对每个问题进行优化
threshold = 0.5
preds_list = preds_list >= threshold
tn, fp, fn, tp = confusion_matrix(labels_list, preds_list).ravel()
accuracy = accuracy_score(labels_list, preds_list)
可能听说过召回率或敏感度,它们是同一个概念!
敏感度表示正确预测并分类的正类样本的百分比或比例,也称为召回率。
敏感度 = 真正例 / (真正例 + 假负例)
例如:模型检测到的实际癌症患者占多少百分比?
正确预测正类样本固然重要,但如果一个癌症阴性患者被错误告知处于危险中(假正例),会发生什么呢?特异性是计算正确预测并分类的负类样本的比例。
特异性 = 真负例 / (假正例 + 真负例)
这也称为真负例率(TPR)。
特异性和敏感度是最常用的指标。但为了获得ROC曲线,还需要理解假正例率(FPR)。
这计算了错误分类为正类的负类样本的数量。
FPR = 假正例 / (假正例 + 真负例)
FPR = 1 – 特异性
对于一个好的分类模型,希望有更高的TPR和更低的FPR。
ROC代表接收者操作特征(Receiver Operator Characteristic),AUC表示曲线下的面积。这里,针对不同的阈值绘制真正例率与假正例率。
通常,如果预测值高于0.5,将其归类为正类,否则为负类。这里的决定边界0.5被称为阈值。不一定要使用0.5作为阈值,有时其他值可能会给出最佳结果。为了找出这个值,针对一系列阈值绘制TPR与FPR。通常,阈值从0.1、0.2、0.3、0.4等变化到1。
对于特定的阈值,如果想计算ROC AUC分数,sklearn提供了一个函数。可以按照以下方式使用它。
from sklearn.metrics import roc_auc_score
roc_auc = roc_auc_score(labels, predictions)
应该寻找图形的左上角作为最优阈值!
如果想绘制ROC AUC图,可以使用以下代码片段。
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
import matplotlib.pyplot as plt
plt.plot(fpr, tpr)
plt.show()
这里,fpr和tpr由函数给出,将是一个包含每个阈值列表中相应值的列表/数组。
还可以将敏感度和特异性针对阈值绘制出来,以获得更多信息。
目标检测有许多应用,包括面部检测、自动驾驶系统中的车道检测等。在这里,需要使用不同的一组指标来评估。最受欢迎的一个是IOU。让开始吧!
在目标检测或分割问题中,真实标签是物体所在部分的掩码或边界框。IOU指标找出预测边界框与真实边界框之间的差异。
IOU = 两个边界框的交集面积 / 并集面积
IOU的值在0-1之间。对于完全重叠的框,它将是1,对于不重叠的预测则是0。通常,IOU应该高于0.5,对于一个不错的目标检测模型。
使用IOU,可以计算精度和召回率。怎么做呢?
必须设置一个IOU阈值。例如,假设将IOU阈值保持为0.5。那么对于IOU为0.8的预测,可以将其分类为真正例。如果它是0.4(低于0.5),那么它就是假正例。同样注意,如果将阈值改为0.4,那么这个预测将被分类为真正例。因此,不同的阈值可以给出不同的指标。
接下来,通过找到精度-召回率曲线下的面积,获得平均精度(AP)。目标检测的mAP是通过计算所有类别的AP的平均值来确定模型对数据集中真实对象注释的一组目标检测的准确性。