R语言-绘制ROC曲线

浅谈ROC曲线

机器学习中很常见的一个大类就是二元分类器。很多二元分类器会产生一个概率预测值,而非仅仅是0-1预测值。我们可以使用某个临界点(例如0.5),以划分哪些预测为1,哪些预测为0。得到二元预测值后,可以构建一个混淆矩阵来评价二元分类器的预测效果。所有的训练数据都会落入这个矩阵中,而对角线上的数字代表了预测正确的数目,即True Positive+True Nagetive。同时可以相应算出TPR(真正率或称为灵敏度)和TNR(真负率或称为特异度)。我们主观上希望这两个指标越大越好,但可惜二者是一个此消彼涨的关系。除了分类器的训练参数,临界点的选择,也会大大的影响TPR和TNR。有时可以根据具体问题和需要,来选择具体的临界点。


如果我们选择一系列的临界点,就会得到一系列的TPR和TNR,将这些值对应的点连接起来,就构成了ROC曲线。ROC曲线可以帮助我们清楚的了解到这个分类器的性能表现,还能方便比较不同分类器的性能。在绘制ROC曲线的时候,习惯上是使用1-TNR作为横坐标,TPR作为纵坐标。下面来看看如何在R语言中绘制ROC曲线。

# 做一个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)
R中也有专门用来绘制ROC曲线的包,例如常见的ROCR包,它不仅可以用来画图,还能计算ROC曲线下面积AUC,以评价分类器的综合性能,该数值取0-1之间,越大越好。
library(ROCR)
pred <- prediction(pre,newdata$y)
performance(pred,'auc')@y.values #AUC值
perf <- performance(pred,'tpr','fpr')
plot(perf)
ROCR包画图函数功能比较单一,笔者比较偏好使用功能更强大的pROC包。它可以方便比较两个分类器,还能自动标注出最优的临界点,图看起来也比较漂亮。
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)




在R语言中,绘制ROC曲线通常可以使用`pROC`包或`ROCR`包。下面将介绍如何使用这两个工具来实现ROC曲线绘制。 ### 使用 `pROC` 包绘制 ROC 曲线 `pROC` 是一个功能强大的 R 包,专门用于计算和绘制 ROC 曲线,并且支持 AUC(曲线下面积) 的计算以及最佳阈值的标注。 #### 安装并加载 `pROC` 包 ```r install.packages("pROC") library(pROC) ``` #### 示例数据集 这里以 `pROC` 包自带的数据集 `aSAH` 为例,其中包含两个变量: - `outcome`: 真实分类结果(如疾病状态) - `s100b`: 预测变量(如生物标志物) #### 构建 ROC 对象并绘制曲线 ```r # 构建 ROC 对象并计算 AUC roc_obj <- roc(aSAH$outcome, aSAH$s100b) # 绘制 ROC 曲线 plot(roc_obj, main = "ROC Curve using pROC", col = "blue", lwd = 2) # 标注 AUC 值 auc_value <- auc(roc_obj) text(x = 0.5, y = 0.3, labels = paste("AUC =", round(auc_value, 2)), cex = 1.2) # 标注最佳阈值点 coords <- coords(roc_obj, "best") points(coords[1], coords[2], pch = 19, col = "red", cex = 1.5) text(coords[1] + 0.05, coords[2], "Best Threshold", col = "red") ``` --- ### 使用 `ROCR` 包绘制 ROC 曲线 `ROCR` 是另一个广泛使用的 R 包,能够灵活地绘制 ROC 曲线并评估模型性能。 #### 安装并加载 `ROCR` 包 ```r install.packages("ROCR") library(ROCR) ``` #### 准备预测值和真实标签 假设我们有一个二分类模型,其预测概率为 `predicted_scores`,真实标签为 `true_labels`。 ```r # 示例数据 set.seed(123) predicted_scores <- runif(100) # 模拟预测概率 true_labels <- rbinom(100, 1, 0.5) # 模拟真实标签 ``` #### 创建预测对象并计算性能 ```r pred <- prediction(predicted_scores, true_labels) perf <- performance(pred, measure = "tpr", x.measure = "fpr") ``` #### 绘制 ROC 曲线 ```r plot(perf, main = "ROC Curve using ROCR", col = "green", lwd = 2) # 计算 AUC auc_perf <- performance(pred, measure = "auc") auc_value <- unlist(slot(auc_perf, "y.values")) text(x = 0.5, y = 0.3, labels = paste("AUC =", round(auc_value, 2)), cex = 1.2) ``` --- ### ROC 曲线的基本原理与意义 ROC 曲线是一种可视化工具,用于评估二分类模型在不同阈值下的性能表现[^4]。横轴表示假阳性率(FPR),纵轴表示真阳性率(TPR)。通过调整分类阈值,可以得到一系列 (FPR, TPR) 点,并连接这些点形成曲线。 AUC(Area Under the Curve)是衡量模型整体性能的重要指标,数值范围从 0 到 1。AUC 越接近 1,说明模型的区分能力越强[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值