如何利⽤Matlab进⾏ROC分析
ROC曲线基本知识:
判断分类器的⼯作效率需要使⽤召回率和准确率两个变量。
召回率:Recall,⼜称“查全率”,
准确率:Precision,⼜称“精度”、“正确率”。
以判断病⼈是否死亡的分类器为例,可以把分类情况⽤下表表⽰:
实际死亡实际未死亡
分类为死亡A B
如何用matlab将已知点连线
分类为未死亡C D
表5-2
A:正确分类,命中死亡
B:错误分类,判断为死亡实际未死亡
C:错误分类,判断为未亡实际死亡
D:正确分类,判断未死亡,实际也未死亡
如果我们希望这个分类器对于死亡的判断能⼒⾮常⾼,也就是追求判断为死亡的命中率越⾼越好。更⼀般的说法,对于特定临床结局的判断能⼒越强越好,评价这个分类器能⼒的指标被称为召回率,也被称为“查全率”,即Recall = A/(A+C),召回率当然越⼤越好。
如果我们希望分类器对于死亡的预测能⼒更⾼,也就是分类为死亡的⼈死亡的概率最⼤。或者更⼀般的说法,对于特定临床结局的预测能⼒越强越好,这是追求“准确率”,即Precise = A/(A+B),越⼤越好。
在上⾯那个表格当中,由于样本总数⼀定,因此A+B和C+D的总数也是⼀定的,我们把改变分类规则,让A+B逐渐增⼤叫做判断标准放宽。将C+D数量增⼤叫做判断标准收严。
很容易可以看出,召回率反映的是在实际死亡的样本当中,分类为死亡的⼈所占的⽐例。如果我们把分类标准放宽,A+B变得很⼤,c会减⼩,甚⾄c=0直到“宁可错杀⼀千,也不放过⼀个”,有点危险的⼈统统算成死亡的⼈,则很可能获得较⾼的召回率。但是此时,准确率会逐渐降低。
准确率则是在判断为死亡的样本中,真实死亡的⼈所占的⽐例,如果我们把分类标准定得很严,仅把哪些⽣命体征极为微弱,伤情特别严重的⼈纳⼊判断为可能死亡的组,在这种情况下,准确率会变得很⾼,分类器判断为死亡的⼈⼤多活不了,但是此时分类器的召回率就会⼩得不可接受。因此,要对分类器的⼯作效能进⾏判断,需要同时考察准确率和召回率。两者均⾼,则分类器更好。
在不改变分类器基本性能的情况下,仅仅改变纳⼊参数的标准,就可以在同⼀数据集⾥⾯多次检查统计率和召回率,最后获得准确率(P)和召回率(R)之间的曲线。这条曲线上的每⼀个点和坐标(1,1)之间的距离可以⽤来判断出分类器的性能,如果这条曲线当中某⼀个点通过了坐标(1,1)也就是准确率和召回率都达到100%,那么此时分类标准就被称为“完美分类标准”
⼀般来说,如果分类器的⽬的是进⾏死亡筛查,出那些有可能死亡的患者重点关注,那么此时应当重视召回率(查全率),这样可以避免忽视那些有可能死亡的患者。⽽如果分类器的⽬的是为了做疾病诊断,那么则应该注意准确率,把太多的没有病死风险的患者判断为有风险则有可能影响⽤户对分类器的信⼼。
如果同时对召回率和准确率都有所要求,可以⽤经验测度值F来表⽰系统的⼯作效能。
F=2*P*R/(P+R)
F值越接近1,则系统的⼯作效能越⾼。
2.3.3ROC和AUC
回到ROC上来,ROC的全名叫做接收器⼯作特性曲线(Receiver Operating Characteristic)。
它由两个指标构成:
(⼀)真阳性率True Positive Rate ( TPR ) = A / A+C ,TPR代表能将正例分对的概率,也就是上⾯提到的查全率。
(⼆)假阳性率False Positive Rate( FPR ) = B /(B+D),FPR代表将负例错分为正例的概率。
在ROC 空间中,每个点的横坐标是假阳性率,纵坐标是真阳性率,这也就描绘了分类器在真阳性率和假阳性率之间的⼀个连续的权衡过程。ROC的主要分析⼯具是⼀个画在ROC空间的曲线——ROC curve。根据分类结果计算得到ROC空间中相应的点,连接这些点就形成ROC curve。ROC 曲线起点是(0,0),意味着某种异常严格的标准,使得没有任何样本被判断为阳性。终点是(1,1)意味着某种异常宽松的标准,使得任何样本不管真假,都被判断为阳性。实际上(0, 0)和(1, 1)连线形成的ROC curve就是⼀个随机分类器。⼀般情况下,这个曲线都应该处于(0, 0)和(1, 1)连线的上⽅。
⽤ROC curve来表⽰分类器性能很直观好⽤。可是,⼈们总是希望能有⼀个数值来标志分类器的好坏。
于是Area Under roc Curve(AUC)就出现了。顾名思义,AUC的值就是处于ROC curve下⽅的那部分⾯积的⼤⼩。通常,AUC的值介于0.5到1.0之间,较⼤的AUC代表了较好的性能。如果AUC的值仅仅只有0.5,那么则意味着这个分类器的性能和随机抛硬币类似。
建⽴好上述预测分类器之后,需要评估它的预测⼯作效率,也就是对于给定的⼊院患者数据,我们建⽴起来的分类器在多⼤程度上能够正确预测临床结局。
对于分类器或者预测器进⾏功能评估由⼀个很重要的⼀个因素是要防⽌“过度分类”。没有任何两个病⼈的⼊院数据是完全相同的。如果在已知临床结局的情况下去建⽴起⼀个区别病⼈⽣存和死亡的模型,如果纳⼊⾜够多的⼊院数据,很可能建⽴起⼀套⾮常“完美”的分类器,把已有的数据代⼊这个分类器可以准确的判断是临床结局。但是如果⼀旦有新数据进⼊这套分类器,那么判断结果往往就有可能出错。造成这种现象的原因是因为分类器构建出来的⽬的不是对已经发⽣的事情进⾏分类,⽽是对未发⽣的事情进⾏预测。纳⼊过多的变量,通过“事后诸葛亮”似的过程来对样本进⾏分类很有可能把⼀些在统计学上和样本结局相关,但实际上只是巧合的变量计算⼊数据建模当中,从⽽使得分类器的判断准确率变得很⾼。
有两类⽅法可以防⽌过度分类,⼀类是将数据训练集和测试集彻底分开,⽤新获得的数据来进⾏区分模型的准确性检验。⽽另外⼀种⽅法则是在构建训练集的时候进⾏交叉验证。所谓交叉验证就是,⽤
所有数据的⼀部分⽤作训练集。另外⼀⼩部分作为验证集。计算出分类器准确度。然后把原来作为验证集的数据纳⼊训练集,从训练集当中新画出⼀部分样本作为验证集。最后直到所有的样本都有机会纳⼊训练集和验证集当中。这样的⼀个过程就称为交叉验证(cross validation),交叉验证可以在样本有限的情况下获得尽可能稳定的分类结果。
ROC曲线在统计⼯具包当中是由perfcurve函数来决定的
典型的使⽤⽅法是:
[X,Y,T,AUC] = perfcurve(labels,scores,posclass)
输出部分X和Y表⽰的是ROC曲线的坐标,AUC表⽰曲线下⾯积,T表⽰thresholds,当T=1的时候表⽰存在⼀个分类标准,可以100%的将所有样本准确分类,特异度和敏感度都是100%。可以⽤plot(X,Y)来获得最简单的ROC曲线。
输⼊部分labels表⽰样本的真实分类,scores表⽰学习后的分类,posclass表⽰我们想要的研究对象的分类标记⽐如,当⽤于某个预测颅⾻性别的模型进⾏ROC判断的时候,预测男性和⼥性的ROC判别曲线是不⼀样的,posclass可以设置为'male' or 'female'。