精华内容
下载资源
问答
  • 二分类roc曲线
    2022-08-06 09:41:19

    代码详解:

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import label_binarize
    from sklearn.metrics import confusion_matrix,classification_report
    from sklearn.metrics import roc_curve, auc
    from sklearn.metrics import cohen_kappa_score, accuracy_score
    
    with open("batch_16_epoch_2.txt","r",encoding="utf-8") as f:
            y_true, y_sore,y_pre=[],[],[]
            f=f.readlines()
            data=[i.split("\n")[0].split(" ") for i in f ]
            print("# 第一列是真实值 第二列是分数 第三列是预测值",data)
            for line in data:
                y_true.append(int(line[0]))
                y_sore.append(float(line[1]))
                y_pre.append(int(line[2]))
    from sklearn.metrics import roc_curve, auc
    fpr, tpr, thresholds = roc_curve(y_true,y_pre)# 真实值 预测值 
    roc_auc = auc(fpr, tpr)
    plt.title('Receiver Operating Characteristic')
    plt.plot(fpr, tpr, '#9400D3',label=u'AUC = %0.3f'% roc_auc)
    
    plt.legend(loc='lower right')
    plt.plot([0,1],[0,1],'r--')
    plt.xlim([-0.1,1.1])
    plt.ylim([-0.1,1.1])
    plt.ylabel('True Positive Rate')
    plt.xlabel('False Positive Rate')
    plt.grid(linestyle='-.')
    plt.grid(True)
    plt.show()
    print(roc_auc)
    
    

    所使用的数据:

    1 0.43634527921676636 1
    1 0.8586912155151367 1
    1 0.39847224950790405 1
    1 0.1412433385848999 1
    1 0.453352153301239 1
    1 0.6561286449432373 1
    0 0.3917325735092163 1
    0 2.0273900032043457 0
    1 0.5848201513290405 1
    0 2.0273900032043457 0
    1 0.5932345390319824 1
    0 0.294411301612854 1
    0 0.5773183107376099 1
    1 0.5430892109870911 1
    1 0.7108154296875 1
    1 0.09494812786579132 1
    1 0.47612446546554565 1
    0 0.40635037422180176 1
    1 1.1501526832580566 1
    1 1.444924235343933 1
    1 0.38344329595565796 1
    0 2.0273900032043457 0
    0 0.13804276287555695 0
    1 0.6540321111679077 1
    1 0.14609406888484955 0
    1 0.6681041717529297 1
    1 1.1515244245529175 1
    1 0.30074650049209595 1
    1 1.4383286237716675 1
    0 0.7027207612991333 1
    0 0.030655402690172195 1
    1 1.0661168098449707 1
    1 1.488912582397461 1
    1 1.5660024881362915 1
    1 1.4108396768569946 1
    0 0.4327501058578491 1
    0 1.6029647588729858 1
    1 0.6263653039932251 1
    1 0.3914671540260315 1
    0 0.3888956904411316 1
    1 0.63265460729599 1
    0 0.49486684799194336 1
    1 0.7917946577072144 1
    1 1.1501526832580566 1
    1 0.2718577980995178 1
    1 0.3593907356262207 1
    1 0.4288383722305298 1
    1 1.5701837539672852 1
    1 0.38923269510269165 1
    0 0.38777071237564087 1
    1 0.3931404948234558 1
    1 0.3496888279914856 1
    0 0.5347107648849487 1
    1 0.8520243167877197 1
    1 1.4646883010864258 1
    1 0.46793079376220703 1
    0 0.9723107814788818 1
    1 1.4907466173171997 1
    1 0.3225148916244507 1
    0 0.3948279023170471 1
    1 0.38133692741394043 1
    1 1.0636588335037231 1
    1 0.2226351648569107 1
    0 0.7833895683288574 1
    1 0.4394013285636902 1
    0 0.3722434639930725 1
    1 0.3940393328666687 1
    1 0.6790505647659302 1
    1 1.5487992763519287 1
    0 0.4500522017478943 1
    1 0.42866051197052 1
    1 0.38969749212265015 1
    1 0.6231485605239868 0
    1 0.5015305876731873 1
    1 0.5172305107116699 1
    1 0.5742232799530029 0
    1 0.38778531551361084 1
    1 1.5398317575454712 1
    1 0.3136991560459137 1
    1 0.45737093687057495 1
    1 0.452240526676178 1
    0 0.4057033061981201 1
    0 0.34661731123924255 0
    1 0.4986381530761719 1
    1 0.6134532690048218 1
    1 0.4623498320579529 1
    1 0.5248073935508728 1
    1 0.15892711281776428 1
    1 1.4255726337432861 1
    1 0.9105162024497986 1
    0 0.13620708882808685 0
    1 0.47143030166625977 1
    1 0.466632604598999 1
    1 0.48047471046447754 1
    1 0.6549559831619263 1
    1 1.4607666730880737 1
    1 0.11319949477910995 0
    1 0.8882304430007935 1
    0 0.17422980070114136 1
    1 0.6129201650619507 1
    1 1.0693506002426147 1
    1 0.42974501848220825 1
    1 0.5690168738365173 1
    1 0.599861741065979 1
    0 0.1508873701095581 1
    1 0.5788415670394897 1
    1 1.044488549232483 1
    1 1.466565728187561 1
    0 0.37451380491256714 1
    0 0.445925772190094 1
    1 1.4821547269821167 1
    0 0.9103236198425293 1
    1 0.5610849857330322 1
    1 0.646884024143219 1
    0 0.39948809146881104 1
    1 0.38133692741394043 1
    1 1.4839462041854858 1
    1 0.20502609014511108 1
    1 0.4067472815513611 1
    1 1.5443692207336426 1
    0 2.0273900032043457 0
    1 1.154863953590393 1
    0 0.2567283511161804 1
    1 1.1501526832580566 1
    1 1.1126707792282104 1
    1 1.059218406677246 1
    1 0.44406551122665405 1
    1 0.47437506914138794 1
    1 0.3555939197540283 1
    1 0.3685275912284851 1
    1 1.5119705200195312 1
    0 1.0691412687301636 1
    1 0.5977227687835693 1
    1 0.23996621370315552 1
    0 2.0273900032043457 0
    1 0.4062432050704956 1
    0 0.0377497561275959 0
    1 0.5439857244491577 1
    0 0.4301564693450928 0
    1 0.16895827651023865 1
    1 0.4288383722305298 1
    1 0.42086201906204224 1
    1 1.3529773950576782 1
    0 0.14928676187992096 1
    1 0.49031442403793335 1
    1 1.2094004154205322 1
    0 0.4288383722305298 1
    1 0.3751216530799866 1
    1 0.8148292899131775 1
    0 0.30097532272338867 1
    0 0.6460809111595154 1
    1 1.6055253744125366 1
    1 0.2539063096046448 1
    1 0.4109300374984741 1
    1 1.882000207901001 0
    1 0.09984473139047623 1
    1 0.5291245579719543 1
    1 0.2543572783470154 1
    1 1.4871543645858765 1
    1 1.1501526832580566 1
    1 1.114959478378296 1
    0 2.0273900032043457 0
    1 0.7048561573028564 1
    1 0.1641892045736313 0
    1 0.4344691038131714 1
    1 0.4357917308807373 1
    1 0.5157507658004761 1
    1 0.5715606212615967 1
    1 0.695965051651001 1
    1 0.7810284495353699 1
    1 0.47502923011779785 1
    0 1.0571378469467163 1
    1 1.5027488470077515 1
    1 0.11037121713161469 1
    1 1.4669545888900757 1
    1 1.4874690771102905 1
    1 0.3656919002532959 1
    0 2.0273900032043457 0
    0 0.45807838439941406 1
    1 0.5265090465545654 1
    1 1.4038162231445312 1
    1 0.6174020767211914 1
    1 0.44812071323394775 1
    1 0.34794241189956665 1
    1 0.3657253384590149 1
    1 0.1723751574754715 0
    1 0.6490193605422974 1
    1 1.4253790378570557 1
    1 0.38403403759002686 1
    1 0.4986381530761719 1
    0 2.0273900032043457 0
    1 0.4435335397720337 1
    1 0.45250922441482544 1
    1 1.1501526832580566 1
    1 0.990080714225769 1
    1 0.37996309995651245 1
    1 1.0807535648345947 1
    

     

    更多相关内容
  • 分类器的ROC曲线生成算法.pdf
  • 主要介绍了python实现二分类和多分类的ROC曲线教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • ROC曲线,一般适用于你的分类器输出一个“概率值”,即这个样本属于某个类的概率是多少。 如此的话,你就需要设定一个阈值, 大于这个阈值属于正类,小于这个阈值属于负类。 从而,对于这个阈值P0, 就会得到对应的...
  • 在做二分类问题时候,有正样本和负样本。构建的算法,针对每个样本会输出一个分数值。假设该分数大小为[0, 1]区间内的值。有时候单纯地以分数0.5位阈值划分样本为预测为1或者预测为0,效果有时候并不好,此时如何...

    问题

    在做二分类问题时候,有正样本和负样本。构建的算法,针对每个样本会输出一个分数值。假设该分数大小为[0, 1]区间内的值。有时候单纯地以分数0.5位阈值划分样本为预测为1或者预测为0,效果有时候并不好,此时如何确定很好的阈值分数呢?答案是可以利用roc曲线来确定比较好的划分阈值。

    ROC曲线介绍

    二分类过程,设定阈值,大于该分数为1,小于该分数为0,统计计算TP, FN, FP,TN等数据计算FPR,TPR


    • p(positive): 标签1
    • n(negative): 标签0
    • t(true): 预测正确
    • f(false): 预测错误

    • TP: 实例是正类并被预测成正类 正确预测正类(把正类预测正类)
    • FP:实例是负类并被预测成正类 错误预测正类(把负类预测为正类)
    • TN:实例是负类并被预测成负类 正确预测负类(把负类预测为负类)
    • FN:实例是正类并被预测为负类 错误预测负类 (把正类预测为负类)

            |          -      |     实际表现           |
            ---------------------------------------------------
            |                |      1        0       |   合计
            |--------------------------------------------------
            |           | 1  |     11(TP)    01(FP)  |   TP+FP
            | 预测表现   |    |                       |
            |           |  0 |     10(FN)    00(TN)  |   FN+TN
            | ----------------------------------------------------------
            |   合计        |       TP+FN      FP+TN |  TP + FP + FN + TN
            -------------------------------------------------------------
    
    • 真正类率(TPR):TPR = TP/(TP+FN) 刻画的是分类器所识别出的 正实例占所有正实例的比例 灵敏度

    • 负正类率(FPR): FPR = FP/(FP+TN) 计算的是分类器错认为正类的负实例占所有负实例的比例 1-特异度

    • 真负类率(TNR): TNR = TN/(FP+TN) = 1-FPR 分类器所识别出的负实例占所有负实例的比例 特异度

    • 准确率: accuracy = (TP+TN) / (TP+TN+FP+FN) 准确率的定义是预测正确的结果占总样本的百分比, 样本不均衡时候不好

    • 精准率: precision = TP / (TP+FP) 所有被预测为正的样本中实际为正的样本的概率

    • 召回率(查全率): recall = TP / (TP+FN) 在实际为正的样本中被预测为正样本的概率

    • P-R曲线:查准率-查全率, 希望查准率和查全率同时高,但不现实

    • F1分数均衡:F1_score = (2pr)/(p+r)

    • ROC曲线: 横坐标FPR, 纵坐标TPR

    代码实现

    两种方式:

    • 自己遍历统计计算
    • 调用skearln中的相关计算包
    #!/bin/python
    # fileUsing: 画出ROC曲线,并熟悉混淆矩阵相关的知识
    
    import sys
    import numpy as np
    from sklearn import metrics
    from sklearn.metrics import auc
    import matplotlib.pyplot as plt
    
    
    class DrawRoc(object):
        def __init__(self):
            pass
    
        def draw_roc(self, predict_scores: list, ture_labelsi: list) -> float:
            """二分类过程,设定阈值,大于该分数为1,小于该分数为0,统计计算TP, FN, FP,TN等数据
                计算FPR,TPR
                p(positive): 标签1
                n(negative): 标签0
                t(true): 预测正确
                f(false): 预测错误
                TP: 实例是正类并被预测成正类  正确预测正类(把正类预测正类)
                FP:实例是负类并被预测成正类  错误预测正类(把负类预测为正类)
                TN:实例是负类并被预测成负类  正确预测负类(把负类预测为负类)
                FN:实例是正类并被预测为负类  错误预测负类 (把正类预测为负类)
                -----------------------------------------
                |                |     实际表现           |
                ---------------------------------------------------
                |                |      1        0       |   合计
                |--------------------------------------------------
                |           | 1  |     11(TP)    01(FP)  |   TP+FP
                | 预测表现   |    |                       |
                |           |  0 |     10(FN)    00(TN)  |   FN+TN
                | ----------------------------------------------------------
                |   合计        |       TP+FN      FP+TN |  TP + FP + FN + TN
                -------------------------------------------------------------
                真正类率(TPR):TPR = TP/(TP+FN)  刻画的是分类器所识别出的 正实例占所有正实例的比例  灵敏度
                负正类率(FPR): FPR = FP/(FP+TN)  计算的是分类器错认为正类的负实例占所有负实例的比例 1-特异度
                真负类率(TNR): TNR = TN/(FP+TN) = 1-FPR 分类器所识别出的负实例占所有负实例的比例 特异度
    
                准确率: accuracy = (TP+TN) / (TP+TN+FP+FN)  准确率的定义是预测正确的结果占总样本的百分比, 样本不均衡时候不好
                精准率: precision = TP / (TP+FP)  所有被预测为正的样本中实际为正的样本的概率
                召回率(查全率): recall = TP / (TP+FN)  在实际为正的样本中被预测为正样本的概率
                P-R曲线:查准率-查全率, 希望查准率和查全率同时高,但不现实
                F1分数均衡:F1_score = (2*p*r)/(p+r)
                ROC曲线: 横坐标FPR, 纵坐标TPR
            """
            ths = list(np.linspace(0, 1, 100))  # 阈值 分100等分
            tprs = []
            fprs = []
            diffs = []
            auc = 0
            # 开始计算
            for th in ths:
                tp = 0
                tn = 0
                fp = 0
                fn = 0
                predict_labels = [1 if score >= th else 0 for score in predict_scores]  # 大于等于阈值时候,判定为预测为正
                length = len(predict_labels)
                for idx in range(len(predict_labels)):
                    predict_label = predict_labels[idx]
                    ture_label = ture_labels[idx]
                    if ture_label == 1 and predict_label == 1:
                        tp += 1
                    if ture_label == 1 and predict_label == 0:
                        fn += 1
                    if ture_label == 0 and predict_label == 0:
                        tn += 1
                    if ture_label == 0 and predict_label == 1:
                        fp += 1
                tpr = tp / (tp+fn)
                fpr = fp / (fp+tn)
                tprs.append(tpr)
                fprs.append(fpr)
                diffs.append(tpr-fpr)
    
            # get fpr tpr ths and plot
            plt.plot(fprs, tprs, 'yo-')
            plt.ylabel('True Positive Rate')
            plt.xlabel('False Positive Rate')
            plt.show()
            plt.savefig('roc1.png')
    
            # calc auc, 受样本影响大,除非全是正样本,无负样本时候,使用类似微积方法计算得到的面积才对
            """
            fprs_tprs = []
            for i in range(len(ths)):
                fpr = tprs[i]
                tpr = fprs[i]
                fprs_tprs.append([fpr, tpr])
            fprs_tprs.sort(key=lambda x:x[0], reverse=False)
            for i in range(1, len(ths)):
                fpr, tpr = fprs_tprs[i-1]
                fpr_i, tpr_i = fprs_tprs[i]
                height = tpr_i
                weight = fpr_i - fpr
                auc += height * weight
            print("auc1:", auc)
            """
    
            # get best th
            max_diff = max(diffs)
            optimal_idx = diffs.index(max_diff)
            optimal_th = ths[optimal_idx]
            return optimal_th
    
        def draw_roc_by_sklearn(self, predict_scores: list, ture_labels: list) -> float:
            score = np.array(predict_scores)
            y = np.array(ture_labels)
            fpr, tpr, thresholds = metrics.roc_curve(y, score)
            auc = metrics.auc(fpr, tpr)
            print("auc2:", auc)
            optimal_idx = np.argmax(tpr - fpr)
            optimal_th = thresholds[optimal_idx]
            plt.plot(fpr, tpr, 'bo-')
            plt.ylabel('True Positive Rate')
            plt.xlabel('False Positive Rate')
            plt.show()
            plt.savefig('roc2.png')
            return optimal_th
    
    
    if __name__ == '__main__':
        dr = DrawRoc()
        right_scores_file = sys.argv[1]  # 正确样本的分数列表
        error_scores_file = sys.argv[2]   # 错误样本的分数列表
        predict_scores = []
        ture_labels = []
        with open(right_scores_file) as f:
            for line in f:
                data = line.rstrip('\n')
                if data:
                    score = float(data)
                    predict_scores.append(score)
                    ture_labels.append(1)
    
        with open(error_scores_file) as f:
            for line in f:
                data = line.rstrip('\n')
                if data:
                    score = float(data)
                    predict_scores.append(score)
                    ture_labels.append(0)
        th1 = dr.draw_roc(predict_scores, ture_labels)
        print("th1:", th1)
        th2 = dr.draw_roc_by_sklearn(predict_scores, ture_labels)
        print("th2:", th2)
    

    结果

    • roc1
      在这里插入图片描述
    • roc2
      在这里插入图片描述

    参考

    • https://blog.csdn.net/ybdesire/article/details/51999995
    • https://zhuanlan.zhihu.com/p/25212301
    • https://www.cnblogs.com/nxld/p/6365637.html
    • https://zhuanlan.zhihu.com/p/32824418
    • https://blog.csdn.net/qq_34840129/article/details/85253932
    • https://www.cnblogs.com/nxld/p/6365637.html
    • https://stackoverflow.com/questions/28719067/roc-curve-and-cut-off-point-python
    • https://blog.csdn.net/ZYC88888/article/details/103755818
    • https://zhuanlan.zhihu.com/p/46714763(推荐)
    展开全文
  • python:实现二分类和多分类的ROC曲线

    万次阅读 多人点赞 2019-03-04 11:26:19
    二分类问题:ROC曲线 from __future__ import absolute_import from __future__ import division from __future__ import print_function import time start_time = time.time() import matplotlib.pyplot as plt ...

    基本概念

    • precision:预测为对的当中,原本为对的比例(越大越好,1为理想状态)
    • recall:原本为对的当中,预测为对的比例(越大越好,1为理想状态)
    • F-measure:F度量是对准确率和召回率做一个权衡(越大越好,1为理想状态,此时precision为1,recall为1)
    • accuracy:预测对的(包括原本是对预测为对,原本是错的预测为错两种情形)占整个的比例(越大越好,1为理想状态)
    • fp rate:原本是错的预测为对的比例(越小越好,0为理想状态)
    • tp rate:原本是对的预测为对的比例(越大越好,1为理想状态)

    ROC曲线通常在Y轴上具有真阳性率,在X轴上具有假阳性率。这意味着图的左上角是“理想”点 - 误报率为零,真正的正率为1。这不太现实,但它确实意味着曲线下面积(AUC)通常更好。

    二分类问题:ROC曲线

    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    import time
    start_time = time.time()
    import matplotlib.pyplot as plt
    from sklearn.metrics import roc_curve
    from sklearn.metrics import auc
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import recall_score,accuracy_score
    from sklearn.metrics import precision_score,f1_score
    from keras.optimizers import Adam,SGD,sgd
    from keras.models import load_model
    
    
    
    print('读取数据')
    X_train = np.load('x_train-rotate_2.npy')
    Y_train = np.load('y_train-rotate_2.npy')
    print(X_train.shape)
    print(Y_train.shape)
    
    
    print('获取测试数据和验证数据')
    X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, test_size=0.1, random_state=666)
    
    Y_train = np.asarray(Y_train,np.uint8)
    Y_valid = np.asarray(Y_valid,np.uint8)
    X_valid = np.array(X_valid, np.float32) / 255.
    
    
    print('获取模型')
    model = load_model('./model/InceptionV3_model.h5')
    opt = Adam(lr=1e-4)
    model.compile(optimizer=opt, loss='binary_crossentropy')
    
    
    print("Predicting")
    Y_pred = model.predict(X_valid)
    Y_pred = [np.argmax(y) for y in Y_pred]  # 取出y中元素最大值所对应的索引
    Y_valid = [np.argmax(y) for y in Y_valid]
    
    
    
    # micro:多分类  
    # weighted:不均衡数量的类来说,计算二分类metrics的平均
    # macro:计算二分类metrics的均值,为每个类给出相同权重的分值。
    precision = precision_score(Y_valid, Y_pred, average='weighted')
    recall = recall_score(Y_valid, Y_pred, average='weighted')
    f1_score = f1_score(Y_valid, Y_pred, average='weighted')
    accuracy_score = accuracy_score(Y_valid, Y_pred)
    print("Precision_score:",precision)
    print("Recall_score:",recall)
    print("F1_score:",f1_score)
    print("Accuracy_score:",accuracy_score)
    
    
    
    # 二分类 ROC曲线
    # roc_curve:真正率(True Positive Rate , TPR)或灵敏度(sensitivity)
    # 横坐标:假正率(False Positive Rate , FPR)
    fpr, tpr, thresholds_keras = roc_curve(Y_valid, Y_pred)
    auc = auc(fpr, tpr)
    print("AUC : ", auc)
    plt.figure()
    plt.plot([0, 1], [0, 1], 'k--')
    plt.plot(fpr, tpr, label='Keras (area = {:.3f})'.format(auc))
    plt.xlabel('False positive rate')
    plt.ylabel('True positive rate')
    plt.title('ROC curve')
    plt.legend(loc='best')
    plt.savefig("../images/ROC/ROC_2分类.png")
    plt.show()
    
    
    print("--- %s seconds ---" % (time.time() - start_time))
    

    ROC图如下所示:
    在这里插入图片描述

    多分类问题:ROC曲线

    ROC曲线通常用于二分类以研究分类器的输出。为了将ROC曲线和ROC区域扩展到多类或多标签分类,有必要对输出进行二值化。⑴可以每个标签绘制一条ROC曲线。⑵也可以通过将标签指示符矩阵的每个元素视为二元预测(微平均)来绘制ROC曲线。⑶另一种用于多类别分类的评估方法是宏观平均,它对每个标签的分类给予相同的权重。

    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    import time
    start_time = time.time()
    import matplotlib.pyplot as plt
    from sklearn.metrics import roc_curve
    from sklearn.metrics import auc
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import recall_score,accuracy_score
    from sklearn.metrics import precision_score,f1_score
    from keras.optimizers import Adam,SGD,sgd
    from keras.models import load_model
    from itertools import cycle
    from scipy import interp
    from sklearn.preprocessing import label_binarize
    
    
    
    nb_classes = 5
    print('读取数据')
    X_train = np.load('x_train-resized_5.npy')
    Y_train = np.load('y_train-resized_5.npy')
    print(X_train.shape)
    print(Y_train.shape)
    
    
    print('获取测试数据和验证数据')
    X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, test_size=0.1, random_state=666)
    
    Y_train = np.asarray(Y_train,np.uint8)
    Y_valid = np.asarray(Y_valid,np.uint8)
    X_valid = np.asarray(X_valid, np.float32) / 255.
    
    
    print('获取模型')
    model = load_model('./model/SE-InceptionV3_model.h5')
    opt = Adam(lr=1e-4)
    model.compile(optimizer=opt, loss='categorical_crossentropy')
    
    
    print("Predicting")
    Y_pred = model.predict(X_valid)
    Y_pred = [np.argmax(y) for y in Y_pred]  # 取出y中元素最大值所对应的索引
    Y_valid = [np.argmax(y) for y in Y_valid]
    
    # Binarize the output
    Y_valid = label_binarize(Y_valid, classes=[i for i in range(nb_classes)])
    Y_pred = label_binarize(Y_pred, classes=[i for i in range(nb_classes)])
    
    
    # micro:多分类  
    # weighted:不均衡数量的类来说,计算二分类metrics的平均
    # macro:计算二分类metrics的均值,为每个类给出相同权重的分值。
    precision = precision_score(Y_valid, Y_pred, average='micro')
    recall = recall_score(Y_valid, Y_pred, average='micro')
    f1_score = f1_score(Y_valid, Y_pred, average='micro')
    accuracy_score = accuracy_score(Y_valid, Y_pred)
    print("Precision_score:",precision)
    print("Recall_score:",recall)
    print("F1_score:",f1_score)
    print("Accuracy_score:",accuracy_score)
    
    
    # roc_curve:真正率(True Positive Rate , TPR)或灵敏度(sensitivity)
    # 横坐标:假正率(False Positive Rate , FPR)
    
    
    # Compute ROC curve and ROC area for each class
    fpr = dict()
    tpr = dict()
    roc_auc = dict()
    for i in range(nb_classes):
        fpr[i], tpr[i], _ = roc_curve(Y_valid[:, i], Y_pred[:, i])
        roc_auc[i] = auc(fpr[i], tpr[i])
    
    # Compute micro-average ROC curve and ROC area
    fpr["micro"], tpr["micro"], _ = roc_curve(Y_valid.ravel(), Y_pred.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(nb_classes)]))
    
    # Then interpolate all ROC curves at this points
    mean_tpr = np.zeros_like(all_fpr)
    for i in range(nb_classes):
        mean_tpr += interp(all_fpr, fpr[i], tpr[i])
    
    # Finally average it and compute AUC
    mean_tpr /= nb_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(nb_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.savefig("../images/ROC/ROC_5分类.png")
    plt.show()
    
    
    print("--- %s seconds ---" % (time.time() - start_time))
    

    ROC图如下所示:
    在这里插入图片描述

    展开全文
  • ROC 二分类曲线

    千次阅读 2019-10-31 17:53:57
    Roc 二分类曲线详解(小白也能看懂的笔记) 由于工作涉及到了ROC曲线,自己不是很懂,就在网上找了资料自学了一下。 明白每一行代码,甚至可以改代码的时候,应该就学得差不多了。 这次我选用了著名的iris鸢尾花数据...

    Roc 二分类曲线详解(小白也能看懂的笔记)

    由于工作涉及到了ROC曲线,自己不是很懂,就在网上找了资料自学了一下。
    明白每一行代码,甚至可以改代码的时候,应该就学得差不多了。
    这次我选用了著名的iris鸢尾花数据集作为数据源。(R,python,学习经常用到)
    iris包含花瓣长度、花瓣宽度、花萼长度、花萼宽度四个特征,
    “setosa”,“versicolor”,"virginica"3个种类的鸢尾花,一共150个数据样本。
    Sklearn.datasets机器学习包可以直接得到。大概长这样。
    iris数据集
    你期待的代码:

    import numpy as np
    #画图用的包
    import matplotlib.pyplot as plt
    # 支持向量机分类算法
    from sklearn import svm,datasets
    #roc 2分类曲线
    from sklearn.metrics import roc_curve,auc
    from sklearn.model_selection import train_test_split
    
    # 下载iris数据集
    iris = datasets.load_iris()
    # 获取数据特征
    X = iris.data
    # 获取数据标签(0,1,2)分别代表不同的种类的鸢尾花
    y = iris.target
    # 由于数据是3分类的,我们需要转换为2分类
    #变为2分类,我取了(0,1)
    X, y = X[y != 2], y[y != 2]
    
    # 增加噪音特征,是问题稍稍点挑战性
    # 可通过用Numpy工具包生成模拟数据集,使用RandomState获得随机数生成器
    # 参数0为随机种子,当多次运行此段代码能够得到完全一样的结果。
    random_state = np.random.RandomState(0)
    # 获取X数据矩阵行和列(100,4),
    n_samples, n_features = X.shape
    
    # np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等 X.shape=(100,800)
    X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
    
    # 将数据划分为训练集和测试集,test_size=.3表示30%的测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3,random_state=0)
    
    # 学习预测其他类
    # svm:作用分类classification,回归regression,异常检测outlier detection
    # svm:support vector machine(支持向量机)
    # svm.SVC()全称C—support Vector Classification
    # kernel:核函数,可选linear(线性核函数)、poly、rbf、sigmoid、precomputed,默认为rbf(高斯核)。
    # probability:是否采用概率估计,默认为False。
    # random_state:数据随机洗牌时的种子值,默认为缺省。
    clf = svm.SVC(kernel='linear', probability=True, random_state=random_state)
    
    # 训练模型
    clf_fit=clf.fit(X_train,y_train)
    
    #通过decision_function()计算得到的y_score的值,用在roc_curve()函数中
    # decision_function代表的是参数实例到各个类所代表的超平面的距离;
    # 在梯度下滑里面特有的(随机森林里面没有decision_function),这个返回的距离,或者说是分值;
    # 后续的对于这个值的利用方式是指定阈值来进行过滤:
    y_score = clf_fit.decision_function(X_test)
    
    # 计算每个类的ROC曲线和ROC面积
    fpr, tpr, threshold = roc_curve(y_test, y_score)  #fpr,tpr,thresholds 分别为假正率、真正率和阈值
    roc_auc = auc(fpr, tpr)  #计算auc的值:0.8133333333333334
    
    #画ROC曲线图
    plt.figure(figsize=(10, 10))
    plt.plot(fpr, tpr, color='darkorange',
             lw=1, label='ROC curve (area = %0.2f)' % roc_auc)  ###假正率为横坐标,真正率为纵坐标做曲线
    plt.plot([0, 1], [0, 1], color='navy', lw=2, 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()
    
    

    效果图
    还有很多不足之处,还望不吝赐教。谢谢。

    展开全文
  • 本文通过对这些指标的原理做一个简单的介绍,然后用python分别实现二分类和多分类的ROC曲线。 1 基本概念 一个分类模型(分类器)是一个将某个实例映射到一个特定类的过程.分类器的结果可以是给出该实例所属的...
  • 二分类任务中的ROC曲线绘制

    千次阅读 2019-08-27 09:02:51
    对于一个特定的分类器和测试数据集,显然只能得到一个分类结果,即一组FPR和TPR结果,而要得到一个曲线,我们实际上...我们先来看一下Wikipedia上对ROC曲线的定义: In signal detection theory, a receiver operati...
  • 分类ROC曲线:macro和 micro

    千次阅读 2021-09-03 12:32:14
    通过ROC曲线能够有效评估算法的性能,默认情况下适用于二分类任务,在多分类任务中利用one vs rest方式计算各个类别的混淆矩阵,使用如下平均方式 macro:分别求出每个类,再进行算术平均 优点:直观、易懂,并且...
  • ROC曲线横坐标为误报率,纵坐标为正样本率
  • 二分类任务中,positive和negtive同样重要时,适合用ROC曲线评价 ROC曲线的意义 TPR的增长是以FPR的增长为代价2.ROC曲线绘制纵坐标为TPRTPR(True Positive Rate)真正确率,即模型正确识别正例的比例,TPR=TP/(TP+FN)...
  • ROC曲线(Receiver Operating Characteristic Curve)是利用Classification模型真正率(True Positive Rate)和假正率(False Positive Rate)作为坐标轴,图形化表示分类方法的准确率的高低。ROC图的一些概念定义::真正...
  • 这篇文章将先简单的介绍ROC和AUC,而后用实例演示如何python作出ROC曲线图以及计算AUC。 AUC介绍 AUC(Area Under Curve)是机器学习二分类模型中非常常用的评估指标,相比于F1-Score对项目的不平衡有更大的容忍性,...
  • 分类ROC曲线

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

    2017-08-31 14:49:34
    使用matlab画ROC曲线,% predict - 分类器对测试集的分类结果 % ground_truth - 测试集的正确标签,这里只考虑二分类,即0和1 % auc - 返回ROC曲线的曲线下的面积
  • 文章目录一、为什么采用ROC作为分类性能指标二、ROC1、roc曲线2、混淆矩阵3、绘制roc曲线三、二分类ROC曲线绘制四、多分类ROC曲线绘制参考文献 一、为什么采用ROC作为分类性能指标   既然已经这么多标准,为什么...
  • Roc曲线和PR曲线常被用来在二分类问题中评估一个分类器的性能,所以在机器学习中搞清楚两种曲线的原理及其区别与实现是非常基础也是非常重要的。 2.几个度量的介绍与理解 首先我们必须要了解混淆矩阵:表示...
  • 分类器模型评价指标之ROC曲线

    千次阅读 2017-10-15 22:00:10
    Spark mllib 自带了许多机器学习算法,它能够用来进行模型...具体的机器学习算法归入更广泛类型的机器学习应用,例如:分类,回归,聚类等等,每一种类型都很好的建立了性能评估指标。本节主要分享分类器模型评价指标。
  • 原标题:Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线原文链接:http://tecdat.cn/?p=15508 绘制ROC曲线通过Logistic回归进行分类加载样本数据。load fisheriris通过使用与versicolor和virginica物种相对应的...
  • python 分类问题 画roc曲线实战
  • 各位朋友大家好,我是环湖医院的医生飞时过,...假阴性和真阳性相辅相成,我们希望预测分类的结果应该是真阳性高和假阴性低。 特异性也叫真阴性,它的意思是这个模型能发现的真正健康人的概率。 假阳性...
  • 90_percent) #则有了分数阈值,我们也可以使用分数阈值 进行二分类 #Y_train_pred_90=(y_scores>=threshold_90_percent) #大于阈值可预测为是5 #PR曲线 #画y:精度 x:召回率图像 def plot_precision_vs_recall...
  • 如何用R语言画ROC曲线图?

    千次阅读 2020-12-29 01:12:33
    之前曾经有人咨询过我们,用R怎么画ROC曲线图呀?嗯,我们建议用pROC函数来画,基本都能满足你的所有要求。今天我们就来详细讲讲这个方法(当然也分享代码)~ROC曲线介绍受试者工作特征曲线(ROC曲线,receiver ...
  • 该软件包旨在通过使用置信区间计算多类ROC-AUC和PR-AUC并生成多类ROC曲线和PR曲线的发布质量图来填补空白。 可通过访问用户友好的网站。 1引文 一旦发表,请引用我们的论文:(已提交)。 2安装 从GitHub安装...
  • ROC曲线的阈值确定与平衡点确定

    千次阅读 2020-08-28 09:59:00
    ROC曲线实际上是多个混淆矩阵的结果组合,以疾病检测为例,这是一个有监督的二分类模型,模型对每个样本的预测结果为一个概率值,我们需要从中选取一个阈值来判断健康与否。定义好一个阈值之后,超过此阈值定义为不...
  • 深度学习 多分类roc曲线的绘制

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

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,065
精华内容 4,826
关键字:

二分类roc曲线