精华内容
下载资源
问答
  • 二分类任务,在最后的实验部分需要画混淆矩阵,来说明实验的结果。 import matplotlib.pyplot as plt guess = ["normal","cancer"] fact = [ "normal","cancer"] classes = list(set(fact)) classes.sort...
    二分类任务,在最后的实验部分需要画混淆矩阵,来说明实验的结果。
    
    
    
    import matplotlib.pyplot as plt
    
    
    guess = ["normal","cancer"]
    fact = [ "normal","cancer"]
    classes = list(set(fact))
    classes.sort(reverse=True)
    r1=[[367,16],[33,384]]
    
    plt.figure(figsize=(12,10))       #设置plt窗口的大小
    confusion =r1
    print("confusion",confusion)
    plt.imshow(confusion, cmap=plt.cm.Blues)
    indices = range(len(confusion))
    indices2 = range(3)
    plt.xticks(indices, classes,rotation=40,fontsize=18)
    plt.yticks([0.00,1.00], classes,fontsize=18)
    plt.ylim(1.5 , -0.5)   #设置y的纵坐标的上下限
    
    plt.title("Confusion matrix",fontdict={'weight':'normal','size': 18})
    #设置color bar的标签大小
    cb=plt.colorbar()
    cb.ax.tick_params(labelsize=18)
    plt.xlabel('Predict label',fontsize=18)
    plt.ylabel('True label',fontsize=18)
    
    print("len(confusion)",len(confusion))
    for first_index in range(len(confusion)):
        for second_index in range(len(confusion[first_index])):
    
            if confusion[first_index][second_index]>200:
                color="w"
            else:
                color="black"
            plt.text(first_index, second_index, confusion[first_index][second_index],fontsize=18, color = color,verticalalignment='center',horizontalalignment='center',)
    plt.show()

     

     

    显示效果如下:

    展开全文
  • python混淆矩阵

    万次阅读 热门讨论 2018-05-24 14:21:35
    对于分类问题,为了直观表示各类别分类的准确性,一般使用混淆矩阵M. 混淆矩阵M的每一行代表每个真实类(GT),每一列表示预测的类。即:Mij表示GroundTruth类别为i的所有数据中被预测为类别j的数目。 这里给出两...

    对于分类问题,为了直观表示各类别分类的准确性,一般使用混淆矩阵M. 

    混淆矩阵M的每一行代表每个真实类(GT),每一列表示预测的类。即:Mij表示GroundTruth类别为i的所有数据中被预测为类别j的数目。

    这里给出两种方法画混淆矩阵。

    方法一:这里采用画图像的办法,绘制混淆矩阵的表示图。颜色越深,值越大。

    # -*- coding: utf-8 -*-
    # By Changxu Cheng, HUST
    
    from __future__ import division
    import numpy as np
    from skimage import io, color
    from PIL import Image, ImageDraw, ImageFont
    import os
    
    def drawCM(matrix, savname):
        # Display different color for different elements
        lines, cols = matrix.shape
        sumline = matrix.sum(axis=1).reshape(lines, 1)
        ratiomat = matrix / sumline
        toplot0 = 1 - ratiomat
        toplot = toplot0.repeat(50).reshape(lines, -1).repeat(50, axis=0)
        io.imsave(savname, color.gray2rgb(toplot))
        # Draw values on every block
        image = Image.open(savname)
        draw = ImageDraw.Draw(image)
        font = ImageFont.truetype(os.path.join(os.getcwd(), "draw/ARIAL.TTF"), 15)
        for i in range(lines):
            for j in range(cols):
                dig = str(matrix[i, j])
                if i == j:
                    filled = (255, 181, 197)
                else:
                    filled = (46, 139, 87)
                draw.text((50 * j + 10, 50 * i + 10), dig, font=font, fill=filled)
        image.save(savname, 'jpeg')
    
    if __name__ == "__main__":
        drawCM(np.random.randint(16, size=16).reshape(4,4), 'tmp.jpg')

    注意:需要用到字体文件。代码中使用的是ARIAL.TTF。这样才可以在图中直接标注出数目。

    某实验结果图如下(不是上述__name__ == "__main__"代码的执行结果)

    方法二:利用matplotlib.pyplot.matshow画图

    from __future__ import division
    import  numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.ticker import MultipleLocator
    
    def plotCM(classes, matrix, savname):
        """classes: a list of class names"""
        # Normalize by row
        matrix = matrix.astype(np.float)
        linesum = matrix.sum(1)
        linesum = np.dot(linesum.reshape(-1, 1), np.ones((1, matrix.shape[1])))
        matrix /= linesum
        # plot
        plt.switch_backend('agg')
        fig = plt.figure()
        ax = fig.add_subplot(111)
        cax = ax.matshow(matrix)
        fig.colorbar(cax)
        ax.xaxis.set_major_locator(MultipleLocator(1))
        ax.yaxis.set_major_locator(MultipleLocator(1))
        for i in range(matrix.shape[0]):
            ax.text(i, i, str('%.2f' % (matrix[i, i] * 100)), va='center', ha='center')
        ax.set_xticklabels([''] + classes, rotation=90)
        ax.set_yticklabels([''] + classes)
        #save
        plt.savefig(savname)

    这种方法可以直接标出坐标轴的含义,比较方便。

     

    展开全文
  • plt.cm.Blues) #按照像素显示出矩阵 plt.title('confusion_matrix') plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes) plt.yticks(tick_marks, classes) thresh ...
  • python 混淆矩阵可视化

    千次阅读 2019-10-01 18:37:11
    python 混淆矩阵 可视化

    混淆矩阵:

    import numpy as np
    confusion = np.random.random([5,5]) + np.eye(5)*2
    confusion = np.dot(np.linalg.inv(np.diag(np.sum(confusion,axis=1))),confusion)
    print(confusion)
    
    '''
    [[0.50927103 0.07041116 0.04753256 0.16553774 0.20724751]
     [0.12732054 0.48133623 0.11226673 0.11855113 0.16052536]
     [0.15031137 0.13009076 0.51994749 0.19008082 0.00956956]
     [0.13469251 0.08813177 0.16790889 0.46202315 0.14724368]
     [0.19405227 0.04245825 0.10221693 0.14392883 0.51734372]]
    '''
    

    标签:

    print(all_categories)
    '''
    ['Arabic', 'Chinese', 'Czech', 'Dutch', 'English']
    '''
    

    可视化:

    # Set up plot
    fig = plt.figure()
    ax = fig.add_subplot(111)
    cax = ax.matshow(confusion)
    fig.colorbar(cax)
    
    # Set up axes
    ax.set_xticklabels([''] + all_categories, rotation=90)
    ax.set_yticklabels([''] + all_categories)
    
    # Force label at every tick
    ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
    ax.yaxis.set_major_locator(ticker.MultipleLocator(1))
    
    # sphinx_gallery_thumbnail_number = 2
    plt.show()
    

    在这里插入图片描述

    展开全文
  • 深度学习自学记录(3)——两种多分类混淆矩阵Python实现(含代码)1、什么是混淆矩阵2、分类模型评价指标3、两种多分类混淆矩阵3.1直接打印出每一个类别的分类准确率。3.2打印具体的分类结果的数值4、总结 1、...
  • 涉及到分类问题,我们经常需要通过可视化混淆矩阵来分析实验结果进而得出调参思路,本文介绍如何利用python绘制混淆矩阵(confusion_matrix),本文只提供代码,给出必要注释。 Code​ # -*-coding:utf-8-*- from ...
  • class ConfusionMatrix: # 对于二分类问题适用 # y_label 原始标签 y_pre 模型预测值 # th 分类阈值 def __init__(self, y_label, y_pre): self.label = y_label.copy() self.pre = y_pre.copy() ...
    class ConfusionMatrix:
        # 对于二分类问题适用
        # y_label 原始标签    y_pre 模型预测值
        # th 分类阈值
        def __init__(self, y_label, y_pre):
            self.label = y_label.copy()
            self.pre = y_pre.copy()
            self.label.shape = (self.label.shape[0],)
            self.pre.shape = (self.pre.shape[0],)
            if self.label.shape[0] != self.pre.shape[0]:
                print('length problem')
    
        def acc(self, th=0.5):  # 精确率、准确率 Accuracy
            y_l = np.zeros(self.label.shape)
            y_l[self.pre > th] = 1
            return self.label[self.label == y_l].shape[0] / self.label.shape[0]
    
        def prec(self, th=0.5):  # 精准率、查准率
            y_l = np.zeros(self.label.shape)
            y_l[self.pre > th] = 1
            denomi = self.label[y_l == 1].shape[0]  # 分母
            return self.label[(self.label == y_l) & (y_l == 1)].shape[0] / denomi if denomi > 0 else 0
    
        def tpr(self, th=0.5):   # 真正例率 所有正样本中 也是常说的召回率 recall
            y_l = np.zeros(self.label.shape)
            y_l[self.pre > th] = 1
            denomi = self.label[self.label == 1].shape[0]
            return self.label[(self.label == y_l) & (self.label == 1)].shape[0] / denomi if denomi > 0 else 0
    
        def tnr(self, th=0.5):  # 真负例率 所有负样本中
            y_l = np.zeros(self.label.shape)
            y_l[self.pre > th] = 1
            denomi = self.label[self.label == 0].shape[0]
            return self.label[(self.label == y_l) & (self.label == 0)].shape[0] / denomi if denomi > 0 else 0
    
        def fpr(self, th=0.5):   # 假正例率 所有负样本中
            return 1 - self.tnr(th)
    
        def fb_score(self, th=0.5, beta=1):  # balanced F Score 默认beta=1为f1_score
            prec = self.prec(th)  # Accuracy
            rec = self.tpr(th)  # recall
            b2 = beta**2  # beta 越大说明越看重recall 既说明漏报的成本更高
            if rec == prec == 0:
                return 0
            else:
                return (1 + b2)*prec*rec/(rec + b2*prec)
    
        def find_max_fb_th(self, beta=1, th_step=0.001):
            # 找到某模型下最大的fb_score以及对应阈值th 需限定F分数的beta值
            # 参照fb_score函数的注释理解
            fb, th, fb_out, th_out = 0, 1, 0, 1
            while th >= 0:
                fb = self.fb_score(th, beta)
                if fb > fb_out:
                    fb_out, th_out = fb, th
                th -= th_step
            return fb_out, th_out
    
        def auc(self):  
            # 一种AUC的计算方式 矩分面积计算法 大致思路:
            #  auc_value为最后输出的面积值,初始值为1,采用排序后样本的结果来抵扣的方式:
            #   按预测值排序sorted_ind,挨个看每个样本置为1,是进入了TP的集合还是FN,
            #   如果是FN扣除相应的面积,如果是TP,则下次扣除的面积会更少(positive_pool变多)
            #   基本面积单位: positive_part negative_part 由正负例的样本数量决定 其实用手画一画ROC的图就蛮好理解了。
            sorted_ind = np.argsort(self.pre)[::-1]
            auc_value, positive_pool = 1, 0
            positive_len, samples_len = self.label[self.label == 1].shape[0], self.label.shape[0]
            negative_len = samples_len - positive_len
            positive_part, negative_part = 1/positive_len, 1/negative_len
            for inx in sorted_ind:
                if self.label[inx] == 1:
                    positive_pool += positive_part
                else:
                    auc_value -= negative_part*(1-positive_pool)
            return auc_value
    
        def status_fb(self, th=0.5):
            acc, prec, tpr, f1 = self.acc(th), self.prec(th), self.tpr(th), self.fb_score(th)
            return f'''Acc:{acc:#.3f}| prec:{prec:#.3f}| recall:{tpr:#.3f}| f1_score:{f1:#.3f}'''

     

    说下我对于偏态分类问题的一种思路,不算成熟:

    1. 训练模型,损失函数依旧MSE,加不加正则,或者结合交叉检验,找到最大(或者比较合适)的AUC停止训练。

    2. 在模型确定的情况下,选取最佳分类阈值,可以参考使用find_max_fb_th,根据偏态实际问题决定beta值,比如检测类问题,可以比较FN和FP的出现成本来定beta。find_max_fb_th 返回最大的F分数和对应的阈值。

     

    上面AUC计算,好像比tensorflow的tf.metrics.auc算的快点,于是就用了。

    有时间再回过头来补充原理说明和其他要点笔记

    展开全文
  • 摘要 在深度学习的分类任务中,对模型的评估或测试...进行二分类或多分类任务中,对于预测的评估经常需要构建一个混淆矩阵来表示测试集预测类与实际类的对应关系,混淆矩阵横坐标表示实际的类,纵坐标表示预测的类。混
  • 衡量一个分类器性能的更好的办法是混淆矩阵。它基于的思想是:计算类别A被分类为类别B的次数。例如在查看分类器将图片5分类成图片3时,我们会看混淆矩阵的第5行以及第3列。 为了计算一个混淆矩阵,我们首先需要有一...
  • 混淆矩阵简介与Python实现

    万次阅读 2018-05-25 20:45:57
    什么是混淆矩阵 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型作出的分类判断两个...对于二分类(正误)问题来说: 参考:http://www.omegaxyz....
  • python环境编程下做多分类问题要画混淆矩阵,复制了网上的代码,但是发现运行显示出来的混淆矩阵和原作者贴出来的不一样,如下左边图所示(截去了坐标标题信息),边界数字都跑到矩形框外边去了,恰好我有两个...
  • python sklearn包——混淆矩阵分类报告等自动生成

    万次阅读 多人点赞 2016-02-29 23:09:59
    应该说这些函数基本上都会用到,像是数据预处理,处理完了后特征提取、降维、训练预测、通过混淆矩阵分类效果,得出报告。 1.输入 从数据集开始,提取特征转化为有标签的数据集,转为向量。拆分成训练集和测试集...
  • 混淆矩阵含义及python代码实现

    千次阅读 2019-12-25 10:32:57
    一、分类评估指标中定义的一些符号含义 ...混淆矩阵定义及表示含义 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇...
  • 混淆矩阵的原理和Python实现实例
  • 1.混淆矩阵 对于二分类问题,可将样例根据其真实类别与分类器预测类别的组合划分为: 真正例(true positive):将一个正例正确判断为正例 假正例(false positive):将一个反例错误判断为正例 真反例(true ...
  • 分类问题中的混淆矩阵 #十分类问题 import matplotlib.pyplot as plt import numpy as np 数据 from sklearn import datasets digits = datasets.load_digits() X = digits.data y = digits.target 分割数据集 ...
  • 现在是直接把代码里的validate部分进行了修改,把tensor类型的数据张量改成了list,再利用python里的confusion_matrix函数进行计算。 分成两个部分,一个是直接用CIFAR-10里的带标签的数据集进行测试,还有一个是...
  • 以遥感图像场景分类为例,采用UC Merced数据集。 一、以ImageNet数据集下的预训练模型,采用ResNet-18网络模型对UCM数据集进行fine-tune。 在数据集训练上,按照一定的train-test比例,这里设置为50%-50%。训练10...
  • 混淆矩阵

    2020-06-10 16:28:29
    混淆矩阵是一个表,经常用来描述分类模型(或“分类器”)在已知真实值的一组测试数据上的性能。混淆矩阵本身比较容易理解,但是相关术语可能会令人混淆。让我们从一个进制分类器的混淆矩阵示例开始...
  • 为了更好的理解下面的话,推荐阅读https://blog.csdn.net/c1z2w3456789/article/details/105247565(PYthon 教你怎么选择SVM的核函数kernel及案例分析),也可以直接跳过前一部分,直接阅读混淆矩阵部分。...
  • 1为黑样本,0为白样本: Counter({1: 105, 0: 95}) check counter!confusion_matrix:[[83 12(预测值为1,实际为0,误报)] [15(预测值为0,实际为1,漏报!...因为样本不均衡的分类器需要着重关注,因此注意下!...
  • 混淆矩阵、查准率和召回率 夏令营时候遇到过混淆矩阵、查准率和召回率的问题,今天看书又回顾到这个问题,个人觉得对这个概念还是需要有非常清醒的认识的,做个记录。 混淆矩阵 假设正例为我有病,那反例就是我没病...
  • 混淆矩阵二分类问题的混淆矩阵以癌症为例,0代表未患病,1代表患病,有10000个人:癌症问题的混淆矩阵精准率和召唤率代码实现scikitlearn中的精准率和召回率调和平均值F1_score调和平均数具有以下几个主要特点:①...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,601
精华内容 1,840
关键字:

python二分类混淆矩阵

python 订阅