FP、FN、TP、TN
TP: true positive, 预测是阳性,实际也是正例。
TN: true negative, 预测是阴性,实际也是负例。
FP: false positive, 预测是阳性,实际是负例。
FN: false negative, 预测是阴性,实际是正例。
准确率
准确率(Accuracy):
模型判断正确的数据 (TP+TN) 占总数据的比例。
Accuracy = (TP+TN)/ALL
精确率(Precision)
又称查准率,针对模型判断出的所有正例 (TP+FP) 而言,其中真正例 (TP) 占的比例。
Precision = TP/(TP+FP)
召回率(Recall)
又称查全率,针对数据集中的所有正例 (TP+FN) 而言,模型正确判断出的正例 (TP) 占数据集中所有正例的比例。
Recall = TP/(TP+FN)
灵敏度(Sensitive)
所有正例中被分对的比例,衡量了分类器对正例的识别能力。
Sensitive = TP/P
特效度(Specificity)
所有负例中被分对的比例,衡量了分类器对负例的识别能力。
Specificity = TN/N
F1分数
F1分数 = 2查准率查全率 / (查准率 + 查全率)
P-R(查准率-查全率)曲线:遍历0到1之间所有的阈值,而每个阈值下都对应着一对查准率和查全率,从而得到了这条曲线。
AUC(Area Under Curve)
AUC 为 ROC 曲线下与坐标轴围成的面积,取值范围在 0.5 和 1 之间。AUC 越接近 1.0,检测方法真实性越高;等于 0.5 时无应用价值。
ROC 为受试者工作特征曲线 (receiver operating characteristic curve),它是根据一系列不同的二分类阈值,以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。
from sklearn import metrics
def aucfun(act, pred):
fpr,tpr, thresholds = metrics.roc_curve(act, pred, pos_label=1)
return metrics.auc(fpr, tpr)
假设有 M 个正样本和 N 个负样本,从M个正样本中随机抽取一个样本 a,其 prob 为 p_a, 然后从 N 个负样本中随机抽取一个样本 b,其 prob 为p_b。这样一共有 MN 个抽取结果,每个抽取结果是一个 pair (p_a, p_b)。假设所有抽取结果中有 K 个结果满足 p_a > p_b,那么 AUC=K/(MN) 。
从统计意义去计算,所有的正负样本对中,正样本排在负样本前面占样本对数的比例即为 AUC。
def calAUC(prob,labels):
f = list(zip(prob,labels))
rank = [values2 for values1,values2 in sorted(f,key=lambda x:x[0])]
rankList = [i+1 for i in range(len(rank)) if rank[i]==1]
posNum = 0
negNum = 0
for i in range(len(labels)):
if(labels[i]==1):
posNum+=1
else:
negNum+=1
auc = (sum(rankList)- (posNum*(posNum+1))/2)/(posNum*negNum)
return auc
代码分析:如果存在阈值完全分开正负样本,则按照prob排序后,前面label列表全是0后面全是1,这时候1的坐标和为P*((N+1)+(N+P))/2。坐标和的变化,等于出现的逆序数量,故而想求实际正序的比例,等同于(MN-逆序数)/MN,而逆序数=理想坐标和-实际坐标和。所以AUC=(MN-理想坐标和+实际坐标和)/MN=(MN-P*((N+1)+(N+P))/2+实际坐标和)/MN=(实际坐标和-P(P+1)/2)/MN。
ROC/AUC
IoU(Intersection over Union)
交并比计算的是 “预测的边框” 和 “真实的边框” 的交集和并集的比值。
def iou(box1, box2):
'''
二维 iou 计算
box:[top, left, bottom, right]
'''
in_h = min(box1[2], box2[2]) - max(box1[0], box2[0])
in_w = min(box1[3], box2[3]) - max(box1[1], box2[1])
inter = 0 if in_h<0 or in_w<0 else in_h*in_w
union = (box1[2] - box1[0]) * (box1[3] - box1[1]) + \
(box2[2] - box2[0]) * (box2[3] - box2[1]) - inter
iou = inter / union
return iou
mAP(mean Average Precision)
mAP 衡量学出的模型在所有类别上的好坏,取所有 AP 的平均值得到 mAP。