📜  roc 曲线 (1)

📅  最后修改于: 2023-12-03 14:47:06.965000             🧑  作者: Mango

ROC 曲线介绍

ROC 曲线(Receiver Operating Characteristic curve),又称为受试者工作特征曲线,是描述分类器性能的一种常用的评价指标。ROC 曲线以真阳性率(True Positive Rate,简称 TPR)为纵轴,以假阳性率(False Positive Rate,简称 FPR)为横轴,是一条平面曲线,用于比较分类器在不同阈值下的性能表现。

ROC 曲线绘制

ROC 曲线的绘制需要先设定不同的分类器阈值,计算出对应的真阳性率和假阳性率,然后将它们绘制出来。以二分类问题为例,下面是绘制 ROC 曲线的流程:

  1. 确定一个分类器,并在该分类器上调整一个可变阈值 threshold。

  2. 根据阈值 threshold 对测试数据集进行分类,得到分类结果。

  3. 计算出真阳性率和假阳性率,即 TPR 和 FPR,其中:

    • 真阳性率(TPR)= 真阳性 / 真阳性 + 假阴性;
    • 假阳性率(FPR)= 假阳性 / 假阳性 + 真阴性。
  4. 将得到的 TPR 和 FPR 组成一组坐标点 (FPR, TPR),并将其记录下来。

  5. 调整阈值 threshold,重复步骤 2-4,得到多组坐标点。

  6. 将多组坐标点按照 FPR 从小到大排序,然后按序逐一连接成 ROC 曲线。

ROC 曲线解读

在 ROC 曲线上,离左上角越近的点,说明分类器在该阈值下性能越好。左上角的点(FPR = 0,TPR = 1),代表完美分类器。当分类器随着阈值的变化,TPR 和 FPR 发生变化时,ROC 曲线上的点也会相应地移动,曲线的形状也会发生变化。

为了从 ROC 曲线上比较不同的分类器表现,通常会具体比较两个分类器下的曲线的位置关系。如果一个分类器的 ROC 曲线完全处于另一个分类器的 ROC 曲线下方,则说明后者的表现更好。

ROC 曲线和 AUC

在 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 的计算和绘制。