You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用sklearn的auc函数计算AUC时提示x既不递增也不递减如何解决

报错原因

你遇到的报错不是由列表重复值直接导致的,核心原因是传入的FPR序列不符合auc函数的输入要求:

  • 通用的auc函数(比如scipy提供的实现)默认要求x轴(此处为FPR)是严格单调的序列
  • 你提供的FPR列表整体为降序排列,且索引为20的位置出现了局部上升(数值0.037433大于前一位的0.032085),导致序列既不单调递增也不单调递减,触发报错。

解决方法

方法1:直接启用重排序参数(适配scipy的auc实现)

如果你用的是scipy.metrics.auc函数,直接传入reorder=True参数即可,函数会自动处理x轴的单调性问题,无需手动修改数据:

print(auc(fpr_list, tpr_list, reorder=True))

方法2:手动预处理数据(通用所有auc实现,无依赖限制)

如果你的auc函数没有重排序参数,可以手动对FPR、TPR做排序去重处理,符合ROC曲线的计算规则:

  1. 将FPR和TPR配对后按FPR升序排序
  2. 相同FPR的点仅保留TPR最大值(符合ROC曲线的标准绘制逻辑)
  3. 拆分排序后的序列传入auc函数即可

代码示例:

# 你的原始数据
fpr_list = [0.4824561403508772, 0.4205607476635514, 0.41037735849056606, 0.391304347826087, 0.35467980295566504, 0.2857142857142857, 0.23195876288659795, 0.20618556701030927, 0.19170984455958548, 0.16753926701570682, 0.12105263157894737, 0.10052910052910052, 0.10052910052910052, 0.09523809523809523, 0.08465608465608465, 0.07936507936507936, 0.058823529411764705, 0.0481283422459893, 0.0427807486631016, 0.03208556149732621, 0.0374331550802139, 0.0213903743315508, 0.0213903743315508, 0.0213903743315508, 0.0213903743315508, 0.016042780748663103, 0.0106951871657754, 0.0106951871657754, 0.0106951871657754, 0.0106951871657754, 0.0106951871657754, 0.0106951871657754, 0.0106951871657754, 0.0106951871657754, 0.0106951871657754]
tpr_list = [0.7619047619047619, 0.7619047619047619, 0.7619047619047619, 0.7619047619047619, 0.7523809523809524, 0.7428571428571429, 0.7238095238095238, 0.6952380952380952, 0.6952380952380952, 0.6857142857142857, 0.6761904761904762, 0.6571428571428571, 0.6476190476190476, 0.6476190476190476, 0.638095238095238, 0.638095238095238, 0.6285714285714286, 0.6, 0.6, 0.6, 0.5904761904761905, 0.5904761904761905, 0.580952380952381, 0.580952380952381, 0.5714285714285714, 0.5714285714285714, 0.5714285714285714, 0.5714285714285714, 0.5333333333333333, 0.5333333333333333, 0.5142857142857142, 0.5047619047619047, 0.4952380952380952, 0.4952380952380952, 0.4857142857142857]

# 配对排序+去重处理
pairs = sorted(zip(fpr_list, tpr_list), key=lambda x: x[0])
unique_pairs = []
prev_fpr = None
max_tpr = 0
for f, t in pairs:
    if f != prev_fpr:
        if prev_fpr is not None:
            unique_pairs.append((prev_fpr, max_tpr))
        prev_fpr = f
        max_tpr = t
    else:
        max_tpr = max(max_tpr, t)
unique_pairs.append((prev_fpr, max_tpr))

# 拆分序列计算AUC
sorted_fpr = [p[0] for p in unique_pairs]
sorted_tpr = [p[1] for p in unique_pairs]
# 此处可替换为你使用的任意通用auc函数
from scipy.integrate import trapz
auc_score = trapz(sorted_tpr, sorted_fpr)
print(auc_score)

两种方法计算得到的AUC结果一致,约为0.182。

内容的提问来源于stack exchange,提问作者JayJona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:39:03