2016-05-17 58 views
1

我正在使用R中的ROCR软件包测试一个简单的案例。基本上,这里是我的代码。我有一组真值,对于每个值,我有一组预测值,如果预测在| 2 |真正的价值,否则为0,像这样的:ROCR包...我没有得到什么?

ID<- c(1,2,3,4,5) 
    preds<-c(6,3,2,1,4) 
    truevals<- c(8,4,2,1,7) 
    df<-data.frame(ID, preds,truevals) 
    df<- mutate(df, labels = ifelse(abs(df$preds - df$truevals) < 2, 1, 0)) 
    predtest<-prediction(df$preds, df$labels) 
    auc <- performance(predtest, 'auc') 

但我的计算AUC为0,即

> [email protected][[1]] 
[1] 0 

我的问题是,我究竟做错了什么?显然,有些分类是“正确的”,那么为什么AUC应该是零呢?我不了解什么?我的价值观以ID排列,即我假设他们是ID为1至5的人的衡量标准。有没有我不考虑的订购问题?谢谢。

+0

这两个很好的答案 – roccomay

回答

1

要理解这是怎么回事,请你数据的箱线图:

boxplot(preds ~ labels, data = df) 

Boxplot of predictions as a function of labels

通知上0类的预测是如何更高比那些1类的。

现在来看从维基百科AUC的定义:

[该AUC]等于的概率分类器的排名将一个 随机选择的正实例不是随机选择的 负一更高(假设'积极'排名高于'消极')。 (1)

现在按照惯例,1旨意通常被认为是阳性,并0小号底片。正如我们刚才看到,你1 S,现在是阳性,秩比底片(0秒)慢,这样的概率,他们是高是0

你有3种选择:

A.如果您1 s为负面,ROCR有label.ordering说法:

predtest <- prediction(df$preds, df$labels, label.ordering = c(1, 0)) 
auc <- performance(predtest, 'auc') 
[email protected][[1]] 
[1] 1 

B.如果你1 s为确实是阳性,你可以扭转你的预测,这样阳性较高(注意- SIG n的的df$labels前):

predtest <- prediction(df$preds, -df$labels) 
auc <- performance(predtest, 'auc') 
[email protected][[1]] 
[1] 1 

C.你也可以反转AUC的定义,以便成为概率分类器的排名将随机选择的正实例比随机选择的负一个下ROCR不支持此功能,但其他软件包可能会自动为您选择此功能。最后,最重要的不是你的AUC是高于还是低于0.5,而是距离对角线有多远。如果它低于0.5,或“比随机差”,则只需将您的解释反转为比随机更好。

2

您的数据是明显可分的。 pred 1到3去label 1和4和6去标签0.

这应该会给你一个AUC等于1,这与AUC为0相同。这只是一个参考问题。

下面是一个例子:

library(ROCR) 
ID = c(1,2,3,4,5) 
preds = c(6,3,2,1,4) 
truevals = c(8,4,2,1,7) 
df = data.frame(ID, preds,truevals) 
df = mutate(df, labels = ifelse(abs(df$preds - df$truevals) < 2, 1, 0)) 
#Changing the labels is just a matter of reference 
#the algorithm is oblivious to their meaning 
df$labels = 1 - df$labels 
predtest = prediction(df$preds, df$labels) 
auc = performance(predtest, "auc") 

输出:

> [email protected][[1]] 
[1] 1 

切换标签提出了关于泄漏的问题,虽然,但我想这不是问题的范围之内。

编辑: AUC是一种可分性的度量​​,它是您将随机正实例排名高于随机负实例的概率。 ROC曲线简单地为x:1-特异性和y:灵敏度,给出不同的预测器分类阈值。

所以,关于:

[...]如果我有一个值的任意一组和一组 这些值的预测,我怎么ROC曲线?我很困惑。我认为 预测越接近,越好?我只是不知道该怎么做 这个。我不知道如何将类分配给真正的值。不要 有需要排名的某种?

你有一套二进制分类数据,也是一个连续预测器。现在在预测器中设置一个阈值,将观测值高于一个类别的阈值或其他类别的观测值。测量特异性和灵敏度,并在曲线上标记该点。尝试其他阈值(有限数量的可能性可以改变Sens和Spec)并绘制曲线中的这些点。这是ROC曲线。

AUC越高,您的班级与预测变量的分离程度越高。它们叠加的越多,AUC就越低。

+0

咦?这没有帮助。当我绘制ROC曲线时,它低于对角线。这不可能是正确的。 – roccomay

+0

但是这些标签是为了表示预测是否有效......如果我没有可分离的数据呢?这将如何改变? – roccomay

+0

0.5是无鉴别线a.k.a随机机会预测的AUC。这是最糟糕的结果。 –

相关问题