本文主要参考了周志华教授的西瓜书,对分类模型性能度量进行了介绍,包括准确率和误差率、混淆矩阵、精确率和召回率以及F度量,并使用python语言对混淆矩阵可视化进行了编程。
一、准确率(accuracy)和误差率(error rate)
分类准确率和误差率是分类任务中最常用的两种性能度量,在论文中能够见到作者使用二者说明论文主题的有效性。二者定义如下:
二、精确率(precision),召回率(recall)
(一)为什么引入精确率和召回率(Why)
分类准确率和误差率虽然常用,但是不能满足所有分类任务的性能度量需求,尤其为二分类问题,例如:
1、根据医学图像判断患者是否患有癌症,使用训练好的模型对测试医学图像进行判别,准确率表示多少比例的图像被判别准确,但这个指标在下表所示情况下意义很小,虽然准确率达到了94.0%,但是40幅患癌图像被判别错误,可能使得患者丧失了治疗的机会,天理难容。这种情况下,更加关心的是“患癌图像中有多少比例被判别正确”。
2、(周志华教授-西瓜书)假定瓜农拉来一车西瓜,使用训练好的模型对西瓜好坏进行判别,显然,错误率衡量了多少比例的瓜判别错误。但是顾客更加关心“挑出的西瓜有多少比例是好瓜”或者“所有好瓜中有多少比例被挑出来”
3、根据火车轨道图像检测缺陷,轨道缺陷严重影响着生命安全,而且测试样本存在着大量轨道正常样本和少量轨道缺陷样本的特性,这时候更加关注“轨道缺陷能否被完全检测出来”。
(二)精确率和召回率是什么(What)
1、混淆矩阵
二分类问题是简单的是否问题,训练和测试样本集由正例和负例组成,其中正例为我们所关注的类别,如西瓜中的好瓜。多分类问题也可以转换为二分类问题,将关注的类别设置为正例,将其他类别设置为负例。根据测试数据集的真实类别和预测类别的组合可以分为真正例(true positive-TP)、假正例(false positive-FP)、真反例(true negative-TN)和假反例(false negative-FN)四种情况,四者组成的混淆矩阵如下:
混淆矩阵的AB模式:B表示预测类别(P为正例,N为反例);A表示预测结果正确(T)或错误(F)
根据表格可知:
(1)TP+FN+FP+TN=样本总数;
(2)accuracy=(TP+TN)/(TP+FN+FP+TN);
(3)error rate=(FP+FN)/(TP+FN+FP+TN)。
anaconda编程实例:
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import numpy as np
import itertools
# 函数功能:绘制混淆矩阵
# 函数参数:cm-混淆矩阵,classes-类别名称,title-图像标题,cmap-图像底色
def plot_confusion_matrix(cm, classes, title='Confusion maxtrix',cmap=plt.cm.Reds):
plt.imshow(cm,interpolation='nearest',cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes)) # 坐标刻度符号
plt.xticks(tick_marks,classes,rotation=0) # 横坐标刻度符号
plt.yticks(tick_marks,classes) # 纵坐标刻度符号
thresh = cm.max() /2.
for i,j in itertools.product(range(cm.shape[0]),range(cm.shape[1])):
plt.text(j,i,cm[i,j], horizontalalignment = 'center', color = "white" if cm[i,j]>thresh else "blue")
plt.ylabel('True label')
plt.xlabel('Predicted label')
y_true = [1,0,1,1,0,0,1,0,1,1] # 测试数据真实标签
y_pred = [1,1,0,1,1,1,0,0,0,0] # 测试数据预测标签
cnf_matrix = confusion_matrix(y_true, y_pred) # 计算混淆矩阵
print ('------- 混淆矩阵 -------')
print(cnf_matrix)
print ('------------------------')
class_names = [0,1]
plt.figure()
plot_confusion_matrix(cnf_matrix,classes = class_names, title="Confusion matrix")
plt.show()
输出结果:
2、精确率(precision)
精确率反映的是分类模型判断的正例中真正正例的比例,如判断为癌症的医学图像中真正癌症图像的比例。
3、召回率(recall)
召回率反映的是总正例中被分类模型正确判别的比例,医疗行业也称之为灵敏度,如真正癌症图像中有多少比例的图像被正确判别出来。
三、F度量
(一)为什么使用F度量(Why)
在不同的分类任务中,对精确率和召回率的要求是不尽相同的。例如,火车轨道检测要求尽可能地将所有缺陷检测出来,因此召回率更加重要;顾客挑选西瓜时,更加希望挑选的西瓜是好瓜,此时精确率更加重要。因此引入能够权衡精确率和召回率的指标,即F度量。
(二)F度量是什么(What)
F度量的一般形式为:
其中β>0度量了精确率对召回率的相对重要性。β=1时,退化为F1度量,表示精确率和召回率同等重要:
以根据医学图像判断患者是否患有癌症为例,可能如下混淆矩阵:
精确率precision=60/(60+20)=0.75
召回率recall=60/(60+40)=0.60
F1度量=(20.750.60)/(0.75+0.60)=0.667
四、推广到多分类问题
以三类分类问题为例,使用训练好的模型对猫,狗和兔进行分类,得到如下混淆矩阵:
以猫类别为例,可得如下指标:
精确率precision=a/(a+d+g)
召回率recall=a/(a+b+c)