《------往期经典推荐------》
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
ROC介绍
ROC曲线(Receiver Operating Characteristic Curve)是一种用于评估二分类模型性能的工具,通过绘制不同阈值下的真阳性率(TPR)和假阳性率(FPR)来直观反映模型的分类能力。以下是其基本原理和分步骤示例:
1. 基本原理
- 核心指标:
- 真阳性率(TPR): T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP,表示实际为正例的样本中被正确预测的比例。TPR越大意味着TP越大,也就意味着对于测试样本中的所有正例来说,其中大部分都被学习器预测正确。
- 假阳性率(FPR): F P R = F P F P + T N FPR = \frac{FP}{FP + TN} FPR=FP+TNFP,表示实际为负例的样本中被错误预测的比例。FPR越小意味着FP越小、TN越大,也就意味着FPR越小,则对于测试样例中的所有反例来说,其中大部分被学习器预测正确。
- ROC曲线:以FPR为横轴、TPR为纵轴,通过调整分类阈值生成一系列点并连接成曲线。曲线越靠近左上角,模型性能越好。一个好的模型是TPR大PFR偏小的。
2. 示例
步骤1:准备数据
假设有以下测试集预测结果(二分类):
样本 | 预测概率(正类) | 真实标签 |
---|---|---|
A | 0.95 | 1 |
B | 0.85 | 1 |
C | 0.70 | 0 |
D | 0.55 | 1 |
E | 0.30 | 0 |
上述表格中,第一列代表样本名称;第二列代表预测为样本被预测为正例的概率;第三列代表样本的真实标签,1代表正例,0代表负例。
正例数目:P=3
负例数目:N=2
步骤2:排序与阈值选择
将样本按预测概率从高到低排序,依次以每个概率值为阈值计算TPR和FPR:
- 阈值=0.95:
- 预测为正例:A(TP=1),其余为负例(FN=2【B,D】, FP=0, TN=2【C,E】)。
- T P R = 1 / 3 ≈ 0.33 TPR = 1/3 \approx 0.33 TPR=1/3≈0.33, F P R = 0 / 2 = 0 FPR = 0/2 = 0 FPR=0/2=0。
- 阈值=0.85:
- 预测为正例:A, B(TP=2),其余为负例(FN=1【D】, FP=0, TN=2【C,E】)。
- T P R = 2 / 3 ≈ 0.67 TPR = 2/3 \approx 0.67 TPR=2/3≈0.67, F P R = 0 / 2 = 0 FPR = 0/2=0 FPR=0/2=0。
- 阈值=0.70:
- 预测为正例:A, B, C(TP=2【A,B】, FP=1【C】),其余为负例(FN=1【D】, TN=1【E】)。
- T P R = 2 / 3 ≈ 0.67 TPR = 2/3 \approx 0.67 TPR=2/3≈0.67, F P R = 1 / 2 = 0.5 FPR = 1/2 = 0.5 FPR=1/2=0.5。
- 阈值=0.55:
- 预测为正例:A, B, D(TP=3【A,B,D】, FP=1【C】),其余为负例(FN=0, TN=1【E】)。
- T P R = 1 TPR = 1 TPR=1, F P R = 1 / 2 = 0.5 FPR = 1/2 =0.5 FPR=1/2=0.5。
- 阈值=0.30:
- 所有样本为正例(TP=3【A,B,D】, FP=2【C,E】),FN=0,TN=0。
- T P R = 1 TPR = 1 TPR=1, F P R = 1 FPR = 1 FPR=1。
步骤3:绘制ROC曲线
将上述(FPR, TPR)点连接成曲线:
- 点序列:(0, 0.33), (0, 0.67), (0.5, 0.67), (0.5, 1), (1, 1)。
- AUC计算:通过梯形法或曼-惠特尼U统计量计算曲线下面积(本例AUC≈0.83)。
3.代码实现
下面我们通过代码实现ROC曲线的绘制以及AUC面积计算。
# --coding:utf-8--
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
# 真实标签
y_true = [1, 1, 0, 1, 0]
# 每个标签预测为正例的概率
y_score = [0.95, 0.85, 0.70, 0.55, 0.30]
fpr, tpr, _ = roc_curve(y_true, y_score)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, label=f'ROC (AUC={roc_auc:.2f})')
plt.plot([0, 1], [0, 1], 'k--') # 随机分类线
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.legend()
plt.show()
运行结果:
4. 关键点总结
- 阈值选择:ROC曲线通过遍历所有可能的阈值生成,反映模型在不同误判代价下的表现。
- AUC意义:AUC值越接近1,模型区分能力越强;0.5表示无判别力。
- 多分类扩展:可通过OvR策略为每个类别单独绘制ROC曲线。
通过上述步骤,可以清晰理解ROC曲线的计算逻辑和实际应用。
好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!