ROC曲线

ROC曲线原理及代码实现

Posted by CHY on June 17, 2020

ROC曲线,全称受试者工作特征曲线(receiver operating characteristic curve),这个名字主要与ROC的发展历史有关。是用于比较两个分类模型好坏的可视化工具。
ROC曲线的横坐标为假阳性率/敏感性(False Positive Rate,FPR),纵坐标为真阳性率/准确率(True Positive Rate,TPR)
N是真实负样本的个数,FP是N个负样本中被分类器预测为正样本的个数。
FPR = FP/N
P是真实正样本的个数,TP是P个正样本中被分类器预测为正样本的个数。
TPR = TP/P
那么目的是希望TPR越高越好,FPR越低越好,也就表面AUC越大越好,一般AUC取值在0.5~1之间。
混淆矩阵

具体举例

ROC原理举例 具体流程:

  1. 将概率从大到小排列,随机选取一个概率截断点,计算该条件下真阳性率和假阳性率;
  2. 更换截断点阈值,重新计算新的真阳性率和假阳性率;
  3. 获得多个不同阈值下的真阳性率和假阳性率后,以假阳性率为横坐标,真阳性率为纵坐标进行绘制点图并连接即可。 ROC原理举例

最佳截断点的确定—约登指数YI
约登指数 = 敏感度 + 特异度 - 1 = 真阳率 - 假阳率

ROC曲线绘制–Python版

from sklearn.metrics import roc_curve,auc
import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
auc = metrics.auc(fpr, tpr)
auc
import matplotlib.pyplot as plt
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

ROC曲线绘制–R版

# 自己找轮子方法
# 做一个logistic回归,生成概率预测值
model1 <- glm(y~., data=newdata, family='binomial')
pre <- predict(model1,type='response')
# 将预测概率prob和实际结果y放在一个数据框中
data <- data.frame(prob=pre,obs=newdata$y)
# 按预测概率从低到高排序
data <- data[order(data$prob),]
n <- nrow(data)
tpr <- fpr <- rep(0,n)
# 根据不同的临界值threshold来计算TPR和FPR,之后绘制成图
for (i in 1:n) {
    threshold <- data$prob[i]
    tp <- sum(data$prob > threshold & data$obs == 1)
    fp <- sum(data$prob > threshold & data$obs == 0)
    tn <- sum(data$prob < threshold & data$obs == 0)
    fn <- sum(data$prob < threshold & data$obs == 1)
    tpr[i] <- tp/(tp+fn) # 真正率
    fpr[i] <- fp/(tn+fp) # 假正率
}
plot(fpr,tpr,type='l')
abline(a=0,b=1)

# 现成轮子
library(ROCR)
pred <- prediction(pre,newdata$y)
performance(pred,'auc')@y.values #AUC值
perf <- performance(pred,'tpr','fpr')
plot(perf)

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)