ROC曲线以及PR曲线

目录

1.PR,ROC曲线概念

2.混淆矩阵 

3.ROC曲线和PR曲线区别

4.绘制PR曲线和ROC曲线

5.小结


1.PR,ROC曲线概念

PR曲线和ROC曲线都是在评估二分类模型(分类器)时常用的工具,用于显示模型的性能和有效性。这里对它们的概念进行简单介绍:

PR曲线(Precision-Recall Curve):是一种用于评估二分类模型性能的曲线,横坐标为召回率(Recall),纵坐标为精确度(Precision)。精确度是指模型预测为正样本的样本中真实为正样本的比例,召回率是指真实为正样本的样本中被模型正确预测为正样本的比例。通过对不同阈值下的精确度和召回率进行绘制,可以得到PR曲线。

ROC曲线(Receiver Operating Characteristic Curve):是一种用于评估二分类模型性能的曲线,横坐标为FPR(False Positive Rate),纵坐标为TPR(True Positive Rate)。TPR是指真实为正样本的样本中被模型正确预测为正样本的比例,FPR是指真实为负样本的样本中被模型错误预测为正样本的比例。通过对不同阈值下的FPR和TPR进行绘制,可以得到ROC曲线。

PR曲线相对于ROC曲线更加关注模型对少数类(即正例)的识别率,因此在数据不平衡的情况下,PR曲线更加适用。当少数类的重要性比较高时,我们可以转而关注PR曲线。ROC曲线则更加注重的是模型对整体样本的分类效果,它可以帮助我们进行模型选择和调整分类器的阈值。

总之,PR曲线和ROC曲线是常用的评估二分类模型的工具,通过对召回率、精确度、TPR、FPR等指标的绘制,可以从不同角度评估模型的性能和有效性。

2.混淆矩阵 


在机器学习领域,混淆矩阵(Confusion Matrix),又称为可能性矩阵或错误矩阵。混淆矩阵是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵。在图像精度评价中,主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面。

混淆矩阵的结构一般如下图表示的方法。

混淆矩阵要表达的含义:

1.混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;
2.每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目;每一列中的数值表示真实数据被预测为该类的数目。

True Positive(TP):真正类。样本的真实类别是正类,并且模型识别的结果也是正类。

False Negative(FN):假负类。样本的真实类别是正类,但是模型将其识别为负类。

False Positive(FP):假正类。样本的真实类别是负类,但是模型将其识别为正类。

True Negative(TN):真负类。样本的真实类别是负类,并且模型将其识别为负类。
 

3.ROC曲线和PR曲线区别

ROC曲线和PR曲线都是用于评估二分类模型性能的曲线,它们的主要区别在于评价指标和适用情况。

评价指标:ROC曲线的横轴为FPR,纵轴为TPR,其中FPR表示被模型错误分类为正类的负样本比例,TPR表示被模型正确分类为正类的正样本比例。PR曲线的横轴为召回率,纵轴为精确度,其中召回率表示正样本中被模型正确分类的比例,精确度表示模型预测为正样本的样本中真正正样本的比例。

适用情况:ROC曲线适用于数据集中类别分布比较平衡或者关注的重点在于降低误报率(即FPR),即当我们更加关注模型的假阳性率时,可以使用ROC曲线来评估模型的性能。而PR曲线则适用于数据集中类别分布不平衡或者关注的重点在于提高少数类样本的预测准确率(即精确度),即当我们更加关注模型对少数类的识别率时,可以使用PR曲线来评估模型的性能。

综上 所述,ROC曲线和PR曲线都是我们常用的评估二分类模型性能的工具,但在不同的情况下要选择合适的曲线进行评估。

4.绘制PR曲线和ROC曲线

了解了查全率和查准率的相应的概念,我们就可以进行P-R曲线的绘制。我们知道,算法对样本进行分类的时候,都会有置信度,也就是表示该样本为正例的概率。然后通过选取合适的阈值,对样本概率进行划分,比如阈值为50%时,就是其置信度大于50%,那么它就是正例,否则它就是反例。

  这里绘制图线同样的道理,我们要产生随机的概率,表示每个样本例子为正例的概率,然后通过这些概率进行从大到小的排序,再按此顺序逐个样本的选择阈值,大于阈值的概率的样例为正例,后面的全部为反例。我们将数据中每个样例的概率作为阈值,然后得到相应的查全率和查准率,这样我们可以许多数据,根据这些数据绘制图线,我们给出代码:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties


def plot(dict,lists):#画出函数图像
    fig = plt.figure()
    font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
    plt.xlabel('查全率(R)',fontproperties=font)
    plt.ylabel('查准率(P)',fontproperties=font)
    x = np.arange(0,1.0,0.2)
    y = np.arange(0,1.0,0.2)
    plt.xticks(x)
    plt.yticks(y)
    plt.plot(dict,lists)
    plt.show()


def caculate():

    num_real = 0
    #初始化样本标签,假设1为正例,0为负例
    trainlabel = np.random.randint(0,2,size=100)

    #产生100个概率值(置信度),即单个样本值为正例的概率
    traindata = np.random.rand(100)

    #将样本数据为正例概率从大到小排序返回索引值
    sortedTraindata = traindata.argsort()[::-1]

    k = []
    v = []
    #统计样本中实际正例的数量
    num = np.sum(trainlabel==1)
    for i in range(100):
        num_guess = i+1#假设为真的数量
        for j in range(0,i+1):
            a = sortedTraindata[j]
            if trainlabel[a] == 1:
                num_real += 1#假设为真中实际也为真的数量
        p = float(num_real/(num_guess))
        r = float(num_real/(num))
        v.append(p)
        k.append(r)
        num_real = 0
    plot(k,v)

if __name__=='__main__':
    caculate()

运行之后的曲线如图:

当然每次的运行结果也都不尽相同,因为数据都是随机产生的,但是这些图像和书中的还是有些出入的,所以我为了验证,搜索了些其他人的例子,但是大都是用sklearn库来绘制,所以也就有更方便的画法:
 

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties
from sklearn.metrics import precision_recall_curve

def plot(precision,recall):#画出函数图像
    fig = plt.figure()
    font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
    plt.xlabel('查全率(R)',fontproperties=font)
    plt.ylabel('查准率(P)',fontproperties=font)
    x = np.arange(0,1.0,0.2)
    y = np.arange(0,1.0,0.2)
    plt.xticks(x)
    plt.yticks(y)
    plt.plot(recall,precision)
    plt.show()

def caculate():

    #初始化样本标签,假设1为正例,0为负例
    trainlabel = np.random.randint(0,2,size=100)

    #产生100个概率值(置信度),即单个样本值为正例的概率
    traindata = np.random.rand(100)

    precision,recall,thresholds = precision_recall_curve(trainlabel, traindata)
    #计算不同的阈值的查全率和查准率,此实现仅限于二进制分类任务,第一个参数是二进制标签,第二个参数
    #是估计的概率,第三个参数是正类的标签,默认值是1,返回值是p,r,
    plot(precision,recall)

if __name__=='__main__':
    caculate()

这里使用的是sklearn库中的函数,用来求查全率和查准率的,相应的介绍和参数使用可去官方文档中查看,给出地址文档地址,运行之后的结果:

ROC曲线的绘制
  ROC曲线与P-R曲线很类似,我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算其横纵坐标的值,就可以得到ROC曲线,但是与P-R曲线的不同是,ROC曲线横轴使用的是“假正例率”,纵轴使用的是“真正例率”,我们同样可以写出它们的计算表达式。

  真正例率其实和查全率R一样,即
                                                  TPR=\frac{TP}{TP+FN}

而假正例率是
                                                FPR=\frac{FP}{TN+FP}

对于上面举的例子,TPR就是R,FPR就是

                                               FPR=\frac{10}{10+20}=0.33

分母其实就是实际的反例数目,所以如此我们也就可以绘制ROC曲线:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties

def plot(tpr,fpr):#画出函数图像
    fig = plt.figure()
    font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
    plt.xlabel('假正例率(FPR)',fontproperties=font)
    plt.ylabel('真正例率(TPR)',fontproperties=font)
    x = np.arange(0,1.1,0.2)
    y = np.arange(0,1.1,0.2)
    plt.xticks(x)
    plt.yticks(y)
    plt.plot(fpr,tpr)
    x1 = np.arange(0, 1.0, 0.1)
    plt.plot(x1, x1, color='blue', linewidth=2, linestyle='--')
    plt.show()


def caculate():

    tp = 0
    #初始化样本标签,假设1为正例,0为负例
    trainlabel = np.random.randint(0,2,size=100)

    #产生100个概率值(置信度),即单个样本值为正例的概率
    traindata = np.random.rand(100)

    #将样本数据为正例概率从大到小排序返回索引值
    sortedTraindata = traindata.argsort()[::-1]

    k = []
    v = []
    #统计样本中实际正例的数量
    num = np.sum(trainlabel==1)
    num1 = 100 - num
    for i in range(100):
        num_guess = i+1#假设为真的数量
        for j in range(0,i+1):
            a = sortedTraindata[j]
            if trainlabel[a] == 1:
                tp += 1#假设为真中实际也为真的数量
        fp = num_guess - tp
        fpr = float(fp/(num1))
        tpr = float(tp/(num))
        v.append(fpr)
        k.append(tpr)
        tp = 0
    plot(k,v)

if __name__=='__main__':
    caculate()

同样对于ROC的真正例率和假正例率sklearn库中也有函数可以实现,给出实现代码:
 

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties
from sklearn.metrics import roc_curve

def plot(fpr,tpr):#画出函数图像
    fig = plt.figure()
    font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
    plt.xlabel('假正例率(FPR)',fontproperties=font)
    plt.ylabel('真正例率(TPR)',fontproperties=font)
    x = np.arange(0,1.1,0.2)
    y = np.arange(0,1.1,0.2)
    plt.xticks(x)
    plt.yticks(y)
    plt.plot(fpr,tpr)
    x1 = np.arange(0,1.0,0.1)
    plt.plot(x1,x1,color='blue',linewidth=2,linestyle='--')
    plt.show()

def caculate():

    #初始化样本标签,假设1为正例,0为负例
    trainlabel = np.random.randint(0,2,size=100)

    #产生100个概率值(置信度),即单个样本值为正例的概率
    traindata = np.random.rand(100)

    fpr,tpr,thresholds = roc_curve(trainlabel,traindata)

    plot(fpr,tpr)

if __name__=='__main__':
    caculate()

运行结果:

5.小结

在二分类模型评估中,PR曲线和ROC曲线是常用的工具。本次实验报告的目的是比较PR曲线和ROC曲线的性能评估能力。我们通过绘制PR曲线和ROC曲线来分析模型的性能。PR曲线展示了召回率和精确度之间的关系,而ROC曲线则展示了真阳率和假阳率之间的关系。

从实验结果分析,我们可以得出以下结论:

  • ROC曲线适用于类别分布平衡或者注重降低误报率的情况。当我们关注模型的整体分类效果时,ROC曲线能够提供一个全面的性能评估。
  • PR曲线适用于类别分布不平衡或者注重少数类样本识别率的情况。当我们关注模型对少数类的预测准确率时,PR曲线能够更好地评估模型的性能。

此外,我们还需要考虑实际需求和模型的应用场景来选择合适的评估指标。如果我们更关注少数类的分类准确性,那么PR曲线可以帮助我们找到更适合的阈值。而如果我们更关注整体分类表现或模型的误报率,那么ROC曲线能够提供更全面的信息。

综上所述,PR曲线和ROC曲线都是重要的性能评估工具,可以帮助我们全面了解模型的分类能力。选择合适的曲线取决于类别分布、关注点以及模型应用的具体需求。

ROC曲线(Receiver Operating Characteristic Curve)和PR曲线Precision-Recall Curve)是在二分类问题中常用的评估模型性能的工具,它们有一些区别和特点。 1. 目标不同: - ROC曲线关注的是真正例率(True Positive Rate,即召回率)与假正例率(False Positive Rate)之间的权衡。ROC曲线展示了在不同阈值下,分类器的敏感性和特异性之间的关系。 - PR曲线则关注的是精确率(Precision)与召回率(Recall)之间的权衡。PR曲线展示了在不同阈值下,分类器的预测准确性和查全率之间的关系。 2. 数据分布不平衡时的表现: - ROC曲线对于数据分布不平衡的情况下相对稳定,因为它使用了假正例率作为横轴,而假正例率不受真实负例数量的影响。 - PR曲线在数据分布不平衡时更能准确地反映分类器的性能,因为它使用了精确率作为纵轴,能够展示在正例中的正确预测比例。 3. 敏感性不同: - ROC曲线能够展示分类器在整个概率范围内的性能,对于不同的阈值都可以进行评估。 - PR曲线则更关注分类器在高概率(高置信度)区域的性能,对于低概率的预测结果较为敏感。 总而言之,ROC曲线主要用于评估分类器的整体性能,特别是在样本不平衡的情况下,而PR曲线则更适用于评估分类器在正例预测方面的性能。根据具体问题和需求,选择合适的曲线进行模型性能评估。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值