【问题标题】:ROC curve in R using ROCR package使用 ROCR 包的 R 中的 ROC 曲线
【发布时间】:2012-07-13 03:34:28
【问题描述】:

谁能解释一下如何用 ROCR 绘制 ROC 曲线。 我知道我应该先运行:

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

然后:

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

我只是不清楚预测和标签是什么意思。我用 ctree 和 cforest 创建了一个模型,我希望他们两个的 ROC 曲线最后进行比较。在我的例子中,类属性是 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),我运行了一个随机森林,如下所示:

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

【问题讨论】:

  • 如果您提供了一个完整的、独立的示例,您可能会获得可以帮助您的更广泛的受众。请参阅stackoverflow.com/questions/5963269/… 了解有关如何执行此操作的一些提示。

标签: r roc


【解决方案1】:

预测是您对分类的连续预测,标签是每个变量的二元事实。

所以应该像下面这样工作:

> 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, ...)
}

【讨论】:

  • edit我还是不明白。这是另一个例子:我有训练数据集(bank_training)和测试数据集(bank_testing),我运行了一个随机森林,如下所示:bankrf
【解决方案2】:

问题可能是您希望多次运行预测函数,例如交叉验证。

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

【讨论】:

    【解决方案3】:

    就像@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] 等,因此只需查看您正在调用的每个函数的帮助文件。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        你可以这样做:

        将我们的数据保存在 csv 文件中,("data_file.csv") 但您可能需要在此处提供完整路径。在该文件中有列标题,我将在这里使用 “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
        

        【讨论】:

          【解决方案6】:

          试试这个:

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

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

          【讨论】:

            猜你喜欢
            • 2016-05-26
            • 2019-03-16
            • 2017-06-09
            • 2015-08-29
            • 2015-04-11
            • 2016-09-29
            • 2012-12-14
            • 2016-08-18
            • 1970-01-01
            相关资源
            最近更新 更多