zoukankan      html  css  js  c++  java
  • 模型指标混淆矩阵,accuracy,precision,recall,prc,auc

    一、混淆矩阵

    T和F代表是否预测正确,P和N代表预测为正还是负

    这个图片我们见过太多次了,但其实要搞清楚我们的y值中的1定义是什么,这样就不会搞错TP、FP、FN、TN的顺序,比如说下面的混淆矩阵:

    [[198985 29]
    [ 73 277]]

    y(真实).value_counts():

    0: 199014
    1:  350

    y(测试).value_counts()

    0 :199058
    1 :  306

    我们就会先入为主认为第一个就是TP,但其实277才是我们的TP,所以首要任务是要搞清楚我们的Y值等于1是属于哪一类,弄清楚这些,下面的就容易搞清楚了

    二、模型评估指标

    首先来看下这个图片

     1.准确率(accuracy):

    分类正确的样本占总样本个数的比例

    使用上面的例子就是:(198985+277)/(198985+29+73+277)=0.9994883730262234

    值得注意的是,这个指标在数据极度倾斜的时候是没有任意意义的,比如说好坏用户是100:1,全部预测为好用户,那么准确率就是100/101=0.9900990099009901

    2.精确度(precision):

    预测是1类的且真实情况也是1类/预测是1类的

    使用上面的例子就是:277/306=0.9052287581699346

    在数据倾斜的时候,比如说好坏用户是100:1,全部预测为好用户,那么精确度是0,说明还是有点用处的

    简单来说就是叫你找出坏人,你确实找出一帮人,你找出这帮人中真正是坏人的比例,着重的是你捉到的这批人,不要冤枉太多好人

    precision是相对你自己的模型预测而言:true positive /retrieved set。假设你的模型一共预测了100个正例,而其中80个是对的正例,那么你的precision就是80%。我们可以把precision也理解为,当你的模型作出一个新的预测时,它的confidence score 是多少,或者它做的这个预测是对的的可能性是多少


    一般来说呢,鱼与熊掌不可兼得。如果你的模型很贪婪,想要覆盖更多的sample,那么它就更有可能犯错。在这种情况下,你会有很高的recall,但是较低的precision。如果你的模型很保守,只对它很sure的sample作出预测,那么你的precision会很高,但是recall会相对低

    3.召回率(recall):

    预测是1类的且真实情况也是1类/真实情况也是1类的

    使用上面的例子就是:277/350=0.7914285714285715

    在数据倾斜也是有用的,这里不展开了

    主要说一些召回率有什么作用:反正就类似于宁可错杀三千,也不放一个的意思

    简单来说就是叫你找出坏人,你确实找出一帮人,捉到正确坏人 占真实总坏人占比,着重的是捉到多少个真正的坏人,多多益善,只要涵盖的坏人足够多,所以这二者不能单独使用

    recall是相对真实的答案而言: true positive / golden set 。假设测试集里面有100个正例,你的模型能预测覆盖到多少,如果你的模型预测到了40个正例,那你的recall就是40%

    4.F1分数

     

     F1值是精度和召回率的调和平均值

    F1-score 就是一个综合考虑precision和recall的metric: 2*precision*recall / (precision + recall)

    基本上呢,问题就是如果你的两个模型,一个precision特别高,recall特别低,另一个recall特别高,precision特别低的时候,f1-score可能是差不多的,你也不能基于此来作出选择。

    三、精度-召回率曲线PRC curve

    下面是两个场景:
    1. 地震的预测
    对于地震的预测,我们希望的是RECALL非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲PRECISION。情愿发出1000次警报,把10次地震都预测正确了;也不要预测100次对了8次漏了两次。
    2. 嫌疑人定罪
    基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。及时有时候放过了一些罪犯(recall低),但也是值得的。

    对于分类器来说,本质上是给一个概率,此时,我们再选择一个CUTOFF点(阀值),高于这个点的判正,低于的判负。那么这个点的选择就需要结合你的具体场景去选择。反过来,场景会决定训练模型时的标准,比如第一个场景中,我们就只看RECALL=99.9999%(地震全中)时的PRECISION,其他指标就变得没有了意义。

    如果只能选一个指标的话,肯定是选PRC了。可以把一个模型看的一清二楚。

    下面就开始介绍一下数据极度倾斜时候使用的指标PRC

    PRC曲线(Precision-Recall curve)和ROC曲线类似,ROC曲线是FPR和TPR的点连成的线,PRC曲线是准确率和召回率的点连成的线,如下图所示

     先看平滑不平滑(蓝线明显好些),在看谁上谁下(同一测试集上),一般来说,上面的比下面的好(绿线比红线好)。
    F1(计算公式略)当P和R接近就也越大,一般会画连接(0,0)和(1,1)的线,线和PRC重合的地方的F1是这条线最大的F1(光滑的情况下),此时的F1对于PRC就好象AUC对于ROC一样。一个数字比一条线更方便调模型。

     四、ROC曲线和AUC

    AUC是现在分类模型,特别是二分类模型使用的主要离线评测指标之一。相比于准确率、召回率、F1等指标,AUC有一个独特的优势,就是不关注具体得分,只关注排序结果,这使得它特别适用于排序问题的效果评估,例如推荐排序的评估。AUC这个指标有两种解释方法,一种是传统的“曲线下面积”解释,另一种是关于排序能力的解释。例如0.7的AUC,其含义可以大概理解为:给定一个正样本和一个负样本,在70%的情况下,模型对正样本的打分高于对负样本的打分。可以看出在这个解释下,我们关心的只有正负样本之间的分数高低,而具体的分值则无关紧要

    接下来我们考虑ROC曲线图中的四个点和一条线。

    第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false positive)=0。Wow,这是一个完美的分类器,它将所有的样本都正确分类。

    第二个点,(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。

    第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。

    第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好。

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

    AUC值的高低意味着什么

    那么AUC值的含义是什么呢?根据(Fawcett, 2006),AUC的值的含义是:> The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.

    这句话有些绕,我尝试解释一下:首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。当然,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。

    AUC值越大的分类器,正确率越高。

    从AUC判断分类器(预测模型)优劣的标准:

    Concerning the AUC, a simple rule of thumb to evaluate a classifier based on this summary value is the following:

    • .90-1 = very good (A)
    • .80-.90 = good (B)
    • .70-.80 = not so good (C)
    • .60-.70 = poor (D)
    • .50-.60 = fail (F)
    • AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。

    • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。

    • AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。

    • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测,因此不存在AUC < 0.5的情况。

    ROC曲线的PRC曲线的区别和联系

    ROC曲线和PR曲线的关系

    ROC曲线越左上凸效果越好,PR曲线是右上凸效果越好。
    ROC和PR曲线都被用于评估机器学习算法对一个给定数据集的分类性能,每个数据集都包含固定数目的正样本和负样本。
    定理1:对于一个给定的包含正负样本的数据集,ROC空间和PR空间存在一一对应的关系,也就是说,如果recall不等于0,二者包含完全一致的混淆矩阵。我们可以将ROC曲线转化为PR曲线,反之亦然。
    定理2:对于一个给定数目的正负样本数据集,一条曲线在ROC空间中比另一条曲线有优势,当且仅当第一条曲线在PR空间中也比第二条曲线有优势。(这里的“一条曲线比其他曲线有优势”是指其他曲线的所有部分与这条曲线重合或在这条曲线之下。)

    ROC曲线和PRC曲线的对比

    ROC曲线相对的优势

    既然已经这么多评价标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

    roc曲线不变原因:TPR和FPR是实际label内部的操作,看混淆矩阵和tpr、fpr计算公式,无论实际label比例怎么变化,tpr、fpr计算公式都是在实际为p或者n的内部计算的。

    下图是ROC曲线和Precision-Recall曲线的对比:

    在上图中,(a)和(c)为ROC曲线,(b)和(d)为Precision-Recall曲线。(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)和(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果。可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。

    也就是

    PR曲线会面临一个问题,当需要获得更高recall时,model需要输出更多的样本,precision可能会伴随出现下降/不变/升高,得到的曲线会出现浮动差异(出现锯齿),无法像ROC一样保证单调性。

    real world data经常会面临class imbalance问题,即正负样本比例失衡。根据计算公式可以推知,在testing set出现imbalance时ROC曲线能保持不变,而PR则会出现大变化。引用图(Fawcett, 2006),(a)(c)为ROC,(b)(d)为PR,(a)(b)样本比例1:1,(c)(d)为1:10。

    结论:AUC用得比较多的一个重要原因是,实际环境中正负样本极不均衡,PR曲线无法很好反映出分类器性能,而ROC受此影响小。

    PRC相对的优势

    当正负样本差距不大的情况下,ROC和PR的趋势是差不多的,但是当负样本很多的时候,两者就截然不同了,ROC效果依然看似很好,但是PR上反映效果一般。解释起来也简单,假设就1个正例,100个负例,那么基本上TPR可能一直维持在100左右,然后突然降到0.如图,(a)(b)分别为正负样本1:1时的ROC曲线和PR曲线,二者比较接近。而(c)(d)的正负样本比例为1:1,这时ROC曲线效果依然很好,但是PR曲线则表现的比较差。这就说明PR曲线在正负样本比例悬殊较大时更能反映分类的性能。

    在正负样本分布得极不均匀(highly skewed datasets)的情况下,PRC比ROC能更有效地反应分类器的好坏。

    单从图a看,这两个分类器都接近完美(非常接近左上角)。图b对应着相同分类器的PR space。而从图b可以看出,这两个分类器仍有巨大的提升空间。那么原因是什么呢? 通过看Algorithm1的点 A,可以得出一些结论。首先图a和b中的点A是相同的点,只是在不同的空间里。因为TPR=Recall=TP/(TP+FN),换言之,真阳性率(TPR)和召回率(Recall)是同一个东西,只是有不同的名字。所以图a中TPR为0.8的点对应着图b中Recall为0.8的点。

    假设数据集有100个positive instances。由图a中的点A,可以得到以下结论:TPR=TP/(TP+FN)=TP/actual positives=TP/100=0.8,所以TP=80由图b中的点A,可得:Precision=TP/(TP+FP)=80/(80+FP)=0.05,所以FP=1520再由图a中点A,可得:FPR=FP/(FP+TN)=FP/actual negatives=1520/actual negatives=0.1,所以actual negatives是15200。

    由此,可以得出原数据集中只有100个positive instances,却有15200个negative instances!这就是极不均匀的数据集。直观地说,在点A处,分类器将1600 (1520+80)个instance分为positive,而其中实际上只有80个是真正的positive。 我们凭直觉来看,其实这个分类器并不好。但由于真正negative instances的数量远远大约positive,ROC的结果却“看上去很美”。所以在这种情况下,PRC更能体现本质。

    结论: 在negative instances的数量远远大于positive instances的data set里, PRC更能有效衡量分类器的好坏。

    如果ROC曲线面积差不多时,当然使用PRC曲线来比较两个分类算法的好坏;反之亦然。如果ROC和PRC都差不多的话那就看测试集上的PRC吧。毕竟PRC和ROC可以相互转化有很大关联的(见前面的“ROC曲线和PR曲线的关系”)。

    但是lz建议在样本不均衡时最好使用ROC曲线来评估,更准确也是业内常用的。prc可能也可以,但是绝对不能只使用precision或者recall!

    文章参考:https://blog.csdn.net/pipisorry/article/details/51788927

  • 相关阅读:
    js获取宽和高
    弹出一个登录层,并对登录进行校验
    存储过程事务处理
    C# 冒泡算法
    正则表达式30分钟入门教程
    生成树的两种递归方式
    (转)再说ActionMessages类及其用法
    java.io.IOException:stream closed 异常的原因及处理
    log4j学习
    struts1.x的国际化
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/14441436.html
Copyright © 2011-2022 走看看