Skip to main content

使用 R 绘制 ROC 曲线

作者 Safa Mulani

各位朋友,在这篇文章中,我们将详细了解如何 绘制 ROC 曲线,它也是评估机器学习误差的一个重要指标。 那么,让我们开始吧!

ROC 曲线的必要性

误差指标使我们能够评估和论证模型在特定数据集上的作用,ROC 曲线就是这样一个误差指标。 ROC 图,也被称为ROC AUC 曲线,是一种分类误差指标。 也就是说,它衡量机器学习分类算法的作用和结果。 准确地说,ROC 曲线代表了数值的概率曲线,而 AUC 衡量不同数值/标签组的可分离性。通过ROC曲线,人们可以分析有多少数值被模型正确地根据标签区分和分类,并得出结论。 AUC 分数越高,被预测值的分类就做得越好。 例如,设想一个模型,它用来预测和分类抛硬币的结果是“正面”还是“背面”。 如果 AUC 得分高,表明该模型能够更有效地将“正面”分类为“正面”,将“背面”分类为“背面”。 ROC 曲线是模型的假阳性率和真阳性率之间关系的图形表示法。 现在让我们在接下来的部分尝试实现ROC曲线。

方法一:使用 plot()函数

如我们前面所述,可以使用 ROC 图来评估机器学习模型。因此,接下来让我们尝试用 ROC 曲线评估 logistic 回归模型。 在这个例子中,我们将使用银行贷款违约者数据集,通过 Logistic 回归进行建模。我们将使用 “pROC”库中的 plot()函数绘制 ROC 曲线。 首先,使用read.csv()函数将数据集加载到环境中。 分割数据集是建模前的一个关键步骤。因此,我们使用 R 文档中的createDataPartition()函数将数据集采样为训练和测试数据值。 我们设置了一些误差指标来评估模型的作用,包括精确率、召回率、准确率、F1得分、ROC 曲线等。 最后,我们使用 R 的 glm()函数,在数据集上应用Logistic回归。此外,我们使用 predict()函数在数据上测试模型,并得到误差指标的值。 最后,我们通过 roc()方法计算出模型的 roc AUC 分数,并使用“pROC”库中的 plot()函数将其绘制出来。

rm(list = ls())
#Setting the working directory
setwd("D:/Edwisor_Project - Loan_Defaulter/")
getwd()
#Load the dataset
dta = read.csv("bank-loan.csv",header=TRUE)

### Data SAMPLING ####
library(caret)
set.seed(101)
split = createDataPartition(data$default, p = 0.80, list = FALSE)
train_data = data[split,]
test_data = data[-split,]

#error metrics -- Confusion Matrix
err_metric=function(CM)
{
TN =CM[1,1]
TP =CM[2,2]
FP =CM[1,2]
FN =CM[2,1]
precision =(TP)/(TP+FP)
recall_score =(FP)/(FP+TN)
f1_score=2*((precision*recall_score)/(precision+recall_score))
accuracy_model =(TP+TN)/(TP+TN+FP+FN)
False_positive_rate =(FP)/(FP+TN)
False_negative_rate =(FN)/(FN+TP)
print(paste("Precision value of the model: ",round(precision,2)))
print(paste("Accuracy of the model: ",round(accuracy_model,2)))
print(paste("Recall value of the model: ",round(recall_score,2)))
print(paste("False Positive rate of the model: ",round(False_positive_rate,2)))
print(paste("False Negative rate of the model: ",round(False_negative_rate,2)))
print(paste("f1 score of the model: ",round(f1_score,2)))
}

# 1. Logistic regression
logit_m =glm(formula = default~. ,data =train_data ,family='binomial')
summary(logit_m)
logit_P = predict(logit_m , newdata = test_data[-13] ,type = 'response' )
logit_P <- ifelse(logit_P > 0.5,1,0) # Probability check
CM= table(test_data[,13] , logit_P)
print(CM)
err_metric(CM)

#ROC-curve using pROC library
library(pROC)
roc_score=roc(test_data[,13], logit_P) #AUC score
plot(roc_score ,main ="ROC curve -- Logistic Regression ")

输出: ROC 曲线 - Logistic 回归

方法二:使用 roc.plot()函数

R编程为我们提供了另一个名为“verification(验证)”的库,用于绘制一个模型的 ROC-AUC 曲线。 为了使用这个函数,我们需要安装并导入 'verification' library 到我们的环境中。 完成这些工作后,我们使用 roc.plot()函数绘制数据,以明确评估数据值的“敏感性”和“特异性”,如下所示:

install.packages("verification")
library(verification)
x<- c(0,0,0,1,1,1)
y<- c(.7, .7, 0, 1,5,.6)
data<-data.frame(x,y)
names(data)<-c("yes","no")
roc.plot(data$yes, data$no)
r

输出:
![使用 Verification 包的 ROC 图](https://journaldev.nyc3.digitaloceanspaces.com/2020/12/ROC-plot-using-verification-package.png)

### 结语
这个主题到此就结束了。请试着用其他机器学习模型实现ROC图。
欢迎继续关注后续内容,祝您学习愉快! :)