精华内容
下载资源
问答
  • 多分类ROC曲线

    万次阅读 2019-02-14 11:13:38
    一个分类模型(分类器)是一个将某个实例映射到一个特定类的过程.分类器的结果可以是给出该实例所属的类别,也可以给定该实例属于某个类别的概率。 首先来考虑一个两类预测问题(双分类器),其结果要么是真(p)要么是假...

    转自
    https://blog.csdn.net/xyz1584172808/article/details/81839230

    1 基本概念

    一个分类模型(分类器)是一个将某个实例映射到一个特定类的过程.分类器的结果可以是给出该实例所属的类别,也可以给定该实例属于某个类别的概率。
    首先来考虑一个两类预测问题(双分类器),其结果要么是真(p)要么是假(n).在双分类器中有4类可能的输出.如果输出的预测是p而真实的结果也是p,那么这就叫做真阳性(TP);然而如果真实的结果是n,则这就叫做假阳性(FP).相反的来说,一个真阴性发生在预测结果和实际结果都为n的时候,而假阴性是当预测输出是n而实际值是p的时候,这几种情况可以用下面的矩阵来组织。
    分类情况
    举一个现实世界中的恰当的例子,考虑一个检测一个人是否得一种病的测试.一个假阳性就是一个人被测试是有这种病的,但实际却没有的情况.一个假阴性就是一个人被测试是健康的,但实际却是得病的情况。
    上面那个矩阵就称为混淆矩阵:
    混淆矩阵
    由图中公式可知各个指标的含义:
    precision:预测为对的当中,原本为对的比例(越大越好,1为理想状态)
    recall:原本为对的当中,预测为对的比例(越大越好,1为理想状态)
    F-measure:F度量是对准确率和召回率做一个权衡(越大越好,1为理想状态,此时precision为1,recall为1)
    accuracy:预测对的(包括原本是对预测为对,原本是错的预测为错两种情形)占整个的比例(越大越好,1为理想状态)
    fp rate:原本是错的预测为对的比例(越小越好,0为理想状态)
    tp rate:原本是对的预测为对的比例(越大越好,1为理想状态)
    在了解了上述的一些指标的含义以及计算公式后,接下来就可以进入ROC曲线了。
    如下示例图中,曲线的横坐标为false positive rate(FPR),纵坐标为true positive rate(TPR)。
    ROC曲线示例
    要生成一个ROC曲线,只需要真阳性率(TPR)和假阳性率(FPR)。TPR决定了一个分类器或者一个诊断测试在所有阳性样本中能正确区分的阳性案例的性能.而FPR是决定了在所有阴性的样本中有多少假阳性的判断. ROC曲线中分别将FPR和TPR定义为x和y轴,这样就描述了真阳性(获利)和假阳性(成本)之间的博弈.而TPR就可以定义为灵敏度,而FPR就定义为1-特异度,因此ROC曲线有时候也叫做灵敏度和1-特异度图像.每一个预测结果在ROC曲线中以一个点代表.
    有了ROC曲线后,可以引出AUC的含义:ROC曲线下的面积(越大越好,1为理想状态)

    2 ROC曲线图中的特殊点和线

    (1)ROC曲线图中的四个点

    第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false positive)=0。这是一个完美的分类器,它将所有的样本都正确分类。第二个点,(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。类似的,第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,,ROC曲线越接近左上角,该分类器的性能越好。

    (2)ROC曲线图中的一条特殊线

    考虑ROC曲线图中的虚线y=x上的点。这条对角线上的点其实表示的是一个采用随机猜测策略的分类器的结果,例如(0.5,0.5),表示该分类器随机对于一半的样本猜测其为正样本,另外一半的样本为负样本。

    3 如何画ROC曲线

    对于一个特定的分类器和测试数据集,每一个实例都会得到一个分类结果,通过统计,利用上述公式,可以得到一组FPR和TPR结果,而要得到一个曲线,实际上需要一系列FPR和TPR的值。那么这一系列值是怎么构造出来的呢?
    在ROC曲线的定义中,有“as its discrimination threshold is varied.”这样一句话,而在本文最开始也提到了分类器的结果可以是“概率输出”,即表示分类器认为某个样本具有多大的概率属于正样本(或负样本),于是如果设置不同的threshold,那么分类结果就会有所变动,因此可以得到一系列FPR和TPR的值。
    接下来就是利用python实现ROC曲线,sklearn.metrics有roc_curve, auc两个函数,本文主要就是通过这两个函数实现二分类和多分类的ROC曲线。

    fpr, tpr, thresholds  =  roc_curve(y_test, scores) 
    • 1

    其中y_test为测试集的结果,scores为模型预测的测试集得分(注意:通过decision_function(x_test)计算scores的值);fpr,tpr,thresholds 分别为假正率、真正率和阈值。(应该是不同阈值下的真正率和假正率)。

    roc_auc =auc(fpr, tpr) 
    • 1

    其中roc_auc为计算的acu的值。

    (1)二分类问题中的ROC曲线

    本实例中的数据来源于sklearn中的鸢尾花(iris)数据,代码来源于LZ_Zack的博客,在最后参考链接里面会给出原博客的链接。

    # -*- coding: utf-8 -*-
    
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import svm, datasets
    from sklearn.metrics import roc_curve, auc  ###计算roc和auc
    from sklearn import cross_validation
    
    # Import some data to play with
    iris = datasets.load_iris()
    X = iris.data
    y = iris.target
    
    ##变为2分类
    X, y = X[y != 2], y[y != 2]
    
    # Add noisy features to make the problem harder
    random_state = np.random.RandomState(0)
    n_samples, n_features = X.shape
    X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
    
    # shuffle and split training and test sets
    X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=.3,random_state=0)
    
    # Learn to predict each class against the other
    svm = svm.SVC(kernel='linear', probability=True,random_state=random_state)
    
    ###通过decision_function()计算得到的y_score的值,用在roc_curve()函数中
    y_score = svm.fit(X_train, y_train).decision_function(X_test)
    
    # Compute ROC curve and ROC area for each class
    fpr,tpr,threshold = roc_curve(y_test, y_score) ###计算真正率和假正率
    roc_auc = auc(fpr,tpr) ###计算auc的值
    
    plt.figure()
    lw = 2
    plt.figure(figsize=(10,10))
    plt.plot(fpr, tpr, color='darkorange',
             lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) ###假正率为横坐标,真正率为纵坐标做曲线
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic example')
    plt.legend(loc="lower right")
    plt.show()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    该实例的ROC图如下所示:
    二分类的ROC曲线

    (2)多分类问题中的ROC曲线

    对于多分类问题,ROC曲线的获取主要有两种方法:
    假设测试样本个数为m,类别个数为n。在训练完成后,计算出每个测试样本的在各类别下的概率或置信度,得到一个[m, n]形状的矩阵P,每一行表示一个测试样本在各类别下概率值(按类别标签排序)。相应地,将每个测试样本的标签转换为类似二进制的形式,每个位置用来标记是否属于对应的类别(也按标签排序,这样才和前面对应),由此也可以获得一个[m, n]的标签矩阵L。
    ①方法一:每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每一列,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从而绘制出一条ROC曲线。这样总共可以绘制出n条ROC曲线。最后对n条ROC曲线取平均,即可得到最终的ROC曲线。
    ②方法二:
    首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。基于这两点,将标签矩阵L和概率矩阵P分别按行展开,转置后形成两列,这就得到了一个二分类的结果。所以,此方法经过计算后可以直接得到最终的ROC曲线。
    上面的两个方法得到的ROC曲线是不同的,当然曲线下的面积AUC也是不一样的。 在python中,方法1和方法2分别对应sklearn.metrics.roc_auc_score函数中参数average值为’macro’和’micro’的情况。下面参考sklearn官网提供的例子,对两种方法进行实现。

    # 引入必要的库
    import numpy as np
    import matplotlib.pyplot as plt
    from itertools import cycle
    from sklearn import svm, datasets
    from sklearn.metrics import roc_curve, auc
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import label_binarize
    from sklearn.multiclass import OneVsRestClassifier
    from scipy import interp
    
    # 加载数据
    iris = datasets.load_iris()
    X = iris.data
    y = iris.target
    # 将标签二值化
    y = label_binarize(y, classes=[0, 1, 2])
    # 设置种类
    n_classes = y.shape[1]
    
    # 训练模型并预测
    random_state = np.random.RandomState(0)
    n_samples, n_features = X.shape
    
    # shuffle and split training and test sets
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,random_state=0)
    
    # Learn to predict each class against the other
    classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,
                                     random_state=random_state))
    y_score = classifier.fit(X_train, y_train).decision_function(X_test)
    
    # 计算每一类的ROC
    fpr = dict()
    tpr = dict()
    roc_auc = dict()
    for i in range(n_classes):
        fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
        roc_auc[i] = auc(fpr[i], tpr[i])
    
    # Compute micro-average ROC curve and ROC area(方法二)
    fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
    roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
    
    # Compute macro-average ROC curve and ROC area(方法一)
    # First aggregate all false positive rates
    all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))
    # Then interpolate all ROC curves at this points
    mean_tpr = np.zeros_like(all_fpr)
    for i in range(n_classes):
        mean_tpr += interp(all_fpr, fpr[i], tpr[i])
    # Finally average it and compute AUC
    mean_tpr /= n_classes
    fpr["macro"] = all_fpr
    tpr["macro"] = mean_tpr
    roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])
    
    # Plot all ROC curves
    lw=2
    plt.figure()
    plt.plot(fpr["micro"], tpr["micro"],
             label='micro-average ROC curve (area = {0:0.2f})'
                   ''.format(roc_auc["micro"]),
             color='deeppink', linestyle=':', linewidth=4)
    
    plt.plot(fpr["macro"], tpr["macro"],
             label='macro-average ROC curve (area = {0:0.2f})'
                   ''.format(roc_auc["macro"]),
             color='navy', linestyle=':', linewidth=4)
    
    colors = cycle(['aqua', 'darkorange', 'cornflowerblue'])
    for i, color in zip(range(n_classes), colors):
        plt.plot(fpr[i], tpr[i], color=color, lw=lw,
                 label='ROC curve of class {0} (area = {1:0.2f})'
                 ''.format(i, roc_auc[i]))
    
    plt.plot([0, 1], [0, 1], 'k--', lw=lw)
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Some extension of Receiver operating characteristic to multi-class')
    plt.legend(loc="lower right")
    plt.show()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    画出的ROC曲线如下图所示。
    多分类的ROC曲线
    如果是只需画出具体的某一类的ROC曲线,只需要修改下画图代码即可。

    plt.figure()
    lw = 2
    plt.plot(fpr[2], tpr[2], color='darkorange',
             lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic example')
    plt.legend(loc="lower right")
    plt.show()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    画出的ROC曲线如下图所示。
    ROC曲线

    4 参考文献

    【1】(Fawcett, 2006),Fawcett, T. (2006). An introduction to ROC analysis. Pattern recognition letters, 27(8), 861-874.
    【2】Davis, J., & Goadrich, M. (2006, June). The relationship between Precision-Recall and ROC curves. In Proceedings of the 23rd international conference on Machine learning (pp. 233-240). ACM.
    【3】ROC和AUC介绍以及如何计算AUC
    【4】ROC曲线、AUC、Precision、Recall、F-measure理解及Python实现
    【5】ROC曲线
    【6】多分类下的ROC曲线和AUC
    【7】用Python画ROC曲线

    展开全文
  • 多分类ROC曲线及AUC计算

    千次阅读 2020-06-04 01:47:57
    上一篇博客(https://blog.csdn.net/u010505915/article/details/106394765)介绍了二分类下的ROC曲线及AUC计算,本文主要介绍多分类下的ROC曲线及AUC计算。 对于多分类数据,假设测试样本个数为m,分类个数为n...

    上一篇博客(https://blog.csdn.net/u010505915/article/details/106394765)介绍了二分类下的ROC曲线及AUC计算,本文主要介绍多分类下的ROC曲线及AUC计算。

    对于多分类数据,假设测试样本个数为m,分类个数为n(分类label分别为:1,2,...,n),可以将这些样本及对应的label表示为矩阵形式,每行一个样本,每列为该样本是否属于该分类,从而形成一个[m, n]的标签矩阵:

    ID 分类1 分类2 分类3
    A 1 0 0
    B 0 0 1
    C 0 1 0
    D 0 0 1

    模型预测完成后,会计算出测试样本在各个分类下的概率,模型预测得分也能用一个[m, n]的矩阵表示,每一行表示样本在各个类别下的概率,记该矩阵为P。

    ID 分类1 分类2 分类3
    A 0.8 0.15 0.05
    B 0.2 0.3 0.5
    C 0.3 0.6 0.1
    D 0.2 0.1 0.7

    多分类下画ROC曲线有两种方法:

    方法1:对每种类别,都可以从矩阵P中得到m个测试样本在该分类下的打分(矩阵P中的列),从矩阵L中获取样本的类别,从而形成一个类似二分类的得分矩阵,以上图为例,分类1 的矩阵为:

    ID label score
    A 1 0.8
    B 0 0.2
    C 0 0.3
    D 0 0.2

    按二分类中画ROC曲线的方法,根据以上矩阵,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从而画出一条ROC曲线。

    对每一个类别,可以画出一条ROC曲线,总共可以画出n条ROC曲线。最后对这n条ROC曲线取平均值,即可得到最终的ROC曲线。

    在python中,该方法对于sklearn里sklearn.metrics.roc_auc_score函数中参数average值为'macro'的情况。

    方法2:对于一个测试样本:

    (1)标签由0和1组成,1的位置表明了它的类别,0表示其他类别。1对应二分类问题中的“正”,0对应“负”

    (2)如果模型对该样本分类正确,则该样本在标签矩阵L中1对应的位置在概率矩阵P中的值,即为模型预测该分类的概率值。

    基于以上两点,将标签矩阵L和概率矩阵P分别按行展开(即sklearn里的ravel()函数),然后转置形成两列,这就得到了一个二分类结果,根据结果直接画出ROC曲线。

    在python中,该方法对于sklearn里sklearn.metrics.roc_auc_score函数中参数average值为'micro'的情况。

    代码示例:

    #-*-coding:utf-8-*-
    
    import numpy as np
    import matplotlib.pyplot as plt
    from itertools import cycle
    from sklearn.metrics import roc_curve, auc
    from scipy import interp
    
    y_label = np.array([
    [1, 0, 0], [1, 0, 0], [1, 0, 0],
    [0, 1, 0], [0,  1, 0], [0, 1, 0],
    [0, 0, 1], [0, 0, 1], [0, 0, 1]
    ])
    
    y_score = np.array([
    [0.8, 0.1, 0.1], [0.2, 0.32, 0.48], [0.6, 0.1, 0.3],
    [0.2, 0.5, 0.3], [0.1, 0.6, 0.3], [0.2, 0.75, 0.05],
    [0.05, 0.05, 0.9], [0.1, 0.3, 0.6], [0.12, 0.8, 0.08],
    ])
    
    n_classes = 3
    
    # 计算每一类的ROC
    fpr = dict()
    tpr = dict()
    roc_auc = dict()
    for i in range(n_classes):
        fpr[i], tpr[i], _ = roc_curve(y_label[:, i], y_score[:, i])
        roc_auc[i] = auc(fpr[i], tpr[i])
    
    # micro(方法二)
    fpr["micro"], tpr["micro"], _ = roc_curve(y_label.ravel(), y_score.ravel())
    roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
    
    # macro(方法一)
    # First aggregate all false positive rates
    all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))
    # Then interpolate all ROC curves at this points
    mean_tpr = np.zeros_like(all_fpr)
    for i in range(n_classes):
        mean_tpr += interp(all_fpr, fpr[i], tpr[i])
    # Finally average it and compute AUC
    mean_tpr /= n_classes
    fpr["macro"] = all_fpr
    tpr["macro"] = mean_tpr
    roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])
    
    # Plot all ROC curves
    lw=2
    plt.figure()
    plt.plot(fpr["micro"], tpr["micro"],
             label='micro-average ROC curve (area = {0:0.2f})'
                   ''.format(roc_auc["micro"]),
             color='deeppink', linestyle=':', linewidth=4)
    
    plt.plot(fpr["macro"], tpr["macro"],
             label='macro-average ROC curve (area = {0:0.2f})'
                   ''.format(roc_auc["macro"]),
             color='navy', linestyle=':', linewidth=4)
    
    colors = cycle(['aqua', 'darkorange', 'cornflowerblue'])
    for i, color in zip(range(n_classes), colors):
        plt.plot(fpr[i], tpr[i], color=color, lw=lw,
                 label='ROC curve of class {0} (area = {1:0.2f})'
                 ''.format(i, roc_auc[i]))
    
    plt.plot([0, 1], [0, 1], 'k--', lw=lw)
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('multi-calss ROC')
    plt.legend(loc="lower right")
    plt.show()

    ROC曲线:

     

    参考文献:

    https://blog.csdn.net/u011047955/article/details/87259052

    展开全文
  • 多分类ROC曲线-宏平均

    千次阅读 2019-10-30 14:09:31
    ROC原理介绍及利用python实现二分类多分类ROC曲线 注:宏平均指n条ROC曲线的平均。根据all_fpr(代表横坐标值,所以去除重复并排序),当前类的fpr和tpr决定的当前类的ROC曲线,利用interp函数对fpr中相对all_...

    ROC原理介绍及利用python实现二分类和多分类的ROC曲线

    注:宏平均指n条ROC曲线的平均。根据all_fpr(代表横坐标值,所以去除重复并排序),当前类的fpr和tpr决定的当前类的ROC曲线,利用interp函数对fpr中相对all_fpr不存在的横坐标进行插值(横向顶点间的纵坐标值相等),得到插值后的tpr(与all_fpr等长),对n类插值后的tpr求和取平均得到mean_tpr,最后根据all_fpr和mean_fpr画出最终的ROC曲线。

    展开全文
  • 深度学习 多分类roc曲线的绘制

    千次阅读 2019-10-30 09:12:25
    对于多分类问题,ROC曲线的获取主要有两种方法: 假设测试样本个数为m,类别个数为n。在训练完成后,计算出每个测试样本的在各类别下的概率或置信度,得到一个[m, n]形状的矩阵P,每一行表示一个测试样本在各类别下...

    对于多分类问题,ROC曲线的获取主要有两种方法: 
    假设测试样本个数为m,类别个数为n。在训练完成后,计算出每个测试样本的在各类别下的概率或置信度,得到一个[m, n]形状的矩阵P,每一行表示一个测试样本在各类别下概率值(按类别标签排序)。相应地,将每个测试样本的标签转换为类似二进制的形式,每个位置用来标记是否属于对应的类别(也按标签排序,这样才和前面对应),由此也可以获得一个[m, n]的标签矩阵L。 
    ①方法一:每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每一列,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从而绘制出一条ROC曲线。这样总共可以绘制出n条ROC曲线。最后对n条ROC曲线取平均,即可得到最终的ROC曲线。 
    ②方法二: 
    首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。基于这两点,将标签矩阵L和概率矩阵P分别按行展开,转置后形成两列,这就得到了一个二分类的结果。所以,此方法经过计算后可以直接得到最终的ROC曲线。 
    上面的两个方法得到的ROC曲线是不同的,当然曲线下的面积AUC也是不一样的。 在python中,方法1和方法2分别对应sklearn.metrics.roc_auc_score函数中参数average值为’macro’和’micro’的情况。下面参考sklearn官网提供的例子,对两种方法进行实现。

     

    上代码:

    # # 绘制roc曲线  # #
    y_test_one_hot = label_binarize(y_test_cls, np.arange(3))   # 将标签二值化
    y_predict_one_hot = y_logits_cls
    
    plt.figure()
    # 绘图
    mpl.rcParams['font.sans-serif'] = u'SimHei'
    mpl.rcParams['axes.unicode_minus'] = False
    # FPR就是横坐标,TPR就是纵坐标
    # 计算ROC
    fpr_dict, tpr_dict, roc_auc = dict(), dict(), dict()
    for i in range(3):  # 计算每一个标签的假正例率(fpr)和真正例率(tpr)
        fpr_dict[i], tpr_dict[i], _ = roc_curve(y_test_one_hot[:, i], y_predict_one_hot[:, i])
        roc_auc[i] = auc(fpr_dict[i], tpr_dict[i])
    # 两种画法:
    # 方法一:将所有的标签进行二值化处理后,如[[0,0,1],[0,1,0]] 转成[0,0,1,0,1,0] 转成二分类进行求解
    fpr_dict["micro"], tpr_dict["micro"], _ = roc_curve(y_test_one_hot.ravel(),
                                                        y_predict_one_hot.ravel())
    roc_auc["micro"] = auc(fpr_dict["micro"], tpr_dict["micro"])
    
    # # 方法二: 将每个标签的fpr和tpr进行累加除以种类数,即画出平均后的roc曲面
    # n_classes = 3
    # from scipy import interp
    # all_fpr = np.unique(np.concatenate([fpr_dict[i] for i in range(n_classes)]))
    # # Then interpolate all ROC curves at this points
    # mean_tpr = np.zeros_like(all_fpr)
    # for i in range(n_classes):
    #     mean_tpr += interp(all_fpr, fpr_dict[i], tpr_dict[i])
    # # Finally average it and compute AUC
    # mean_tpr /= n_classes
    # fpr_dict["macro"] = all_fpr
    # tpr_dict["macro"] = mean_tpr
    # roc_auc["macro"] = auc(fpr_dict["macro"], tpr_dict["macro"])
    # print(roc_auc)
    
    
    # 显示到当前界面,保存为svm.png
    lw = 2
    # plt.plot(fpr_dict[2], tpr_dict[2], color='darkorange',  # 画关于正面的roc曲面
    #          lw=lw, label='ROC curve (area = %0.3f)' % roc_auc["micro"])
    plt.plot(fpr_dict["micro"], tpr_dict["micro"], color='darkorange',
             lw=lw, label='ROC curve (area = %0.3f)' % roc_auc["micro"])
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.0])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic example')
    plt.legend(loc="lower right")
    plt.title(u'text_rnnROC和AUC', fontsize=17)
    path = os.path.join(file_path, "img")
    if not os.path.exists(path): os.makedirs(path)
    plt.savefig(os.path.join(file_path, "img", "{}的ROC和AUC.png".format("model_" + str(config.model_num) + "_")))
    展开全文
  • sklearn 绘制多分类ROC曲线

    千次阅读 2019-06-14 14:08:30
    from rasa_nlu.model import Interpreter from sklearn.metrics import precision_score from sklearn.metrics import recall_...print(metrics.roc_auc_score(label_one_hot,arrays,average='weighted'))  
  • 多分类下的ROC曲线和AUC

    万次阅读 多人点赞 2018-03-05 17:37:20
    本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明。如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:...
  • 主要介绍了python实现二分类多分类ROC曲线教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 本文通过对这些指标的原理做一个简单的介绍,然后用python分别实现二分类多分类ROC曲线。 1 基本概念 一个分类模型(分类器)是一个将某个实例映射到一个特定类的过程.分类器的结果可以是给出该实例所属的...
  • 多分类ROC-AUC曲线

    2021-01-07 16:37:31
    ROC能够有效的评估算法的性能,默认情况下适用于二分类 可选的参数: micro(微观)、macro(宏观)、weight(算该类在总数中的占比) 链接:...多分类ROC曲线——使用鸢尾花数据集进行测试 ...
  • python:实现二分类多分类ROC曲线

    万次阅读 多人点赞 2019-03-04 11:26:19
    2分类.png") plt.show() print("--- %s seconds ---" % (time.time() - start_time)) ROC图如下所示: 多分类问题:ROC曲线 ROC曲线通常用于二分类以研究分类器的输出。为了将ROC曲线和ROC区域扩展到类或标签...
  • ROC曲线学习总结

    万次阅读 多人点赞 2019-08-19 15:22:38
    文章目录ROC曲线学习总结1.... 利用ROC曲线选择最佳模型3.1 不同模型之间选择最优模型3.2 同一模型中选择最优点对应的最优模型3.3 当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变ROC曲线在对分类问...
  • 多分类-- ROC曲线

    2019-03-20 21:15:00
    本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明。如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:...
  • 文章目录一、为什么采用ROC作为分类性能指标二、ROC1、roc曲线2、混淆矩阵3、绘制roc曲线三、二分类ROC曲线绘制四、多分类ROC曲线绘制参考文献 一、为什么采用ROC作为分类性能指标   既然已经这么标准,为什么...
  • 分类器的ROC曲线

    2013-10-17 20:15:41
    LDC KNN SVM QDC 测试brest-cancer数据,得出分类正确率和roc曲线
  • 答案是可以利用roc曲线来确定比较好的划分阈值。 ROC曲线介绍 二分类过程,设定阈值,大于该分数为1,小于该分数为0,统计计算TP, FN, FP,TN等数据计算FPR,TPR p(positive): 标签1 n(negative): 标签0 t(true)...
  • 在进行某诊断方法的评估是,我们常常要用到ROC曲线。这篇博文将简要介绍ROC曲线以及用SPSS及medcal绘制ROC曲线的方法。 定义  ROC受试者工作特征曲线 (receiver operating characteristic curve,简称ROC曲线)...
  • I am using ROCR package and i was wondering how can one plot a ROC curve for knn model in R? Is there any way to plot it all with this package?I don't know how to use the prediction function of ROCR f...
  • ROC曲线

    2017-12-11 16:10:30
    roc曲线
  • roc曲线

    2019-10-14 14:01:56
    登录注册写文章首页下载APP机器学习基础(1)- ROC曲线理解蘑菇轰炸机关注赞赏支持机器学习基础(1)- ROC曲线理解22018.09.09 16:14:12字数 2776阅读 8325本文用于理解ROC曲线的定义,绘制过程及其应用实现。...
  • sklearn ROC曲线使用

    万次阅读 多人点赞 2019-03-03 09:10:13
    目录ROC曲线定义绘制ROC曲线AUC定义代码讲解二分类多分类 这篇文章中我将使用sklearn的ROC曲线官方示例代码进行讲解,当然主要目的还是在于记录,好记性不如烂键盘嘛。 ROC曲线定义 ROC曲线是Receiver Operating ...
  • 分类问题ROC曲线和KS曲线的绘制

    千次阅读 2018-03-19 16:43:28
    ROC曲线与AUC ROC曲线下方的面积是AUC,AUC表示对于随机选择的正类别样本确实为正类别,以及随机选择的负类别样本为正类别,分类器更确信前者的概率。 分类问题的模型评估理论参考: ...Python机器学习库sklearn分类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,150
精华内容 5,260
关键字:

多分类roc曲线