#Day2学习笔记07/20 ROC和AUC 1.假设一个逻辑回归曲线可以推测出一个结果的概率,然后选取某个概率作为分类的阈值。由于使用不同概率作为分类的阈值会计算出不同的敏感性和特异性,因此为了评价哪个概率会得出最佳分类结果,便需要对所有概率选择得出的分类结果的特异性和敏感性做统计,由此得出Receiver Operator Characteristic(受试者工作特征)的一条曲线汇总这些信息。 2.纵坐标为真阳性率也就是敏感性(真阳性/(真阳性+假阴性)),它用来表示正确归类正向样本的比例。 3.横坐标为假阳性率也就是(1-特异性)(假阳性/(真阴性+假阳性)),它是一个错误率,用来表示反向样本中误判为正向的比例。 4.对角线上的点表示正确分类正向样本的比例等于错误分类反向样本的比例。 5.ROC图代表了不同阈值产生的所有混淆矩阵。 6.AUC(Area under the curve)是roc的面积,面积越大的分类方法效果越好。 7.除了使用真阳性率和假阳性率来绘制图以外,还可以用精确度来替换假阳性率绘制混淆矩阵信息图。精确度等于真阳性/(真阳性+假阳性),用来描述正确分类为阳性结果的比例。当样本中存在很多的反向样本时,精确度比假阳性率更有用。 8.ROC曲线可以轻易确定决策时的最佳阈值,AUC可以帮助确定哪种分类方法更好。 R语言实现 >library(pROC) >library(randomForest) >set.seed(420) >num.samples <- 100 >weight <- sort(rnorm(n=num.samples,mean=172,sd=29)) >obese <- ifelse(test=(runif(n=num.samples) < (rank(weight)/100)), yes=1,no=0) >obese >plot(x=weight, y=obese) >glm.fit=glm(weight ~ obese, family=binomial) >lines(weight,glm.fit$fitted.values) >par(pty="s") >roc(obese, glm.fit$fitted.values, plot=TRUE, legacy.axes=TRUE, percent=TRUE, xlab="False Positive Percentage", ylab="True Positive Percentage", col="#377eb8", lwd=4, print.auc=TRUE, print.auc.x=45, partial.auc=c(100,90), auc.polygon=TRUE, auc.polygon.col="377eb822") >roc.info <- roc(obese, glm.fit$fitted.value, legacy.axes=TRUE) >roc.df <- data.frame(tpp=roc.info$sensitivities*100, fpp=(1-roc.info$specificities)*100, thresholds=roc.info$thresholds) >head(roc.df) >tail(roc.df) >roc.df[roc.df$tpp>60, roc.df$fpp<80]
>rf.model <- randomForest(factor(obese)~weight) >roc(obese, glm.fit$fitted.values, plot=TRUE, legacy.axes=TRUE, percent=TRUE, xlab="False Positive Percentage", ylab="True Positive Percentage", col="#377eb8", lwd=4, print.auc=TRUE) >plot.roc(obese, rf.model$votes[,1], percent=TRUE, col="#4daf4a", lwd=4, print.auc=TRUE, add=TRUE, print.auc.y=40) >legend("bottomright", legend=c("Logistic Regression", "Random Forest"), col=c("#377eb8","#4daf4a"), lwd=4) >par(pty="m") |