分类模型性能度量(一)

  本文主要参考了周志华教授的西瓜书,对分类模型性能度量进行了介绍,包括准确率和误差率、混淆矩阵、精确率和召回率以及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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值