如何使用r,*中的ROCR包绘制ROC曲线,仅使用分类列联表*

Wil*_*Liu 6 plot r classification roc

如何在r中使用ROCR包绘制ROC曲线,只有一个分类列联表

我有一个列联表,其中真正的正面,误报等等.所有额定值都可以计算出来.我有500个复制,因此有500个表.但是,我无法生成指示每个估计概率和真值的单个案例的预测数据.如何在没有单个数据的情况下获得曲线.以下是使用的包指令.

## computing a simple ROC curve (x-axis: fpr, y-axis: tpr)
library(ROCR)
data(ROCR.simple)
pred <- prediction( ROCR.simple$predictions, ROCR.simple$labels)
perf <- performance(pred,"tpr","fpr")
plot(perf)    
Run Code Online (Sandbox Code Playgroud)

jos*_*ber 13

您不能使用单个列联表生成完整的ROC曲线,因为列联表仅提供单个敏感度/特异性对(对于用于生成列联表的任何预测截止值).

如果您有许多使用不同截止值生成的列联表,您将能够近似ROC曲线(基本上它将是您的列联表中的灵敏度/特异性值之间的线性插值).例如,让我们考虑使用逻辑回归来预测虹膜数据集中的花是否是多色的:

iris$isv <- as.numeric(iris$Species == "versicolor")
mod <- glm(isv~Sepal.Length+Sepal.Width, data=iris, family="binomial")
Run Code Online (Sandbox Code Playgroud)

我们可以使用标准ROCR代码来计算此模型的ROC曲线:

library(ROCR)
pred1 <- prediction(predict(mod), iris$isv)
perf1 <- performance(pred1,"tpr","fpr")
plot(perf1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在让我们假设mod我们拥有的是具有预测值的多个截止值的列联表:

tables <- lapply(seq(0, 1, .1), function(x) table(iris$isv, factor(predict(mod, type="response") >= x, levels=c(F, T))))

# Predict TRUE if predicted probability at least 0
tables[[1]]
#     FALSE TRUE
#   0     0  100
#   1     0   50

# Predict TRUE if predicted probability at least 0.5
tables[[6]]
#     FALSE TRUE
#   0    86   14
#   1    29   21

# Predict TRUE if predicted probability at least 1
tables[[11]]
#     FALSE TRUE
#   0   100    0
#   1    50    0
Run Code Online (Sandbox Code Playgroud)

从一个表到下一个表,由于截止增加,一些预测从TRUE变为FALSE,并且通过比较连续表的第1列,我们可以确定哪些表示真正的否定和假阴性预测.通过我们有序的列联表列表迭代,我们可以创建假的预测值/结果对,我们可以将其传递给ROCR,确保我们匹配每个列联表的灵敏度/特异性.

fake.info <- do.call(rbind, lapply(1:(length(tables)-1), function(idx) {
  true.neg <- tables[[idx+1]][1,1] - tables[[idx]][1,1]
  false.neg <- tables[[idx+1]][2,1] - tables[[idx]][2,1]
  if (true.neg <= 0 & false.neg <= 0) {
    return(NULL)
  } else {
    return(data.frame(fake.pred=idx,
                      outcome=rep(c(0, 1), times=c(true.neg, false.neg))))
  }
}))
Run Code Online (Sandbox Code Playgroud)

现在我们可以像往常一样将伪造的预测传递给ROCR:

pred2 <- prediction(fake.info$fake.pred, fake.info$outcome)
perf2 <- performance(pred2,"tpr","fpr")
plot(perf2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

基本上我们所做的是对ROC曲线上的点进行线性插值.如果您有许多临界值的列联表,您可以更接近真实的ROC曲线.如果您没有多种截止值,则无法准确再现完整的ROC曲线.