从代码理解工业缺陷检测性能指标AUROC及最佳阈值的求取

话不多说,先上代码,看看是怎么求的,再来分析原理。

# -*- coding:utf-8 -*-
# Peoject:004_MyScripts
# File:AUROC_test
# User:csu.pan-||
# Time:2023/6/15 10:46
# IDE: PyCharm
# Func: AUROC的测试

# 导入sklearn算法库中的包
from sklearn.metrics import roc_curve, auc
import numpy as np

def AUC(label, pre):
    # 计算正样本和负样本的索引,以便索引出之后的概率值
    pos = [i for i in range(len(label)) if label[i] == 1]   #正样本索引
    neg = [i for i in range(len(label)) if label[i] == 0]   #负样本索引
    auc = 0
    for i in pos:
        for j in neg:
            if pre[i] > pre[j]:
                auc += 1
            elif pre[i] == pre[j]:
                auc += 0.5

    return auc / (len(pos) * len(neg))

if __name__ == '__main__':
    label = [1, 1, 1, 1, 0, 0, 0, 0]
    pre = [0.65, 0.65, 0.50, 0.51, 0.41, 0.48, 0.42, 0.42]
    print('mycompu_AUROC: ', AUC(label, pre))

    '''
    label是列表形式,对应方法1中的label形式
    pre是列表形式,对应方法1中的pre形式
    '''
    fpr, tpr, thresholds = roc_curve(label, pre, pos_label=1)

    optimal_idx = np.argmax(tpr - fpr)
    optimal_threshold = thresholds[optimal_idx]    # 求出最佳阈值

    print('sklearn_AUROC: ', auc(fpr, tpr))
    print('optimal_thres: ', optimal_threshold)

结果1:

mycompu_AUROC:  1.0
sklearn_AUROC:  1.0
optimal_thres:  0.5

现在换一个输入,看看情况咋样。

label = [1, 1, 1, 1, 0, 0, 0, 0]
pre = [0.45, 0.45, 0.40, 0.41, 0.31, 0.38, 0.32, 0.32]

结果2:

mycompu_AUROC:  1.0
sklearn_AUROC:  1.0
optimal_thres:  0.4

看到没有,代码中使用了sklearn的求AUROC函数和自定义的函数,从结果和代码来看,AUROC只是在排序,只要正样本的预测值比负样本大,就能得分,并没有说所有阈值下都能有效。

当我们使用MVTecAD数据集上那些算法的时候,一定要注意了,虽然AUROC指标看上去都很高,达到了99%以上,但是不同的验证集求出来的最佳阈值,可能就具有很大的差异。

所以,目前这些无监督的工业检测算法,都号称不需要负样本,实际上却需要验证集的正负样本来求取最佳阈值,但不同的验证集最佳阈值差异很大,比如结果1和结果2中的,你要是拿0.5的阈值去套,那结果2预测的就全是负例了,虽然AUROC都是1。这在工业部署的时候并不具有实用性,我们真正需要的是召回率和误检率这些指标。

参考:
https://www.jianshu.com/p/2253bde32823
https://blog.csdn.net/didi_ya/article/details/125141195

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值