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

异常检测中sklearn.roc_curve阈值异常问题及方案验证

异常检测模型ROC曲线计算问题及解决方案验证

我使用sklearn.metrics.roc_curve评估异常检测模型性能,由于类别0为异常数据,将pos_label参数设为0,但结果出现异常:

  • 返回的thresholds从2开始,不符合预期
  • 阈值为1时,模型仅将61个数据中的3个预测为概率1,正确TPR应为0.951(TP=58,FN=3),但返回值为0.049

原始代码及异常输出

from sklearn.metrics import roc_curve
a = np.ones(y.shape[0])
y_pred_probaa = a - y_pred_proba
# fprs, tprs, thresholds = roc_curve(y, y_pred_probaa, pos_label=0)
fprs, tprs, thresholds = roc_curve(y, y_pred_proba, pos_label=0)

print(fprs)
print(tprs)
print(thresholds)

输出结果:

[0.         0.99756296 0.9983753  0.99918765 1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.        ]
[0.         0.04918033 0.08196721 0.3442623  0.52459016 0.55737705
 0.60655738 0.63934426 0.73770492 0.78688525 0.83606557 0.90163934
 0.93442623 1.        ]
[2.        1.        0.9921875 0.984375  0.9765625 0.9609375 0.953125
 0.9375    0.9140625 0.8828125 0.8515625 0.7421875 0.71875   0.6328125]

解决方案代码及正常输出

我尝试将预测概率转换为1 - y_pred_proba,调整后ROC曲线恢复正常,代码如下:

from sklearn.metrics import roc_curve
a = np.ones(y.shape[0])
y_pred_probaa = a - y_pred_proba
fprs, tprs, thresholds = roc_curve(y, y_pred_probaa, pos_label=0)
# fprs, tprs, thresholds = roc_curve(y, y_pred_proba, pos_label=0)

print(fprs)
print(tprs)
print(thresholds)

输出结果:

[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.12347685e-04
 1.62469537e-03 2.43704305e-03 1.00000000e+00]
[0.         0.01639344 0.06557377 0.09836066 0.16393443 0.21311475
 0.26229508 0.36065574 0.39344262 0.44262295 0.47540984 0.6557377
 0.91803279 0.95081967 1.        ]
[1.3671875 0.3671875 0.2890625 0.28125   0.1875    0.1484375 0.09375
 0.0859375 0.0546875 0.046875  0.03125   0.0234375 0.015625  0.0078125
 0.       ]

方案正确性验证

你的解决方案是正确的,原因如下:

  • roc_curve默认将概率值更高的样本判定为正类。当你设置pos_label=0(异常为正类)时,需要模型把概率更低的样本识别为正类,但原始y_pred_proba应该是预测为正常类(类别1)的概率,转换为1 - y_pred_proba后,得到的是预测为异常类(类别0)的概率,此时roc_curve能正确按照概率从高到低判定正类,计算出符合预期的TPR和FPR。
  • 从调整后的输出看,TPR在对应阈值位置达到了0.9508,和你预期的0.951一致,阈值范围也符合从高到低的逻辑,ROC曲线恢复正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:05:23