首页 文章

使用ROCR包的R中的ROC曲线

提问于
浏览
22

有人可以解释一下如何用ROCR绘制ROC曲线 . 我知道我应该先跑:

prediction(predictions, labels, label.ordering = NULL)

然后:

performance(prediction.obj, measure, x.measure="cutoff", ...)

我不清楚预测和标签是什么意思 . 我创建了一个带有ctree和cforest的模型,我希望它们的ROC曲线最终能够进行比较 . 在我的例子中,class属性是y_n,我想这应该用于标签 . 但预测呢?以下是我所做的步骤(数据集名称= bank_part):

pred<-cforest(y_n~.,bank_part)
tablebank<-table(predict(pred),bank_part$y_n)
prediction(tablebank, bank_part$y_n)

运行最后一行后,我收到此错误:

Error in prediction(tablebank, bank_part$y_n) : 
Number of cross-validation runs must be equal for predictions and labels.

提前致谢!

这是另一个例子:我有训练数据集(bank_training)和测试数据集(bank_testing),我运行了一个randomForest,如下所示:

bankrf<-randomForest(y~., bank_training, mtry=4, ntree=2,    
keep.forest=TRUE,importance=TRUE) 
bankrf.pred<-predict(bankrf, bank_testing, type='response')

现在bankrf.pred是一个因子对象,标签为c =(“0”,“1”) . 不过,我不知道如何绘制ROC,因为我会陷入预测部分 . 这就是我的工作

library(ROCR) 
pred<-prediction(bankrf.pred$y, bank_testing$c(0,1)

但这仍然是不正确的,因为我收到错误消息

Error in bankrf.pred$y_n : $ operator is invalid for atomic vectors

6 回答

  • 24

    预测是您对分类的连续预测,标签是每个变量的二元真值 .

    所以类似下面这样的东西应该有效:

    > pred <- prediction(c(0.1,.5,.3,.8,.9,.4,.9,.5), c(0,0,0,1,1,1,1,1))
    > perf <- performance(pred, "tpr", "fpr")
    > plot(perf)
    

    生成ROC .

    编辑:在问题中包含样本可重现的代码可能会有所帮助(我很难解释您的评论) .

    这里没有新代码,但是......这是我经常用来绘制ROC的函数:

    plotROC <- function(truth, predicted, ...){
       pred <- prediction(abs(predicted), truth)    
       perf <- performance(pred,"tpr","fpr")
    
       plot(perf, ...)
    }
    
  • 0

    就像@Jeff所说,你的预测需要连续 ROCRprediction 功能 . require(randomForest); ?predict.randomForest 显示,默认情况下, predict.randomForest 返回原始比例的预测(分类中的类标签),而 predict.randomForest(..., type = 'prob') 返回每个类的概率 . 所以:

    require(ROCR)
    data(iris)
    iris$setosa <- factor(1*(iris$Species == 'setosa'))
    iris.rf <- randomForest(setosa ~ ., data=iris[,-5])
    summary(predict(iris.rf, iris[,-5]))
    summary(iris.preds <- predict(iris.rf, iris[,-5], type = 'prob'))
    preds <- iris.preds[,2]
    plot(performance(prediction(preds, iris$setosa), 'tpr', 'fpr'))
    

    给你你想要的 . 不同的分类包需要不同的命令来获得预测的概率 - 有时它是 predict(..., type='probs')predict(..., type='prob')[,2] 等,所以只需查看您正在调用的每个函数的帮助文件 .

  • 1

    这是你如何做到的:

    将我们的数据放在csv文件中(“data_file.csv”),但您可能需要在此处提供完整路径 . 在该文件中有列 Headers ,在这里我将使用“default_flag”,“var1”,“var2”,“var3”,其中default_flag为0或1,其他变量具有任何值 . R代码:

    rm(list=ls())
    df <- read.csv("data_file.csv") #use the full path if needed
    mylogit <- glm(default_flag ~  var1 + var2 + var3, family = "binomial" , data = df)
    
    summary(mylogit)
    library(ROCR)
    
    df$score<-predict.glm(mylogit, type="response" )
    pred<-prediction(df$score,df$default_flag)
    perf<-performance(pred,"tpr", "fpr")
    plot(perf)
    auc<- performance(pred,"auc")
    auc
    

    请注意,df $ score将为您提供默认概率 . 如果您想使用此logit(相同的回归系数)来测试另一个用于交叉验证的数据df2,请使用

    df2 <- read.csv("data_file2.csv")
    
    df2$score<-predict.glm(mylogit,newdata=df2, type="response" )
    
    pred<-prediction(df2$score,df2$default_flag)
    perf<-performance(pred,"tpr", "fpr")
    plot(perf)
    auc<- performance(pred,"auc")
    auc
    
  • 0

    问题是,正如其他人所指出的那样,ROCR中的预测需要数值 . 如果要从 randomForest 插入预测(作为ROCR中预测的第一个参数),则需要通过 type='prob' 而不是 type='response' 生成该预测,这是默认值 . 或者,你可以采取 type='response' 结果并转换为数字(也就是说,如果您的回答是,比如0/1) . 但是当你绘制它时,ROCR会在ROC曲线上生成一个有意义的点 . 为了在您的ROC曲线上有许多点,您确实需要与每个预测相关联的概率 - 即在生成预测时使用 type='prob' .

  • 4

    问题可能是您希望在多次运行中运行预测函数,例如用于交叉验证 .

    在这种情况下,对于预测(预测,标签,label.ordering = NULL)函数,“预测”和“标签”变量的类应该是列表或矩阵 .

  • 7

    试试这个:

    library(ROCR)
    pred<-ROCR::prediction(bankrf.pred$y, bank_testing$c(0,1)
    

    功能预测存在许多包 . 您应该明确指定(ROCR::)以使用ROCR中的那个 . 这个对我有用 .

相关问题