如何不使用scikit-learn从TPR和FPR计算AUC_ROC并解决计算异常
如何在不使用scikit-learn的情况下计算全零FPR的ROC AUC?
我有一组对应不同阈值的True Positive Rate(TPR)和False Positive Rate(FPR)数据,现在需要在不使用scikit-learn库的前提下计算ROC AUC。我的数据如下:
- TPR = [0.0001,0.0002,0.0003,0.0004,0.0005,0.0006,0.0007,0.0008,0.0009,0.001]
- FPR = [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]
我尝试用numpy.trapz(TPR,FPR)计算,但结果异常,请问该如何正确计算?
问题根源与解决方案
你的问题出在所有FPR值都是0的特殊场景——ROC AUC的本质是计算TPR曲线在FPR从0到1区间下的面积,而你现有的数据只覆盖了FPR=0的片段,缺少ROC曲线必须的关键端点,导致数值积分工具返回不符合预期的结果。
1. 先补全ROC曲线的核心端点
根据ROC曲线的定义,完整的曲线必须包含两个强制端点:
- 阈值设为最大值时:所有样本被预测为负例,对应
(FPR=0, TPR=0) - 阈值设为最小值时:所有样本被预测为正例,对应
(FPR=1, TPR=1)
你的现有数据只记录了FPR=0时的TPR变化,所以需要把这两个端点补充到数据序列中。
2. 用梯形法计算AUC(兼容numpy.trapz)
我们可以手动整理完整的FPR和TPR序列,再用numpy.trapz计算,代码示例如下:
import numpy as np # 你的原始数据 raw_tpr = [0.0001,0.0002,0.0003,0.0004,0.0005,0.0006,0.0007,0.0008,0.0009,0.001] raw_fpr = [0.0] * 10 # 补全ROC曲线的必要端点 full_fpr = np.array([0.0] + raw_fpr + [1.0]) full_tpr = np.array([0.0] + raw_tpr + [1.0]) # 计算AUC auc = np.trapz(full_tpr, full_fpr) print(auc) # 输出结果为 0.5005
3. 手动验证计算逻辑
因为你的原始数据所有FPR都是0,这部分在ROC图上是沿y轴从(0,0)到(0,0.001)的竖线,这部分的面积为0;真正贡献面积的是从(0,0.001)到(1,1)的线段,用梯形面积公式计算:
面积 = (上底 + 下底) × 宽 ÷ 2 = (0.001 + 1) × (1 - 0) ÷ 2 = 0.5005
和numpy.trapz的计算结果完全一致。
为什么之前的计算异常?
你直接传入全0的FPR序列时,numpy.trapz会认为x轴没有变化(积分区间长度为0),所以返回0——这是数值积分的正常逻辑,但不符合ROC AUC的标准定义,因为ROC曲线必须覆盖FPR从0到1的完整范围。
内容的提问来源于stack exchange,提问作者Rajeev Srivastava
相关产品推荐
相关产品推荐

