异常检测得到反向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
相关产品推荐
相关产品推荐

