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

异常检测得到反向ROC曲线(AUC=0.02),如何通过函数自动反转?

scikit-learn 中的roc_auc_score、roc_curve等ROC相关评估函数,默认遵循规则:预测得分越高的样本,越有可能属于正类(默认取标签取值更大的类别,也就是你场景中的异常样本标签1)。而你的异常检测算法规则刚好相反:得分越高属于正常样本(标签0)的概率越高,得分越低属于异常样本(标签1)的概率越高,和函数的默认假设完全相反,因此得到了接近0的AUC结果。

你可以通过以下几种方式直接得到正确的评估结果,不需要手动反转标签:

方法1:指定正类为正常样本(推荐)

直接在调用函数时通过pos_label参数指定正类为标签0,完全匹配你的得分规则,不需要修改任何原始得分或标签:

# 计算AUC时指定正类为标签0
auc = roc_auc_score(y, score, pos_label=0)
# 生成ROC曲线参数时指定正类为标签0
fpr, tpr, thresholds = roc_curve(y, score, pos_label=0)
display = RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=auc)

该方法最贴合业务逻辑,不需要对原始数据做任何修改。

方法2:反转预测得分的符号

对预测得分统一取反后,异常样本的得分会高于正常样本,刚好符合函数默认的「得分越高越可能是正类(标签1)」的假设:

auc = roc_auc_score(y, -score)
fpr, tpr, thresholds = roc_curve(y, -score)
display = RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=auc)

方法3:直接对AUC结果取补

对于二分类问题,当得分规则和函数默认假设完全相反时,正确的AUC值等于1 - 原始输出的AUC,你的场景中1-0.02=0.98就是符合预期的结果。需要注意如果需要绘制正确的ROC曲线,还是需要用前两种方法处理roc_curve的输入,不能直接对FPR、TPR结果做修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:18:00