zoukankan      html  css  js  c++  java
  • ROC、AUC

    ROC 、AUC

    ROC曲线是评价学习器泛化能力的指标,他纵轴是“真正例率”(TPR),横轴是“假正例率”(FPR),需要FPR越小,TPR越高,则模型越好

    TPR = TP / (TP + FN)     可以理解为模型对正例的灵敏度

    FPR = FP / (TN + FP)     可以理解为模型对负例的特异度

    AUC,就是area under ROC curve,ROC曲线下包裹的面积。

    一些AUC问题

    有位同学提出AUC的相关问题,尝试理解一下:https://zhuanlan.zhihu.com/p/75131938

    1、对数据随机均匀采样,对AUC有什么影响?

    答:

      没有影响。当正负样本分布发生变化时,ROC曲线形状能够基本保持不变。

    2、改变训练集、测试集的比例,AUC有什么变化?

    答:

      几乎没有变化。

      手头有一个xgboost模型,全部数据在800w左右,随机抽取10%当测试集,另外90%作为训练集和测试集,AUC为0.87200669;随机抽取50%当测试集,另外50%作为训练集和测试集,AUC为0.87107088。

    3、AUC高,一定代表模型效果好吗?

    答:

      AUC是ROC曲线下面的面积,不同的ROC形状可以得到相同的AUC,就看ROC的“拐点”更靠近(0,0)还是(1,1)。拐点更靠近(1,1)则说明当分类的阈值往下减的时候,TP增长的比FP增长的更慢了,说明此时阈值再往小调已经就过了。但是一些场景可能需要更少的误报,允许少报,也要保证报出来的是正确的,这样来说拐点更靠近(0,0)就比(1,1)的要好。

    4、相比RPC和F1,AUC的优势是什么

    答:

      不受正负样本比变化的影响

      当正负样本分布发生变化时,ROC曲线形状能够基本保持不变,而P-R曲线则不能。ROC能尽量降低不同测试集带来的干扰。如果研究者希望更多地看到模型在特定数据集上的表现,P-R曲线能够更直观地反映其性能。

    5、AUC适用于什么场景

    答:

      AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。

      所以AUC适合于排序场景。

    6、负样本非常多的情况下,AUC会偏高还是偏低

    答:???

    qd_pred_frame = pd.DataFrame(preds, columns=['pred'])
    qd_origin_frame = pd.DataFrame(test_y, columns=['origin'])
    qd_result_frame = pd.merge(qd_pred_frame, qd_origin_frame, left_index=True, right_index=True)
    FPR_list, TPR_list = [], []
    AUC = 0
    for i in range(0,100,2):
        th = i/100
        tp = len(qd_result_frame[(qd_result_frame['pred']>=th)&(qd_result_frame['origin']==1)])
        fp = len(qd_result_frame[(qd_result_frame['pred']>=th)&(qd_result_frame['origin']==0)])
        fn = len(qd_result_frame[(qd_result_frame['pred']<th)&(qd_result_frame['origin']==1)])
        tn = len(qd_result_frame[(qd_result_frame['pred']<th)&(qd_result_frame['origin']==0)])
        prc = tp/(tp+fp)
        rec = tp/(tp+fn)
        FPR = fp/(fp+tn)
        TPR = tp/(tp+fn)
    
        FPR_list.append(FPR)
        TPR_list.append(TPR)
        AUC = AUC + FPR*TPR
    
    x = np.array(FPR_list)
    y = np.array(TPR_list)
    
    plt.figure()
    plt.figure(figsize=(10,10))
    plt.xlim(0,1)
    plt.ylim(0,1)
    plt.xlabel("FPR")
    plt.ylabel("TPR")
    plt.grid()
    plt.plot(x,y)
    plt.show()
    AUC = 0
    for i in range(49):
        AUC += 0.5 * (FPR_list[i]-FPR_list[i+1]) * (TPR_list[i+1]+TPR_list[i])
    print(f'AUC: {AUC}')

    另有一种计算方法,贴上来

  • 相关阅读:
    测试数据生成利器
    9.22“月饼杯”递归算法欢乐赛测试报告总结
    lemon评测软件配置使用方法
    1200:分解因数
    大犇博客
    C++ |递归原理与构造技巧
    2018.9.8信息奥赛集训评测报告总结
    1195 判断整除
    计算机图形学初步
    AcWing
  • 原文地址:https://www.cnblogs.com/4PrivetDrive/p/15164365.html
Copyright © 2011-2022 走看看