2012-07-13 201 views
21

有人可以解释我怎么用ROCR绘制ROC曲线。 我知道,我应该首先运行:使用ROCR软件包R的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)和我跑了随机森林如下:

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 = A因子对象(“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 
+5

如果您提供了一个完整的自包含示例,则可能会有更多的受众可以帮助您。请参阅http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example关于如何做到这一点的一些提示。 – 2012-07-13 10:14:57

回答

23

的预测是你的分类的连续预测,标签是每个变量的二进制真相。

所以像下面应该工作:

> 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

[编辑]我仍然不明白。下面是另一个示例:我有训练数据集(bank_training)和测试数据集(bank_testing)和我跑了随机森林如下: bankrf <-randomForest(Y〜,bank_training,mtry = 4,ntree = 2, 保.forest = TRUE,重要性= TRUE) bankrf.pred <-predict(bankrf,bank_testing) 库(ROCR) 预计值< - 预测(bankrf.pred $ Y,bank_testing $ Y) 但这仍然不正确,导致我收到预测格式有误的错误消息。 – spektra 2012-07-13 13:12:12

0

的问题可能是你想上运行多个运行预测功能交叉验证的例子。

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

7

像@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

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

4

这是你如何做到这一点:

有我们的数据在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 $分数会给你违约的可能性。 如果你想用这个分对数(同回归系数)来测试另一个数据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

试试这个:

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

功能预测目前是很多包。您应该明确指定(ROCR::)以使用ROCR中的那个。这一个为我工作。