输入数据:
FPR 和 TPR。FPR 列表表示按升序排列的假阳性率,TPR 列表表示对应的真阳性率。初始化 AUC:
auc,用于存储最终的 AUC 值,初始化为 0.0。该值将用于累加每个相邻点形成的梯形面积。遍历计算:
使用一个循环,从第一个点开始到最后一个点,逐步计算相邻两个点形成的梯形的面积:
计算宽度:对于相邻的两个 FPR 值,计算它们之间的宽度:
width=FPR[i]−FPR[i−1]计算高度:相邻两个点的高度为其 TPR 值的平均值:
height=2TPR[i]+TPR[i−1]计算面积:根据梯形面积公式,计算当前梯形的面积并加到 auc 中:
返回结果:
from typing import List
class Solution:
def calculate_auc(self, FPR: List[float], TPR: List[float]) -> float:
"""计算曲线下面积 (AUC) 的函数"""
n = len(FPR) # 获取假阳性率列表的长度
auc = 0.0 # 初始化AUC值
# 遍历FPR和TPR,计算相邻点形成的梯形面积
for i in range(1, n):
width = FPR[i] - FPR[i - 1] # 计算梯形的宽度
height = (TPR[i] + TPR[i - 1]) / 2 # 计算梯形的高度
auc += width * height # 累加当前梯形的面积
return auc # 返回最终计算得到的AUC值
基于二分类模型的 ROC 曲线点 (FPR, TPR),使用 梯形积分法(Trapezoidal Rule) 计算 AUC(Area Under Curve)。
给定一组按 FPR 递增排序 的点:
$$\{(FPR_0, TPR_0), (FPR_1, TPR_1), \dots, (FPR_n, TPR_n)\}$$AUC 的梯形积分公式为:
$$\text{AUC}=\sum_{i=1}^{n} \frac{(FPR_i - FPR_{i-1})(TPR_i + TPR_{i-1})}{2}$$即对相邻点形成的梯形面积求和。
FPR: 按升序排列的假阳性率列表。TPR: 与 FPR 一一对应的真阳性率列表。AUC: 最终计算得到的曲线下面积。输入:
FPR = [0.0, 0.2, 0.6, 1.0]
TPR = [0.0, 0.5, 0.8, 1.0]
输出:
AUC = 0.67
0≤FPRi≤1
0≤TPRi≤1
FPR 必须满足递增:
FPR0≤FPR1≤⋯≤FPRn至少需要两个点(即 n+1≥2)
0≤AUC≤1