首页 > 编程知识 正文

roc曲线怎么绘制数据挖掘,多分类变量 能用roc曲线吗

时间:2023-05-03 12:18:27 阅读:164371 作者:1016

ROC曲线的深度挖掘(截断值的计算) r语言首先模糊矩阵1 )模糊矩阵的计算精度为什么需要计算截断值的重要部分) AUC计算和截断值定义1 )什么是最佳截断值2 )最大F1值的截断值(f1-optimime )

前言

ROC曲线往往用于评估二分类问题,通过选择适当的截止值(阈值threshold )可得到AUC。 但是,在很多情况下,我们只是简单地调整数据包计算AUC,画出ROC曲线,往往忽略其原理和最佳阈值的筛选。 同时,笔者最近的项目需要复习这些细节,所以要写作积累。 (本论文不是实际用途,如果想只拿出结果的话请参阅这里。 ROC曲线基于r语言)

混淆矩阵是为了计算混淆(准确度、敏感性、FPR )、规范、准确度和TPR )所必须的路径。 让我们看一个具体说明模糊矩阵的例子。 这是根据r语言的CrossTable计算出来的。

| prediction test $ label|0|1|row total|----------------- label|0|1|9|44

http://www.Sina.com/: true positive代表真的例子,其实际值与预测值相匹配,且两者都为正的例子。http://www.Sina.com/: false negative代表假的负的例子: falsepositive,表示假正例,预测值与实际值不一致)预测值为正,实际为负) http://www.Sina.com/: true negative,表示真负例

在此示例中,您将看到以下内容

TP=44;FN=9;FP=7;TN=41 1.基于模糊矩阵的精度计算

一般来说,如果得到模糊矩阵,则可以基于上述公式计算精度等分类指标。 当然,所有这一切前提都需要一个像样的混淆矩阵,需要定义一个截断值。

为什么需要计算截止值,其实这个问题根据情况而定。 而且,很多r语言软件包都避开了这个问题。 这里举例说明:

假设有两个数组。 一个表示预测值,另一个表示实际值

predict test.label 112013141151601上述是最佳状况,也是最理想的状况。 为什么这么说呢,因为反例和正例极其明显,只要判断是1还是0就能得到结论。 遗憾的是,许多分类器计算的值往往是概率值,特别是对于随机森林、boosting这样的集成学习,问题就没那么简单了。

p.p1 test.label 10.9327975120.8683321130.9916318140.936314115.997594416.9124761上在此图中,p.P1表示正例概率,区间是(无法直观判断哪个样本是正例,哪个又应该是负例。 确实,人们毫不费力地假设阈值高于0.5、0.5为正例,低于0.5为负例,为TP,从而误判模型性能的情况也不少(在后续例子中进行论述)。 因此,需要用适当的方法计算截断值,并用于AUC的计算。

重点部分: AUC计算和截止值的定义1 .最佳截止值如上所述,虽然知道了截止值不能单纯用0.5来定义,但是什么是最佳截止值,该如何计算呢? 现在,很多r语言的包和

论文的查阅,笔者仅总结下述几种方法:

最大F1值的截断值(F1-optimal threshold) — 来源:h2o包针对AUC的计算最hcdgb+specificities – 来源:R语言机器学习的一本书

在计算截断值时,我们往往需要知道一个图像,即ROC曲线,这个图以sensitivities和1-specificities为横纵轴,AUC则为曲线围成的面积。可能读者很难将截断值和ROC曲线联想起来,这里通过一个例子阐释:

[thresholds] [sensitivities] [specificities][1,] -Inf 1 0.00000000[2,] 0.001026790 1 0.02083333[3,] 0.001237295 1 0.04166667[4,] 0.001428533 1 0.06250000[5,] 0.001587942 1 0.08333333[6,] 0.001710115 1 0.10416667[97,] 0.9991705 0.09433962 1[98,] 0.9994262 0.07547170 1[99,] 0.9994731 0.05660377 1[100,] 0.9995572 0.03773585 1[101,] 0.9996690 0.01886792 1[102,] Inf 0.00000000 1

第一列是阈值,第二列是sensitivities,第三列是specificitie。随着阈值的逐渐变大(从0-1),我们发现sensitivities在逐渐变小,而specificities在逐渐变大。我们取极端情况考虑,当阈值为0时,大于0的全为正例,即模型能完美的找出所有正例(敏感性=1),但很可惜,所有的负例也被定义为正例,故特异性=0,反之阈值=1时也成立。在正常情况下,我们肯定不愿意让模型瞎猜乱蒙,故我们需要一种均衡(统计优化),类似于方差-残差均衡(但现实情况不一定完全一致),我们希望二者都能同时达到相对最优的状态。

2.最大F1值的截断值(F1-optimal threshold)

这个方法来自于h2o包中的h2o.auc()函数,F1值能同时考虑sensitivities和specificities,当F1值取得最大值时,便定义该阈值为最佳阈值:

R语言代码如下:

######test$label为实际值,p$p1为正例或者负例的概率####library(pROC)library(gmodels)r<-roc(test$label,p$p1,auc=T,thres=TRUE)##F1值的计算F1<-2*(r$sensitivities*r$specificities)/(r$sensitivities+r$specificities)##选取最大的F1值e<-cbind(r$thresholds,F1)best<-subset(e,e[,2]==max(e[,2]))[,1]best<-as.numeric(best)##进行截断并计算混淆矩阵p[p$p1<best,]<-0p[p$p1>=best,]<-1a<-CrossTable(test$label,p$p1,prop.c = F,prop.t = F,prop.chisq = F) 3.最hcdgb+specificities

简单粗暴的方法,反正二者加起来最大就行了。个人感觉该方法不太严谨,特别是当模型表现并不佳时,或者通过最大化sensitivities*specificities可能会更加科学。
R语言代码如下:

######test$label为实际值,p$p1为正例或者负例的概率####library(pROC)library(gmodels)r<-roc(test$label,p$p1,auc=T,thres=TRUE)##F1值的计算Sum<-r$sensitivities+r$specificities##选取最大的F1值e<-cbind(r$thresholds,Sum)best<-subset(e,e[,2]==max(e[,2]))[,1]best<-as.numeric(best)##进行截断并计算混淆矩阵p[p$p1<best,]<-0p[p$p1>=best,]<-1a<-CrossTable(test$label,p$p1,prop.c = F,prop.t = F,prop.chisq = F) ROC曲线绘制

在解决了截断值的问题后,曲线绘制的问题也就迎刃而解了,ROC曲线是以1-specificities和specificities为横纵轴的,通过上文计算出的数组,我们便能通过简单的plot命令画出ROC曲线:

library(pROC)library(gmodels)r<-roc(test$label,p$p1,auc=T,thres=TRUE)e<-cbind(r$thresholds,r$sensitivities,r$specificities)plot(x=1-e[,2],y=e[,3],type='o')

而AUC便是二者之间的面积,这个通过roc函数便能计算出来。若对ROC曲线的美观性和可读性有更高的要求,可以参考我的另一篇博客:ROC曲线基于R语言

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。