首先介绍一下几个基本概念:
- 预测值为正例,记为P(Positive)
- 预测值为反例,记为N(Negative)
- 预测值与真实值相同,记为T(True)
- 预测值与真实值相反,记为F(False)
TP
- :预测类别是P(正例),真实类别也是P
FP
- :预测类别是P,真实类别是N(反例)
TN
- :预测类别是N,真实类别也是N
FN
- :预测类别是N,真实类别是P
- 所以,tpr就是真正例,fpr就是假正例
- ROC曲线是显示Classification模型真正率和假正率之间折中的一种图形化方法。
解读ROC图的一些概念定义::
真正(True Positive , TP)被模型预测为正的正样本;
假负(False Negative , FN)被模型预测为负的正样本;
假正(False Positive , FP)被模型预测为正的负样本;
真负(True Negative , TN)被模型预测为负的负样本。 - 真正率(True Positive Rate , TPR)或灵敏度(sensitivity)
- TPR = TP /(TP + FN) (正样本预测结果数 / 正样本实际数)
- 假负率(False Negative Rate , FNR)
- FNR = FN /(TP + FN) (被预测为负的正样本结果数 / 正样本实际数 )
- 假正率(False Positive Rate , FPR)
- FPR = FP /(FP + TN) (被预测为正的负样本结果数 /负样本实际数)
- 真负率(True Negative Rate , TNR)或特指度(specificity)
- TNR = TN /(TN + FP) (负样本预测结果数 / 负样本实际数)
然后用ROCR包画ROC曲线,但是ROCR包画图函数功能比较单一
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter6/示例程序")
# 读取数据
testData <- read.csv("./data/testData.csv")
# 读取模型,tree.model 和nnet.model分别是已建立的决策树和神经网络的模型
load("./tmp/tree.model.RData")
load("./tmp/nnet.model.RData")
library(ROCR) # 加载ROCR包
# 画出神经网络模型的ROC曲线
nnet.pred <- prediction(predict(nnet.model, testData), testData$class)#括号内是预测分类结果和实际分类结果
performance(nnet.pred ,'auc')@y.values #AUC值,ROC曲线下面积为AUC,用来评价分类器的综合性能,该数值取0-1之间,越大越好。 nnet.perf <- performance(nnet.pred, "tpr", "fpr")
或者 nnet.perf < - performance(nnet.pred,'auc',"tpr","fpr")
plot(nnet.perf)
# 画出CART决策的ROC曲线
tree.pred <- prediction(predict(tree.model, testData)[, 2], testData$class)
tree.perf <- performance(tree.pred, "tpr", "fpr")
plot(tree.perf)
接着利用pROC包画出ROC曲线,可以方便在一个图上比较两个分类器,实现两条ROC曲线画在同一个坐标轴内。
library(pROC)
modelroc <- roc(newdata$y,pre) #括号内为实际分类结果和预测分类结果。
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),
grid.col=c("green", "red"), max.auc.polygon=TRUE,
auc.polygon.col="skyblue", print.thres=TRUE)
library(pROC)
数据使用包自带数据库
data(aSAH)
roc1 <- plot.roc(aSAH$outcome, aSAH$s100, main="Statistical comparison", percent=TRUE, col="1")
ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真正率(灵敏度)为纵坐标,假正率(1-特异度)为横坐标绘制的曲线。
roc2 <- lines.roc(aSAH$outcome, aSAH$ndka, percent=TRUE, col="2")
testobj<- roc.test(roc1,roc2)
text(50, 50, labels=paste("p-value =", format.pval(testobj$p.value)), adj=c(0, .5))
legend("bottomright", legend=c("S100B", "NDKA"), col=c("1", "2"), lwd=2)
| 然后用ROCR包画ROC曲线,但是ROCR包画图函数功能比较单一 |