我正在使用ROCR软件包评估R中的二进制分类器。我的分类器针对目标0/1标签输出了0到1之间的得分。
我想绘制精度并回想@ k,但找不到解决方法。在未指定x轴度量的情况下调用performance()
会通过分数截止来绘制精度值:
library(ROCR)
#df <- a two-dimensional dataframe with prediction scores and actual labels of my classifier
pred <- prediction(df$score, df$label)
pr_curve <- performance(pred, measure="prec")
对于k处的精度(或召回率),我需要针对每个预测的等级绘制精度,并按降序排列:
pred <- prediction(df$score, df$label)
pr_curve <- performance(pred, measure="prec", x.measure="rank") #but there seems to be no "rank" in ROCR!
在ROCR中有没有办法做到这一点?如果不是这种情况,我愿意使用替代库。
答案 0 :(得分:1)
加载库并定义训练和测试集:
library(mlbench)
library(e1071)
library(ROCR)
data(BreastCancer)
df = BreastCancer
idx = sample(1:nrow(df),150)
trn = df[idx,]
test = df[-idx,]
适合天真的贝叶斯
fit = naiveBayes(Class ~ .,data=trn)
在性能手册中,其写为
精确度/调用图:measure =“ prec”,x.measure =“ rec”。
绘图精确调用:
pred = prediction(predict(fit,test,type="raw")[,2],test$Class)
#plot to see it is working correctly:
plot(performance(pred,measure="prec",x.measure="rec"))
现在为您的情况在K处进行操作,我们还可以从头开始进行精确召回:
#combine prob, predicted labels, and actual labels
res = data.frame(prob=predict(fit,test,type="raw")[,2],
predicted_label=predict(fit,test),
label = test$Class)
res = res[order(res$prob,decreasing=TRUE),]
res$rank = 1:nrow(res)
# calculate recall, which is the number of actual classes we get back
res$recall = cumsum(res$label=="malignant")/sum(res$label=="malignant")
# precision, number of malignant cases we predicted correctly
res$precision = cumsum(res$label=="malignant")/res$rank
# check the two plots
par(mfrow=c(1,2))
plot(performance(pred,measure="prec",x.measure="rec"))
plot(res$recall,res$precision,type="l")
现在您已正确设置,在K处获得或绘制精度很简单:
par(mfrow=c(1,2))
with(res,
plot(rank,precision,main="self-calculated",type="l"))
plot(pred@n.pos.pred[[1]],
pred@tp[[1]]/(pred@fp[[1]]+pred@tp[[1]]),
type="l",main="from RORC")
我不知道使用.plot.performance函数的方法。但是您可以使用存储在预测对象下的变量。 pred @ tp是真阳性,pred @ fp是假阳性,因此tp / fp + fp给出精度,而pred@n.pos.pred本质上给出排名。