草庐IT

[机器学习]-分类问题常用评价指标、混淆矩阵及ROC曲线绘制方法-python实现(多分类)

CAMILIA的学习日记 2023-03-28 原文

分类问题

分类问题是人工智能领域中最常见的一类问题之一,掌握合适的评价指标,对模型进行恰当的评价,是至关重要的。

同样地,分割问题是像素级别的分类,除了mAcc、mIoU之外,也可以采用分类问题的一些指标来评价。

本文对分类问题的常见评价指标进行介绍,并附上利用sklearn库的python实现。

将从以下三个方面分别介绍:

  1. 常用评价指标
  2. 混淆矩阵绘制及评价指标计算
  3. ROC曲线绘制及AUC计算

1. 常用评价指标

混淆矩阵(confusion matrix)

一般用来描述一个分类器分类的准确程度。
根据分类器在测试数据集上的预测是否正确可以分为四种情况:

  • TP(True Positive)——将正类预测为正类数;
  • FN(False Negative)——将正类预测为负类数;
  • FP(False Positive)——将负类预测为正类数;
  • TN(True Negative)——将负类预测为负类数。
    构成一个二分类的混淆矩阵如图:

均交并比(Mean Intersection over Union,mIoU):

语义分割的标准度量。其计算两个集合的交并比,在语义分割的问题中,这两个集合为真实值(ground truth)和预测值(predicted segmentation)。

分类问题评价指标

二分类问题经混淆矩阵的处理后,针对不同问题,可以选用不同的指标来评价系统。

  1. Accuracy:表示预测结果的精确度,预测正确的样本数除以总样本数;
  2. Precision:准确率,表示预测结果中,预测为正样本的样本中,正确预测为正样本的概率;
  3. Sensitivity:灵敏度,表示在原始样本的正样本中,最后被正确预测为正样本的概率;
  4. Specificity:常常称作特异性,它研究的样本集是原始样本中的负样本,表示的是在这些负样本中最后被正确预测为负样本的概率;
  5. F1-score:表示的是precision和recall的调和平均评估指标。

受试者工作特征(Receiver Operating Characteristic,ROC)曲线

ROC曲线是以真阳性率(TPR)为Y轴,以假阳性率(FPR)为X轴做的图。同样用来综合评价模型分类情况。是反映敏感性和特异性连续变量的综合指标。

AUC(Area Under Curve)

AUC的值为ROC曲线下与x轴围成的面积,分类器的性能越接近完美,AUC的值越接近。当0.5>AUC>1时,效果优于“随机猜测”。一般情况下,模型的AUC值应当在此范围内。

2. 混淆矩阵绘制及评价指标计算

首先是分类器的训练,以sklearn库中的基础分类器为例

import numpy as np
import pandas as pd
from sklearn.svm import SVC, LinearSVC
from sklearn import metrics
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt


clf = LinearSVC()
clf.fit(train_features, train_target)
predict = clf.predict(test_features)

# 绘制混淆矩阵和评价指标计算
cal(test_target, pred)

# 获取分类score
score = clf.decision_function(test_features)

# 绘制ROC曲线和计算AUC
paint_ROC(test_target, test_score)

混淆矩阵的绘制和评价指标计算可以写在一起,在绘制混淆矩阵时,已经可以算出TP\TN\FP\FN的数值。

import numpy as np
import pandas as pd
from sklearn.svm import SVC, LinearSVC
from sklearn import metrics
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

# 这是一个多分类问题,y_true是target,y_pred是模型预测结果,数据格式为numpy

def cal(y_true, y_pred):

    # confusion matrix row means GT, column means predication
    name = 'save_name'
    '''画混淆矩阵'''
    mat = confusion_matrix(y_true, y_pred)
    da = pd.DataFrame(mat, index = ['0', '1', '2'])
    sns.heatmap(da, annot =True, cbar = None, cmap = 'Blues')
    plt.title(name)
    # plt.tight_layout()yt
    plt.ylabel('True Label')
    plt.xlabel('Predict Label')
    plt.show()
    plt.savefig('{}/{}.png'.format('save_path', name)) # 将混淆矩阵图片保存下来
    plt.close()
    
    '''计算指标'''
    tp = np.diagonal(mat) # 每类的tp
    gt_num = np.sum(mat, axis=1) # axis = 1 指每行 ,每类的总数
    pre_num = np.sum(mat, axis=0)
    fp = pre_num - tp
    fn = gt_num - tp
    num = np.sum(gt_num)
    num = np.repeat(num, gt_num.shape[0])
    gt_num0 = num - gt_num
    tn = gt_num0 -fp
	
    recall = tp.astype(np.float32) / gt_num
    specificity = tn.astype(np.float32) / gt_num0
    precision = tp.astype(np.float32) / pre_num
    F1 = 2 * (precision * recall) / (precision + recall)
    acc = (tp + tn).astype(np.float32) / num

    print('recall:', recall, '\nmean recall:{:.4f}'.format(np.mean(recall)) )
    print('specificity:', specificity, '\nmean specificity:{:.4f}'.format(np.mean(specificity)))
    print('precision:', precision, '\nmean precision:{:.4f}'.format(np.mean(precision)))
    print('F1:', F1 , '\nmean F1:{:.4f}'.format(np.mean(F1)))
    print('acc:', acc , '\nmean acc:{:.4f}'.format(np.mean(acc)))

混淆矩阵如图所示:

3. ROC曲线绘制及AUC计算

import numpy as np
import pandas as pd
from sklearn.svm import SVC, LinearSVC
from sklearn import metrics
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

# 这是一个多分类问题(三分类),可以在一张图上绘制多条ROC曲线

def paint_ROC(y_test, y_score):

    '''画ROC曲线'''
    plt.figure()
    # 修改颜色
    colors = ['','darkred', 'darkorange', 'cornflowerblue']

    fpr = dict()
    tpr = dict()
    roc_auc = dict()
    # print('label',y_test)
    # print('score', y_score)

    label = np.zeros((len(y_test), 3),  dtype="uint8")
    for i in range(len(y_test)):
        label[i][int(y_test[i])-1] = 1
    # print('label',label)

    for i in range(1,4):
        fpr[i], tpr[i], _ = metrics.roc_curve(label[:,i-1], y_score[:, i-1])
        roc_auc[i] = metrics.auc(fpr[i], tpr[i])

    fpr["mean"], tpr["mean"], _ = metrics.roc_curve(label.ravel(), y_score.ravel())
    roc_auc["mean"] = metrics.auc(fpr["mean"], tpr["mean"])

    lw = 2
    plt.plot(fpr["mean"], tpr["mean"],
         label='average, ROC curve (area = {0:0.2f})'
               ''.format(roc_auc["mean"]),
         color='k', linewidth=lw)

    for i in range(1,4):
        auc = roc_auc[i]
        # 输出不同类别的FPR\TPR\AUC
        print('label: {}, fpr: {}, tpr: {}, auc: {}'.format(i, np.mean(fpr[i]), np.mean(tpr[i]), auc))
        plt.plot(fpr[i], tpr[i], color=colors[i],linestyle=':',lw = lw, label='Label = {0}, ROC curve (area = {1:0.2f})'.format(i, auc))

    plt.plot([0, 1], [0, 1], color='navy', linestyle='--')
    plt.xlim([0.0, 1.05])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    # plt.title('Receiver operating characteristic example')
    plt.grid(linestyle='-.')  
    plt.grid(True)
    plt.legend(loc="lower right")
    plt.show()
    # 保存绘制好的ROC曲线
    plt.savefig('{}/{}.png'.format('save_path', 'save_name'))
    plt.close()

ROC曲线如图所示:

有关[机器学习]-分类问题常用评价指标、混淆矩阵及ROC曲线绘制方法-python实现(多分类)的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  8. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

随机推荐