📅  最后修改于: 2023-12-03 14:47:06.965000             🧑  作者: Mango
ROC 曲线(Receiver Operating Characteristic curve),又称为受试者工作特征曲线,是描述分类器性能的一种常用的评价指标。ROC 曲线以真阳性率(True Positive Rate,简称 TPR)为纵轴,以假阳性率(False Positive Rate,简称 FPR)为横轴,是一条平面曲线,用于比较分类器在不同阈值下的性能表现。
ROC 曲线的绘制需要先设定不同的分类器阈值,计算出对应的真阳性率和假阳性率,然后将它们绘制出来。以二分类问题为例,下面是绘制 ROC 曲线的流程:
确定一个分类器,并在该分类器上调整一个可变阈值 threshold。
根据阈值 threshold 对测试数据集进行分类,得到分类结果。
计算出真阳性率和假阳性率,即 TPR 和 FPR,其中:
将得到的 TPR 和 FPR 组成一组坐标点 (FPR, TPR),并将其记录下来。
调整阈值 threshold,重复步骤 2-4,得到多组坐标点。
将多组坐标点按照 FPR 从小到大排序,然后按序逐一连接成 ROC 曲线。
在 ROC 曲线上,离左上角越近的点,说明分类器在该阈值下性能越好。左上角的点(FPR = 0,TPR = 1),代表完美分类器。当分类器随着阈值的变化,TPR 和 FPR 发生变化时,ROC 曲线上的点也会相应地移动,曲线的形状也会发生变化。
为了从 ROC 曲线上比较不同的分类器表现,通常会具体比较两个分类器下的曲线的位置关系。如果一个分类器的 ROC 曲线完全处于另一个分类器的 ROC 曲线下方,则说明后者的表现更好。
在 ROC 曲线下方的面积,被称为 AUC(Area Under Curve),是 ROC 曲线的另一种常用的评价指标。AUC 的取值范围在 0.5 到 1 之间,其中 0.5 代表分类器随机猜测的水平。AUC 的值越大,代表分类器的性能越好。
下面是使用 Python 手动绘制 ROC 曲线的代码实现:
import numpy as np
import matplotlib.pyplot as plt
def plot_roc_curve(labels, scores):
"""绘制 ROC 曲线的函数"""
thresholds = np.arange(0, 1, 0.01) # 阈值范围
tpr_list = [] # 初始化真阳性率列表
fpr_list = [] # 初始化假阳性率列表
for threshold in thresholds:
tp = ((scores >= threshold) & (labels == 1)).sum()
tn = ((scores < threshold) & (labels == 0)).sum()
fp = ((scores >= threshold) & (labels == 0)).sum()
fn = ((scores < threshold) & (labels == 1)).sum()
tpr = tp / (tp + fn) # 计算真阳性率
fpr = fp / (fp + tn) # 计算假阳性率
tpr_list.append(tpr)
fpr_list.append(fpr)
auc = np.trapz(tpr_list, fpr_list) # 计算 AUC
plt.figure()
plt.plot(fpr_list, tpr_list, label="ROC curve (AUC = {:.2f})".format(auc))
plt.plot([0, 1], [0, 1], linestyle="--", color="gray", label="Random guess")
plt.legend()
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.title("Receiver Operating Characteristic curve")
plt.show()
其中,labels 为二分类问题的真实标签,scores 为分类器的预测得分,0 表示负标签,1 表示正标签。函数内部包含了对 ROC 曲线和 AUC 的计算和绘制。