绘制ROC曲线和绘制PR曲线

本文详细介绍了ROC曲线和PR曲线在机器学习中的应用,包括它们的原理、关键指标(如TPR/FPR和Precision/Recall)、如何计算及绘制,并通过Python代码示例展示了如何实现这两个性能评估工具,强调了AUC的重要性。
摘要由CSDN通过智能技术生成

绘制ROC曲线

ROC曲线是在机器学习和统计学中用于评估分类器性能的重要工具。它以不同的阈值为基础,将分类器的真正率(TPR)与假正率( FPR)之间的关系可视化展示。探讨如何计算和绘制ROC曲线,以及如何解释和评估曲线下的面积(AUC)。

ROC曲线原理

ROC曲线是根据不同的分类阈值绘制的,这些阈值用于将模型的预测结果分为正类和负类。在构建ROC曲线时,我们关注两个关键指标:

  • 真正率(TPR):也称为召回率,它表示正确预测为正样本的数量占所有实际为正样本的数量的比例。 TPR 衡量了分类器对正样本的识别能力。公式为 TPR = TP / (TP + FN),其中 TP 为真正例,FN 为假负例。

  • 假正率(FPR):它表示错误预测为正样本的数量占所有实际为负样本的数量的比例。 FPR 衡量了分类器将负样本错误识别为正样本的能力。公式为 FPR = FP / (FP + TN),其中 FP 为假正例,TN 为真负例。

ROC曲线的横坐标是 FPR,纵坐标是 TPR。绘制ROC曲线的过程包括以下步骤:

  1. 计算不同阈值下的 TPR 和 FPR 值。
  2. 绘制这些值的图形,以可视化描述分类器性能。

代码实现

使用Python来实现绘制ROC曲线的代码。首先,需要计算不同阈值下的 TPR 和 FPR 值。在下面的示例中,使用一组样本标签(y_test)和相应的预测概率值(y_hat)来计算这些值。

def cal_tpfn(y_test, y_hat):
    tp = fp = tn = fn = 0
    for y1, y2 in zip(y_test, y_hat):
        if (y1, y2) == (0, 0):
            tn += 1
        if (y1, y2) == (0, 1):
            fp += 1
        if (y1, y2) == (1, 0):
            fn += 1
        if (y1, y2) == (1, 1):
            tp += 1
    return tp, fp, tn, fn

def simple_roc_curve(y_test, y_hat):
    thresholds = sorted(set(y_hat), reverse=True)
    thresholds.append(2)  # 添加一个大于1的值,使ROC曲线包含 (0,0) 点
    thresholds.sort(reverse=True)
    fprs = []
    tprs = []
    for threshold in thresholds:
        y_pred = [1 if value >= threshold else 0 for value in y_hat]
        tp, fp, tn, fn = cal_tpfn(y_test, y_pred)
        tpr = tp / (tp + fn) if (tp + fn) != 0 else 0
        fpr = fp / (fp + tn) if (fp + tn) != 0 else 0
        fprs.append(fpr)
        tprs.append(tpr)
    return fprs, tprs, thresholds

上述代码首先定义了计算 TP、FP、TN、FN 的函数 cal_tpfn,然后实现了计算 ROC 曲线数据点的函数 simple_roc_curve。在该函数中,添加了一个大于1的值,确保ROC曲线包含 (0,0) 点,并计算不同阈值下的 TPR 和 FPR。

运行结果

from sklearn.metrics import roc_auc_score
import matplotlib.pyplot as plt

# 示例数据(用真实数据替代)
y_test = [1, 0, 1, 0, 1, 1, 0, 0, 1, 1]
y_hat = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.05]

fprs, tprs, thresholds = simple_roc_curve(y_test, y_hat)
roc_auc = roc_auc_score(y_test, y_hat)

# 设置图形的长宽,使图形适当拉长
plt.figure(figsize=(12, 5))
# 绘制ROC曲线
plt.plot(fprs, tprs, color='red', lw=2, label='ROC CURVE (AUC = %0.2f)' % roc_auc)
# 添加对角线
plt.plot([0, 1], [0, 1], color='blue', lw=2, linestyle='--')
# 设置横纵坐标范围
plt.xlim([0, 1])
plt.ylim([0, 1.05])
# 设置横纵坐标标签
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
# 设置曲线标题
plt.title('Receiver Operating Characteristic Curve')
# 显示曲线标签
plt.legend(loc='lower right')

# 显示图形
plt.show()
 

结论

通过上述代码和绘图,成功绘制了ROC曲线并计算了曲线下的面积(AUC)。ROC曲线是评估分类器性能的有力工具,AUCPR的值越接近1,表示分类器性能越好。在这个例子中,我们得到了一个AUC值为0.95,表明该分类器的性能非常不错。

绘制PR曲线

PR曲线(Precision-Recall Curve)是在机器学习中用于评估分类器性能的重要工具。与ROC曲线不同,PR曲线关注的是正例的精确性(Precision)和召回率(Recall)。

PR曲线原理

PR曲线是根据不同的分类阈值绘制的,这些阈值用于将模型的预测结果分为正类和负类。在构建PR曲线时,关注两个关键指标:

  • 精确率(Precision):表示正确预测为正样本的数量占所有预测为正的样本数量(包括正确预测和错误预测)的比例。 Precision = TP / (TP + FP)。它衡量的是分类器预测正样本的准确性,即在所有预测为正的样本中,正确预测的比例有多少。

  • 召回率(Recall):与ROC曲线中的真正率(TPR)相同,表示正确预测为正样本的数量占所有实际为正的样本数量的比例。 Recall = TP / (TP + FN)。它衡量的是分类器对正样本的识别能力,即能够正确分类多少比例的正样本。

与ROC曲线不同,PR曲线的横坐标是召回率,纵坐标是精确率。绘制PR曲线的过程包括以下步骤:

  1. 计算不同阈值下的精确率和召回率值。
  2. 绘制这些值的图形,以可视化描述分类器性能。

代码实现

使用Python来实现绘制PR曲线的代码。首先,需要计算不同阈值下的精确率和召回率值。在下面的示例中,我们将使用一组样本标签(y_test)和相应的预测概率值(y_hat)来计算这些值。

def simple_pr_curve(y_test, y_hat):
    thresholds = sorted(set(y_hat))
    precisions = []
    recalls = []
    for threshold in thresholds:
        y_pred = [1 if value >= threshold else 0 for value in y_hat]
        tp, fp, tn, fn = cal_tpfn(y_test, y_pred)
        precision = tp / (tp + fp) if (tp + fp) != 0 else 0
        recall = tp / (tp + fn) if (tp + fn) != 0 else 0
        precisions.append(precision)
        recalls.append(recall)
    
    precisions.append(1.)
    recalls.append(0.)
    return precisions, recalls, thresholds

上述代码定义了计算精确率和召回率的函数 simple_pr_curve,并在函数中添加了一个(0,1)的数据点,以确保PR曲线包含完整的范围。

运行结果

from sklearn.metrics import average_precision_score
import matplotlib.pyplot as plt

# 示例数据(用真实数据替代)
y_test = [1, 0, 1, 0, 1, 1, 0, 0, 1, 1]
y_hat = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.05]

precisions, recalls, thresholds = simple_pr_curve(y_test, y_hat)
pr_auc = average_precision_score(y_test, y_hat)

plt.figure(figsize=(12, 5))
plt.plot(recalls, precisions, color='orange', lw=2, label='PR CURVE (AUC = %0.2f)' % pr_auc)
plt.xlim([0, 1])
plt.ylim([0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc='lower right')
plt.show()

结论

通过上述代码和绘图,成功绘制了PR曲线并计算了曲线下的面积(AUC)。与ROC曲线不同,PR曲线的AUC衡量的是分类器对正样本的预测准确性和识别能力。在这个示例中,得到了一个AUC值为0.89,表明该分类器在维持高精确率的同时,也具有较高的召回率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值