精华内容
下载资源
问答
  • 目录混淆矩阵简介基于python matplotlib/sklearn库的混淆矩阵代码实现效果示例代码实现参数讲解 如果不想看前面的介绍可以直接点击目录转到“代码实现”与“参数讲解”部分 混淆矩阵简介 混淆矩阵(confusion matrix...


    如果不想看前面的介绍可以直接点击目录转到“代码实现”与“参数讲解”部分

    混淆矩阵简介

    混淆矩阵(confusion matrix)是一种常用的分类模型评估指标,经可视化的混淆矩阵可以帮助我们直观地了解到模型对各类样本地分类情况。

    对于一个分类模型来说,每一个样本均有两种属性,真实标签与预测标签,记为 y r e a l , y p r e d i c t y_{real}, y_{predict} yreal,ypredict。由此出发我们可以定义混淆矩阵:
    对于 n n n分类模型,混淆矩阵为一 n × n n\times n n×n阶方阵:
    M c = [ m i , j ] n × n M_c=[m_{i,j}]_{n\times n} Mc=[mi,j]n×n
    其第 i i i行第 j j j列元素定义为:
    m i , j = n y r e a l = i , y p r e d i c t = j n y r e a l = i m_{i, j}=\frac{n_{y_{real=i}, y_{predict=j}}} {n_{y_{real=i}}} mi,j=nyreal=inyreal=i,ypredict=j
    即混淆矩阵的第 i i i行第 j j j列为真实标签为 i i i的样本被预测为 j j j类的比例。

    基于python matplotlib/sklearn库的混淆矩阵代码实现

    由于并没有找到现成的绘制混淆矩阵的函数,因此基于matplotlibsklearn库的相关函数自己编写实现混淆矩阵的绘制

    效果示例

    利用39节点电网仿真数据进行,数据共包含5000个样本,每个样本分为不稳定、稳定、潮流不收敛三类,在数据集中分别用0, 1, 2表示。选取支持向量机作为分类模型。
    利用4000个样本组成训练集训练模型,再利用1000个样本组成的测试机对模型性能进行测试,并利用plot_matrix(y_true, y_pred, labels_name)函数将结果绘制为混淆矩阵。
    示例代码如下:

    # 读取数据并划分训练集与测试集
    test_features, test_labels = read_data(ADDRESS)
    feature_train, feature_test, label_train, label_test = train_test_split(test_features, test_labels,
                                                                            test_size=0.2, random_state=0)
    # 利用训练集训练支持向量机模型
    svc = SVC(kernel='rbf')
    svc.fit(feature_train, label_train)
    # 利用训练好的模型对测试集进行分类
    label_test_svc = svc.predict(feature_test)
    
    # 根据真实标签与预测标签绘制混淆矩阵
    plot_matrix(label_test, label_test_svc, [0, 1, 2], title='confusion_matrix_svc',
                axis_labels=['unstable', 'stable', 'non-convergence'])
    

    最终结果如下所示:
    混淆矩阵

    代码实现

    plot_matrix(y_true, y_pred, labels_name)函数如下所示:

    import matplotlib.pyplot as pl
    from sklearn import metrics
    # 相关库
    
    def plot_matrix(y_true, y_pred, labels_name, title=None, thresh=0.8, axis_labels=None):
    # 利用sklearn中的函数生成混淆矩阵并归一化
        cm = metrics.confusion_matrix(y_true, y_pred, labels=labels_name, sample_weight=None)  # 生成混淆矩阵 
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]  # 归一化
    
    # 画图,如果希望改变颜色风格,可以改变此部分的cmap=pl.get_cmap('Blues')处
        pl.imshow(cm, interpolation='nearest', cmap=pl.get_cmap('Blues'))
        pl.colorbar()  # 绘制图例
    
    # 图像标题
        if title is not None:
            pl.title(title)
    # 绘制坐标
        num_local = np.array(range(len(labels_name)))
        if axis_labels is None:
            axis_labels = labels_name
        pl.xticks(num_local, axis_labels, rotation=45)  # 将标签印在x轴坐标上, 并倾斜45度
        pl.yticks(num_local, axis_labels)  # 将标签印在y轴坐标上
        pl.ylabel('True label')
        pl.xlabel('Predicted label')
    
    # 将百分比打印在相应的格子内,大于thresh的用白字,小于的用黑字
        for i in range(np.shape(cm)[0]):
            for j in range(np.shape(cm)[1]):
                if int(cm[i][j] * 100 + 0.5) > 0:
                    pl.text(j, i, format(int(cm[i][j] * 100 + 0.5), 'd') + '%',
                            ha="center", va="center",
                            color="white" if cm[i][j] > thresh else "black")  # 如果要更改颜色风格,需要同时更改此行
    # 显示
        pl.show()
    

    参数讲解

    plot_matrix函数参数包括:
    y_true样本的真实标签,为一向量
    y_pred样本的预测标签,为一向量,与真实标签长度相等
    labels_name样本在数据集中的标签名,如在示例中,样本的标签用0, 1, 2表示,则此处应为[0, 1, 2]

    title=None图片的标题
    thresh=0.8临界值,大于此值则图片上相应位置百分比为白色
    axis_labels=None最终图片中显示的标签名,如在示例中,样本标签用0, 1, 2表示分别表示失稳、稳定与潮流不收敛,我们最终图片中显示后者而非前者,则可令此参数为[‘unstable’, ‘stable’, ‘non-convergence’]

    展开全文
  • 深度学习自学记录(3)——两种多分类混淆矩阵的Python实现(含代码)1、什么是混淆矩阵2、分类模型评价指标3、两种多分类混淆矩阵3.1直接打印出每一个类别的分类准确率。3.2打印具体的分类结果的数值4、总结 1、...
  • 一.混淆矩阵(一).简介在人工智能中,混淆矩阵(confusion ...混淆矩阵是通过将每个实测像元的位置和分类分类图像中的相应位置和分类像比较计算的。混淆矩阵(confusion matrix)刻画一个分类器的分类准确程度。“混...

    一.混淆矩阵

    (一).简介

    在人工智能中,混淆矩阵(confusion matrix)是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵。在图像精度评价中,主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面。混淆矩阵是通过将每个实测像元的位置和分类与分类图像中的相应位置和分类像比较计算的。

    混淆矩阵(confusion matrix)刻画一个分类器的分类准确程度。“混淆”一词也形象地表达了分类器面对多个分类时可能造成的混淆。

    (二).混淆矩阵(Confusion Matrix)举例说明

    混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目。每一列中的数值表示真实数据被预测为该类的数目:如下图,第一行第一列中的43表示有43个实际归属第一类的实例被预测为第一类,同理,第二行第一列的2表示有2个实际归属为第二类的实例被错误预测为第一类。

    举例如下:

    如有150个样本数据,这些数据分成3类,每类50个。分类结束后得到的混淆矩阵为:

    aa2bea1d72d99eee14a520abebb2c278.png 

    每一行之和为50,表示50个样本;

    第一行说明类1的50个样本有43个分类正确,5个错分为类2,2个错分为类3。

    二.混淆矩阵的MATLAB实现

    (一).数据集如下:

    299465b0073fcb70f29c3e604f9b9537.png

    (二).MATLAB实现

    1.confusion_matrix1.m文件(在下面主函数中直接调用)

    %==========================================================

    function confusion_matrix1(act1,det1)

    [mat,order] = confusionmat(act1,det1);

    k=max(order); %k为分类的个数

    %也可作实验,自己随机产生矩阵

    %mat = rand(5); %# A 5-by-5 matrix of random values from 0 to 1

    %mat(3,3) = 0; %# To illustrate

    %mat(5,2) = 0; %# To illustrate

    imagesc(mat); %# Create a colored plot of the matrix values

    colormap(flipud(gray)); %# Change the colormap to gray (so higher values are

    %#black and lower values are white)

    title('不分性别的分开预测标签与真实标签的混淆矩阵');

    textStrings = num2str(mat(:),'%0.02f'); %# Create strings from the matrix values

    textStrings = strtrim(cellstr(textStrings)); %# Remove any space padding

    %% ## New code: ###这里是不显示小矩阵块里的0,用空白代替

    % idx = strcmp(textStrings(:), '0.00');

    % textStrings(idx) = {' '};

    %% ################

    %# Create x and y coordinates for the strings %meshgrid是MATLAB中用于生成网格采样点的函数

    [x,y] = meshgrid(1:k);

    hStrings=text(x(:),y(:),textStrings(:),'HorizontalAlignment','center');

    midValue = mean(get(gca,'CLim')); %# Get the middle value of the color range

    textColors = repmat(mat(:) > midValue,1,3); %# Choose white or black for the

    %# text color of the strings so

    %# they can be easily seen over

    %# the background color

    %将矩阵[mat(:) >midValue]复制1X3块的矢量(颜色值必须为包含3个元素的数值矢量),即把矩阵[mat(:) > midValue]作为矩阵textColors的元素。

    set(hStrings,{'Color'},num2cell(textColors,2)); %# Change the text colors;

    %num2cell(textColors, 2)中2 代表「直行被切割」将结构阵列转换成异质阵列 将结构阵列转换成异质阵列;

    %然后set去重后放在hStrings;

    %下面这个数字8可根据自己的分类需求进行更改

    set(gca,'XTick',1:8,...

    'XTickLabel',{'1','2','3','4','5','6','7',8'},... %# and tick labels

    'YTick',1:8,... %同上

    'YTickLabel',{'1','2','3','4','5','6','7',8'},...

    'TickLength',[0 0]);

    %==========================================================

    2.主函数main.m

    a=xlsread('confusion_test.xls');

    %========================================

    %真实标签:

    act=a(1:194,2:2);

    act1=act';

    %性别为男生的分开预测的标签

    det=a(1:194,1:1);

    det1=det';

    %性别为男生的未分开预测的标签

    dett=a(1:194,3:3);

    dett1=dett';

    %这里调用confusion_matrix1()函数求的是‘性别为男生的分开预测的标签与真真实标签的混淆矩阵’

    confusion_matrix1(act1,det1)

    %==========================================================

    注意:

    ctual:就是我们已知的label。

    detected是我们通过模型预测得到的label

    结合下面语句实现:

    [pred,acc,preb] = svmpredict(double(testLabel), testData, model, '-b 1');

    上述程序只需要在confusion_matrix1.m文件中将含有(act1,det1)的参数改成自己需要求的参数,然后在主程序中调用此函数就OK了!(代码可复制直接运行)

    3.运行结果:

    0967b96aa17ed66c50d0059a13700b62.png

    展开全文
  • 分类结果画混淆矩阵 采用matlab实现。
  • 注:有些markdown语法没渲染出来,可以简书查看:scikit-learn 多分类混淆矩阵 前面 sklearn.metrics.multilabel_confusion_matrix 是 scikit-learn 0.21 新增的一个函数。看名字可知道是用来计算标签的混淆矩阵的...

    注:有些markdown语法没渲染出来,可以简书查看:scikit-learn 多分类混淆矩阵

    前面

    sklearn.metrics.multilabel_confusion_matrixscikit-learn 0.21 新增的一个函数。看名字可知道是用来计算多标签的混淆矩阵的。不过也可以用它来计算多分类的混淆矩阵。MCM将多分类数据转化为2分类问题,采用one-vs-rest策略,即某一类为正样本,其余类别为负样本。每一类都作为正样本,计算混淆矩阵。按标签的顺序返回所有。
    MCM 返回的每一个二分类混淆矩阵中,TN 在 [0, 0] ,FN 在 [1, 0] , TP 在[1,1], FP 在 [0, 1] , 即
    | TN | FP |
    |--|--|
    | FN | TP |

    官方例子

    ## 如果导入报错,检查一下 sk-learn version >= 0.21
    >>> from sklearn.metrics import multilabel_confusion_matrix
    >>> y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]
    >>> y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]
    >>> mcm = multilabel_confusion_matrix(y_true, y_pred,
    ...                             labels=["ant", "bird", "cat"])
    >>> mcm
    array([[[3, 1],
            [0, 2]],
           [[5, 0],
            [1, 0]],
           [[2, 1],
            [1, 2]]])

    以第一个类别 ‘ant’ 为例,预测对的有2个,它的负样本,'bird' 和 'cat' 预测对的有3个(‘bird’ 预测成 ‘cat’, 也算对的,因为它们是一类,都是负样本。)负样本预测成正样本的有一个。

    评估指标

    每一类的TP, FP等可以提取通过:

    >>> tp = mcm[:, 1, 1]
    >>> tn = mcm[:, 0, 0]
    >>> fn = mcm[:, 1, 0]
    >>> tp, tn
    (array([2, 0, 2], dtype=int64), array([3, 5, 2], dtype=int64))

    这里有几个常用的评估指标:

    1. 敏感性(sensitivity)也叫召回率(recall),也叫查全率。这个指标是看一下正样本中预测对的占总正样本的比例。也可以说成预测器对正样本的敏感性,越大,说明预测器对正样本越敏感。
      $$ sn=\frac{tp}{tp+fn} $$
    2. 特异性(specificity)这个和敏感性相反,敏感性算正样本的,而特异性算的是负样本的。换句话说,它是指负样本的敏感性。毕竟你的预测器,不能仅仅是对正样本敏感,负样本,就随意了。所以需要评估一下预测器对负样本的敏感性。
      $$sp=\frac{tn}{tn+fp}$$
    3. 查准率(precision), 这是看你预测为正样本中预测正确的占总的预测为正样本的比例。
      $$precision=\frac{tp}{tp+fp}$$
    4. f1值,一般而言,查全率和查准率是不能同时都很大的。举个例子:你现在有100个A和100个B,你用现在训练好的模型去预测A,预测到有80个A。但是这其中75个是正确的A。也就是说查准率是$75/80=0.9375%$,查全率是$75/100=0.75$。你觉得查全率太低,你继续改进模型。又进行了一次预测,这次预测到了95个A。其中预测正确的有85个,即查全率:$85/100=0.85$,增加了0.1,但是查准率:$85/95=0.895$下降了。你想查得越多,就更容易产生误差。为了照顾两头,使得两个指标都有不错得值,就有了f1值:
      $$F1 = \frac{2 * (precision * recall)}{ (precision + recall)}$$

    很容易通过代码获得多分类中每一类的评价指标值:

    >>> sn = tp / (tp + fn) ## 其它同理
    >>> sn
     array([1.        , 0.        , 0.66666667])x xz

    利用one-vs-rest将多分类转化为二分类问题时,往往会丢失一些信息。在负样本中有多个类别,但不管在负样本中否预测到其本身的标签,只要不是预测为正样本标签就是正确的。所以不能很好的评价rest里的预测效果。想要更好的评价多分类,应考虑下宏平均或者微平均。

    参考

    sklearn.metrics.multilabel_confusion_matrix

    原文:scikit-learn 多分类混淆矩阵

    转载于:https://www.cnblogs.com/huanping/p/10959271.html

    展开全文
  • from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plt import numpy as np def plot_confusion_matrix(cm, result_path, title='Confusion Matrix'): plt.figure(figsize=(4... # 在混淆.
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt
    import numpy as np
    
    def plot_confusion_matrix(cm, result_path, title='Confusion Matrix'):
    
        plt.figure(figsize=(4, 4), dpi=300)
        np.set_printoptions(precision=2)
    
        # 在混淆矩阵中每格的概率值
        ind_array = np.arange(len(classes))
        x, y = np.meshgrid(ind_array, ind_array)
        for x_val, y_val in zip(x.flatten(), y.flatten()):
            c = cm[y_val][x_val]
            plt.text(x_val, y_val, "%0.2f" % (c,), color="white"  if c > cm.max()/2 else "black", fontsize=10, va='center', ha='center')
        
        plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
        plt.title(title)
        plt.colorbar()
        xlocations = np.array(range(len(classes)))
        plt.xticks(xlocations, classes)
        plt.yticks(xlocations, classes)
        plt.ylabel('Ground trurh')
        plt.xlabel('Predict')
        
        # offset the tick
        tick_marks = np.array(range(len(classes))) + 0.5
        plt.gca().set_xticks(tick_marks, minor=True)
        plt.gca().set_yticks(tick_marks, minor=True)
        plt.gca().xaxis.set_ticks_position('none')
        plt.gca().yaxis.set_ticks_position('none')
        plt.grid(True, which='minor', color="gray", linestyle='-')
        plt.gcf().subplots_adjust(bottom=0.05)
    
      
        # show confusion matrix
        plt.savefig(result_path[:-4]+'.png', format='png')
        plt.show()
    
    classes = ['M0', 'M1', 'M2']
    
    random_numbers = np.random.randint(3, size=50)  # 6个类别,随机生成50个样本
    y_true = random_numbers.copy()  # 样本实际标签
    random_numbers[:10] = np.random.randint(3, size=10)  # 将前10个样本的值进行随机更改
    y_pred = random_numbers  # 样本预测标签
    
    
    result_paths=['DL_train.csv', 'DLC_train.csv','DL_test.csv', 'DLC_test.csv']
    
    for result_path in result_paths:
        with open(result_path, 'r') as f:
            result_list = f.read()
        
        result_list = result_list.split('\n')[1:-1]
        result_list = [result.split(',') for result in result_list]
            
        
        id_list = [int(result[0]) for result in result_list]
        y = np.array([float(result[1]) for result in result_list])
        p = np.array([float(result[2]) for result in result_list])
        
        p[p<0.5]=0
        p[(p>0.5)*(p<1.5)]=1
        p[p>1.5]=2
    
    
        cm = confusion_matrix(y, p)
        plot_confusion_matrix(cm, result_path, title='Confusion matrix',)
        
        print(result_path, (cm[0,0]+cm[1,1]+cm[2,2])/cm.sum())
    

     

    展开全文
  • 目标分类混淆矩阵After training a machine learning classifier, the next step is to evaluate its performance using relevant metric(s). The confusion matrix is one of the evaluation metrics. 训练完...
  • 分类器的混淆矩阵 介绍 (Introduction) A confusion matrix is a visual way to inspect the performance of a classification model. Metrics such as accuracy can be inadequate in cases where there are ...
  • matlab 混淆矩阵 代码示例

    千次阅读 2020-07-03 16:43:53
    参考自以下大佬的博客: ... %混淆矩阵y轴标签的位置长度遍历 混淆矩阵
  • 分类任务,在最后的实验部分需要画混淆矩阵,来说明实验的结果。 import matplotlib.pyplot as plt guess = ["normal","cancer"] fact = [ "normal","cancer"] classes = list(set(fact)) classes.sort...
  • 多分类问题中的混淆矩阵    具体代码见 67 多分类问题中的混淆矩阵.ipynb
  • 这是为代码“all_data_classification.m”分类的图像生成混淆矩阵代码。 通过使用训练区域“5_class_test.csv”和图像“all_class.csv”将其分为5个类。 借助混淆矩阵,可以计算分类准确度。
  • 测试集真实标签,预测标签提取及多分类模型混淆矩阵绘制(Python) 思路: 用keras中的ImageDataGenerator获取数据集,提取所有样本的名字(包含上级目录名称),只保留上级目录名称作为数据集真实标签;将数据集通过...
  • 混淆矩阵-MATLAB代码详解

    千次阅读 2019-09-29 09:48:11
    一.混淆矩阵 (一).简介在人工智能中,混淆矩阵(confusion matrix)是...混淆矩阵是通过将每个实测像元的位置和分类分类图像中的相应位置和分类像比较计算的。混淆矩阵(confusion matrix)刻画一个分类器的...
  • 混淆矩阵的MATLAB源代码,直接能用的代码,可以用来计算分类结果的准确率还能度量划分效果,混淆矩阵的概念虽然简单,但需要注意的点特别,看此代码,绝对复制过去就能用!
  • 混淆矩阵1.1 二分类混淆矩阵1.2 混淆矩阵计算实例2. 混淆矩阵代码3. 混淆矩阵用途 深度学习之图像分类(一)分类模型的混淆矩阵 今天开始学习深度学习图像分类模型Backbone理论知识,首先学习分类模型的混淆矩阵,...
  • Matlab画混淆矩阵多分类

    千次阅读 2020-12-09 16:52:13
    在神经网络和机器学习的结果分析中,常常会用混淆矩阵和ROC曲线来分析识别/分类结果的好坏,而且论文中也经常出现这种图。对于卷积神经网络来说画混淆矩阵很简单,要用到函数plotconfusion,格式为plotconfusion...
  • 语义分割多分类混淆矩阵计算MIoU、Recall、Precision、F1、OA 待更新
  • 混淆矩阵含义及python代码实现

    千次阅读 2019-12-25 10:32:57
    一、分类评估指标中定义的一些符号含义 TP:将正类预测为正类数,...混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇...
  • sklearn多分类问题中的混淆矩阵

    千次阅读 2019-03-02 12:08:30
    多分类问题中的混淆矩阵 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets digits = datasets.load_digits() X = digits.data y = digits.target from sklearn.model_selection...
  • 衡量一个分类器性能的更好的办法是混淆矩阵。它基于的思想是:计算类别A被分类为类别B的次数。例如在查看分类器将图片5分类成图片3时,我们会看混淆矩阵的第5行以及第3列。 为了计算一个混淆矩阵,我们首先需要有一...
  • 混淆矩阵

    2019-06-28 10:32:50
    在机器学习中尤其是统计分类中,混淆矩阵(confusion matrix),也被称为错误矩阵(error matrix)。 矩阵的每一列表达了分类器对于样本的类别预测,二矩阵的每一行则表达了版本所属的真实类别 之所以叫做’混淆...
  • 这里写目录标题1. 混淆矩阵介绍二级目录三级目录2. 代码实现 1. 混淆矩阵介绍 二级目录 三级目录 2. 代码实现
  • 比如说类别文类问题,那么每一个类别分到其他类别都有一些数据,但是分到自己类别的毕竟,这样计算百分比之后就形成了一个矩阵,如果分类正确率高的话,那么对角线上的元素的值,也就是自己到自己的那一部分,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,674
精华内容 3,069
关键字:

多分类混淆矩阵代码