ROCR包......我没有得到什么?

时间:2016-05-17 02:09:14

标签: r roc

我正在使用R中的ROCR包测试一个简单的案例。基本上,这是我的代码。我有一组真值,对于每个值,我有一组预测,如果预测在| 2 |内,我的标签是1。的真实值,0,否则,像这样:

  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,即

> auc@y.values[[1]]
[1] 0

我的问题是,我做错了什么?显然,一些分类是“正确的”,那么为什么AUC应为零?我不明白的是什么?我的值是按ID排列的,即我假设它们是ID为1到5的人的测量值。是否存在一些我不考虑的排序问题?感谢。

2 个答案:

答案 0 :(得分:2)

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

这应该给你一个等于1的AUC,这与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")

输出:

> auc@yvalues[[1]]
[1] 1

切换标签会引发有关泄漏的问题,但我认为这不属于问题的范围。

编辑: AUC是可分性的度量​​,它是将随机正实例排序为高于随机负数的概率。 ROC曲线只是x:1-Specificity和y:灵敏度,给出了预测器分类的不同阈值。

所以,关于:

  

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

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

AUC越高,你的课程与预测者的分离就越多。叠加越多,AUC越低。

答案 1 :(得分:1)

要了解正在发生的事情,请绘制数据的方框图:

boxplot(preds ~ labels, data = df)

Boxplot of predictions as a function of labels

请注意0类的预测

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

  

[AUC]等于分类器排名a的概率   随机选择的正实例高于随机选择的   否定的(假设'正'排名高于'负')。 (1)

按照惯例,1通常会被视为正数,1则为负数。正如我们刚刚看到的那样,您的0 s,现在是正数,等级低于而不是负数(1 s),因此它们的概率为0。

您有3个选项:

一个。如果您的0是否定的,则ROCR会有1个参数:

label.ordering

B中。如果您的predtest <- prediction(df$preds, df$labels, label.ordering = c(1, 0)) auc <- performance(predtest, 'auc') auc@y.values[[1]] [1] 1 确实是肯定的,那么您可以撤消预测,以便积极性更高(注意1前面的-符号):

df$labels

℃。您还可以反转AUC的定义,以便成为分类器将随机选择的正实例 lower 排序为随机选择的负实例的概率。 predtest <- prediction(df$preds, -df$labels) auc <- performance(predtest, 'auc') auc@y.values[[1]] [1] 1 不支持此功能,但其他软件包会自动为您选择此功能。

最后,重要的不是你的AUC是高于还是低于0.5,而是距离对角线有多远。如果它低于0.5,或“比随机差”,你只需要改变你的解释,使其表现优于随机。