首先介绍一下几个基本概念:


  • 预测值为正例,记为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)

如何画真实值和预测值的曲线python 真实值与预测值比较_如何画真实值和预测值的曲线python

接着利用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)

数据使用包自带数据库

如何画真实值和预测值的曲线python 真实值与预测值比较_模型预测_02

data(aSAH)


roc1 <- plot.roc(aSAH$outcome, aSAH$s100, main="Statistical comparison", percent=TRUE, col="1")

如何画真实值和预测值的曲线python 真实值与预测值比较_模型预测_03

      ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真正率(灵敏度)为纵坐标,假正率(1-特异度)为横坐标绘制的曲线。

roc2 <- lines.roc(aSAH$outcome, aSAH$ndka, percent=TRUE, col="2")


如何画真实值和预测值的曲线python 真实值与预测值比较_如何画真实值和预测值的曲线python_04

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)

如何画真实值和预测值的曲线python 真实值与预测值比较_正例_05


 

然后用ROCR包画ROC曲线,但是ROCR包画图函数功能比较单一