2012-07-13 209 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中的那個。這一個爲我工作。