调用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曲线的计算规则:
- 将FPR和TPR配对后按FPR升序排序
- 相同FPR的点仅保留TPR最大值(符合ROC曲线的标准绘制逻辑)
- 拆分排序后的序列传入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
相关产品推荐
相关产品推荐

