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}')

 

 

 

 

 

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

 

posted @ 2021-08-19 22:35  女贞路4号  阅读(749)  评论(0编辑  收藏  举报