三分钟带你理解ROC曲线和PR曲线

1. 先理解混淆矩阵

       混淆矩阵:表示模型讲样本分类结果的矩阵。        

Caption

        在Roc曲线和PR曲线中有四个重要的度量:精确率(查准率),召回率(查全率),真正例率,假正例率。

         精确率(precision):理解为在所有的预测正例中(包括正确预测得出正例和错误预测得出正例),预测正确的比例。

         precision = TP / (TP + FP)

         召回率(recall): 理解为在所有的真实正例中,被正确预测的占比。

         recall = TP / (TP + FN)

2. PR曲线的理解

       首先用一个例子说明一下绘制PR曲线的几个步骤:

        * 我们将会有真实的标签(例如猫狗大战中,猫为1,狗为0)

        * 我们训练模型后会出现一个置信度(正样本的预测概率:这里是猫的概率)

        * 将置信度与标签一一对应从高到低排序

        * 我们需要设置阈值(与精确度和召回率息息相关),我们将大于阈值的置信度做为正样本(及可以理解为我们预测的正确的数据)

        * 然后将每一次阈值所划分出的混淆矩阵计算精确率和召回率

        * 绘图

        这里我们把标签为1当做实际正确,标签为0当做实际错误

Caption

          我们取当阈值为0.6时的情况来讲解 ,当阈值为0.6时,我们可以得到的正样本(其余为负样本)应该是置信度大于等于0.6的数据,为:

Caption

       这里的正样本可以理解为我们预测为正确的样本有3个,但是其中真正正确的只有2个,所以我们的精确率precision=2/3。召回率recall我们可以理解为,在所有真正正确的样本中(这里有5个样本,就是标签为1的样本)我们预测的正样本中预测正确的样本的比例(正样本中标签为1的样本)所以,我们可以计算出recall=2/5。

Caption

        总结:PR曲线的横坐标为召回率,纵坐标为精确率。曲线与坐标周包围的面积为AP,AP越大,说明算法越好。

3. ROC曲线的理解

      我们取阈值为0.46的情况进行分析,置信度大于0.46的样本为正样本(即我们预测为正确的样本),为

Caption

        真正率我们可以理解为正样本中我们预测正确的样本中(4个)真正正确的有3个(即正样本标签为1的样本)与真正正确的所有样本(所有样本标签为1的样本)的比值,所以TPR=3/5
        真假率可以理解为预测正确的样本中(4个)真正错误的有1个(即正样本中标签为0的样本)与真正错误的所有样本(所有样本标签为0的样本)的比值,所以FPR=1/3

Caption

           总结:ROC曲线的横轴为FPR,纵轴为TPR。AUC(Area Under Curve)即指曲线下面积占总方格的比例,面积越大,表示分类性能越好。

4.代码实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve,roc_curve


def draw_pr(confidence_scores, data_labels):
    plt.figure()
    plt.title('PR Curve')
    plt.xlabel('Recall')
    plt.ylabel('Precision')
    plt.grid()

    #精确率,召回率,阈值
    precision,recall,thresholds = precision_recall_curve(data_labels,confidence_scores)

    from sklearn.metrics import average_precision_score
    AP = average_precision_score(data_labels, confidence_scores) # 计算AP
    plt.plot(recall, precision, label = 'pr_curve(AP=%0.2f)' % AP)
    plt.legend()
    plt.show()

def draw_roc(confidence_scores, data_labels):
    #真正率,假正率
    fpr, tpr, thresholds = roc_curve(data_labels, confidence_scores)
    plt.figure()
    plt.grid()
    plt.title('Roc Curve')
    plt.xlabel('FPR')
    plt.ylabel('TPR')

    from sklearn.metrics import auc
    auc=auc(fpr, tpr) #AUC计算
    plt.plot(fpr,tpr,label = 'roc_curve(AUC=%0.2f)' % auc)
    plt.legend()
    plt.show()


if __name__ == '__main__':
    # 正样本的置信度,即模型识别成1的概率
    confidence_scores = np.array([0.9, 0.78, 0.6, 0.46, 0.4, 0.37, 0.2, 0.16])
    # 真实标签
    data_labels = np.array([1,1,0,1,0,0 ,1,1])

    draw_pr(confidence_scores, data_labels)
    draw_roc(confidence_scores, data_labels)

    用这些指标去评价你的模型吧!记得是二分类哦!!!

猜你喜欢

转载自blog.csdn.net/Guo_Python/article/details/105820358