1、常见
实正 | 实负 | |
判正 | TP | FP |
判负 | FN | TN |
(1)精确率(查准率)
正确预测为正占全部预测为正的比率
P=TP/(TP+FP)
(2)召回率(查全率)
正确预测为正占全部实际为正的比率
R=TP/(TP+FN)
(3)准确率
预测正确的占所有样本的比率
准确率= (TP+TN)/(TP+FN+FP+TN)
(4)Fp分数
当p=1时候为F1分数,用来平衡P和R之间的关系
F1=(2*P*R)/(P+R)
(5)假正率(假阳率)
预测为正例的负例占实际负例样本数量的比例
假阳率=FP/(FP+TN)
2、评估曲线
(1)ROC曲线
接收者操作特征曲线(receiver operating characteristic curve),反映了召回率(灵敏度)纵轴和假阳性率(1-特异度)横轴之间的变化关系。Roc曲线越趋近于左上角,预测结果越准确。ROC曲线表现了一般情况下模型泛化能力的好坏。
如何画曲线:
(2)AUC
是ROC曲线下面积,越大意味着效果越好。
原理:给定正样本M个,负样本N个,以及他们的预测概率(0-1)之间,那么AUC的含义就是所有穷举所有的正负样本对,如果正样本的预测概率大于负样本的预测概率,那么就+1;如果如果正样本的预测概率等于负样本的预测概率,那么就+0.5, 如果正样本的预测概率小于负样本的预测概率,那么就+0;最后把统计处理的个数除以M×N就得到我们的AUC
计算公式
def AUC(label, pre):
"""
适用于python3.0以上版本
"""
#计算正样本和负样本的索引,以便索引出之后的概率值
pos = [i for i in range(len(label)) if label[i] == 1]
neg = [i for i in range(len(label)) if label[i] == 0]
auc = 0
for i in pos:
for j in neg:
if pre[i] > pre[j]:
auc += 1
elif pre[i] == pre[j]:
auc += 0.5
return auc / (len(pos)*len(neg))
import numpy as np
from sklearn.metrics import roc_auc_score
def calc_auc(y_labels, y_scores):
f = list(zip(y_scores, y_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]
pos_cnt = np.sum(y_labels == 1)
neg_cnt = np.sum(y_labels == 0)
auc = (np.sum(rankList) - pos_cnt*(pos_cnt+1)/2) / (pos_cnt*neg_cnt)
print(auc)
def get_score():
# 随机生成100组label和score
y_labels = np.zeros(100)
y_scores = np.zeros(100)
for i in range(100):
y_labels[i] = np.random.choice([0, 1])
y_scores[i] = np.random.random()
return y_labels, y_scores
if __name__ == '__main__':
y_labels, y_scores = get_score()
# 调用sklearn中的方法计算AUC,与后面自己写的方法作对比
print('sklearn AUC:', roc_auc_score(y_labels, y_scores))
calc_auc(y_labels, y_scores)
(1)AUC为什么对正负样本比率不敏感
AUC可以看作随机从正负样本中选取一对正负样本中,其中正样本得分大于负样本的概率。计算AUC只需要沿着ROC横轴做积分就可以,由于ROC曲线一般都位于y=x上方(不是,就用1-p反转一下)
3、时序动作检测
(1)AR-AN曲线
判断找的temporal proposals全不全
AR(平均召回)=(所有视频的召回之和)/视频数
AN(平均每段视频找到的proposal数目)=proposals数目/视频数
(2)mAP,各类别AP的平均值
tIOU时间上的交并比
mAP=所有类别的平均精度之和/所有类别的视频数目
以上内容均来源于各个版主、牛客网总结