环境 :mac py3.7 anaconda jupyter
项目教程及代码来自:同济子豪兄
https://github.com/TommyZihao/Train_Custom_Dataset
https://www.bilibili.com/video/BV1bP411j7NK
一、学习总结
获取测试集预测结果并保存下来后(df或csv),需制作混淆矩阵来评估模型准确度
关于分类的混淆矩阵,先从最简单的二分类(positve — negative )混淆矩阵讲起。
真实\预测 | 预测是猫 Positive | 预测不是猫 Negative |
是猫Actual Positive | 分类正确:是猫 True Positive | 分类错误:不是猫 False Negative |
不是猫Actual Negative | 分类错误:是猫 False Positive | 分类正确:不是猫 True Negative |
评估标准1: 总准确度Acuraccy =(TP+TN)/(TP+FN+FP+TN)
查准率 Precision = TP/(TP+FP) # TP/TP同列
从模型做出的所有预测出发,描述预测的正确率。(被预测为猫的项是否真的是猫)
查全率Recall = TP/(TP+FN) # TP/TP同行
从真实情况出发,描述Actual positive的项被positive覆盖的程度。(所有真的是猫的项,是否都被预测为是猫)
评估标准2: F1-score = (2*Precision*Recall)/(Precision+Recall) # 两者的调和平均数
0-1 。越接近1,模型越好。
评估标准3:PR曲线的AP。以Precision为纵轴,Recall为横轴作图。AP为得到的曲线下方覆盖的面积
曲线越向右上角突出越好。AP:0-1,越接近1越好。
TPR = Recall = TP/(TP+FN)
FPR = FP/(FP+TN)
评估标准4:ROC曲线的AreaUnderCurve(AUC)。使用不同阈值(解释详见https://b23.tv/jEk5z5E)下的TPR(纵轴)与FPR(横轴)绘制得到曲线。AUC为曲线覆盖的面积。
AUC:0-1,越大越好
对于实际多分类的混淆矩阵:
这是一个小例子,总计64项
真实分类\预测分类 | 类1 | 类2 | 类3 |
类1 | 15 | 2 | 3 |
类2 | 6 | 12 | 0 |
类3 | 0 | 4 | 22 |
Accurancy = 主对角线和/总和 = 49/64 = 76.56%
每一类的Precision与Recall需单独算
例如对于类2而言
真实分类\预测分类 | 类1 | 类2 | 类3 |
类1 | 15 TN | 2 FP | 3 TN |
类2 | 6 FN | 12 TP | 0 FN |
类3 | 0 TN | 4 FP | 22 TN |
precision = 12/18 =0.66 recall = 12/18 = 0.66
F1-score = 0.66
多分类的 F1-score为每个类的F1-score的均值。此例为0.75
二、关键代码
迅速获取P,S与f1-score
from sklearn.metrics import classification_report
print(classification_report(df['标注类别名称'], df['top-1-预测名称'], target_names=classes))
生成混淆矩阵的代码
from sklearn.metrics import confusion_matrix
confusion_matrix_model = confusion_matrix(df['真实类别名称'], df['top-1-预测名称'])
获得某类AP值
from sklearn.metrics import average_precision_score
# 二分类标注-索引+布尔序列
y_test = (df['标注类别名称'] == specific_class)
# 二分类预测置信度
y_score = df['某类-预测置信度']
AP = average_precision_score(y_test, y_score, average='weighted')
获得某类auc值
from sklearn.metrics import roc_curve, auc
# 二分类标注-索引+布尔序列
y_test = (df['标注类别名称'] == specific_class)
# 二分类预测置信度
y_score = df['某类-预测置信度']
fpr, tpr, threshold = roc_curve(y_test, y_score)
AUC = auc(fpr,tpr)