推荐中的评估指标:AUC、GAUC

本文将介绍一下分类任务中的一个非常重要的评估指标:AUC,以及针对AUC的不足引出的另一指标:GAUC。

混淆矩阵

在这里插入图片描述

  • TP:表示正确拒绝的样本数(坏样本要拒绝)
  • FP:表示误报的样本数,即被错误拒绝的样本数(错的记成正的)
  • FN:表示漏报的样本数,即被错误准入(错误的拒绝了)的样本数(正例预测成负例,好样本没有准入,正例的少了,召回的少了)(好的少了,好的记成错的)
  • TN:正确准入的样本数

TP是真1;FP是假1;FN是假0; TN是真0

ROC曲线

在这里插入图片描述

  • 横坐标为假正率(FPR)
    • F P R = F P F P + T N FPR = \frac{FP}{FP+TN} FPR=FP+TNFP
    • 表示负样本被预测为1的概率
  • 纵坐标为真正率(TPR)
    • T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP
    • 表示正样本被预测为1的概率

绘制方法:

  • 1.对输出概率进行降序排序
  • 2.确定阈值
  • 3.根据阈值点计算TPR和FPR
  • 4.苗点连线

ROC曲线反映了排序质量的好坏,也就是预测结果的好坏(正例在前,反例在后)。

AUC

AUC是ROC曲线的量化指标,即ROC曲线下的面积。AUC值越大越好,即面积曲线下面积越大越好。

AUC的意义:随机抽取一对正负样本,AUC是把正样本预测为1的概率大于把负样本预测为1的概率的概率。这句话有点拗口,用公式写就是:

A U C = P ( P 正 > P 负 )        公 式 ( 1 ) AUC = P(P_正 > P_负) \ \ \ \ \ \ 公式(1) AUC=P(P>P)      (1)

扫描二维码关注公众号,回复: 13197488 查看本文章
  • P 正 P_正 P 指该正样本预测为1的概率

  • P 负 P_负 P 指该负样本预测为1的概率

  • 当auc=0.5时,模型没有分类能力,完全是随机猜测

  • auc>0.5时,把1预测为1的概率,比把0预测为1的概率大,说明模型有一定的分类能力

  • 当auc<0.5时,把模型的预测类别取反,即可得到auc>0.5的结果

  • auc的最大值为1,此时TPR恒等于1,即正样本永远会被预测正确

  • 因为AUC的取值在0.5-1之间,我们更习惯于一个取值在0-1之间的指标,这时候就有了归一化后的AUC,就是基尼系数或基尼统计量(这里的基尼系数和决策树的不同):

    • G = 2 ∗ A U C − 1 G = 2 * AUC - 1 G=2AUC1

AUC的优势:能够综合考虑到正例和负例,因此可以应对样本不均衡的情况。

求解AUC

有两种公式:

  • 第一种:

A U C = ∑ M ∗ N I ( P 正 , P 负 ) M ∗ N ,    I ( P 正 , P 负 ) = { 1 , P 正 > P 负 0.5 , P 正 = P 负 0 , P 正 < P 负        公 式 ( 2 ) AUC = \frac{\sum_{M*N} I(P_正,P_负)}{M*N},\ \ I(P_正,P_负) = \begin{cases} 1,P_正 > P_负 \\ 0.5,P_正 =P_负 \\ 0,P_正<P_负 \end{cases} \ \ \ \ \ \ 公式(2) AUC=MNMNI(PP)  I(PP)=1P>P0.5P=P0P<P      (2)

其中 M M M N N N 分别为正、负样本数。上述公式中的求和是在 M + N M+N M+N 个总样本中,取出 M ∗ N M*N MN 个正负样本对,然后计算 I ( P 正 , P 负 ) I(P_正,P_负) I(PP)

  • 第二种:

A U C = ∑ i n s i ∈ 正 例 r a n k i n s i − M ∗ ( M + 1 ) 2 M ∗ N        公 式 ( 3 ) AUC = \frac{\sum_{ins_i ∈ 正例} rank_{ins_i} - \frac{M*(M+1)}{2}}{M*N} \ \ \ \ \ \ 公式(3) AUC=MNinsirankinsi2M(M+1)      (3)

其中 M M M N N N 分别为正、负样本数。
r a n k i n s i rank_{ins_i} rankinsi 是第 i i i 条样本 i n s i ins_i insi 的序号(概率得分从小到大排序,排在第 r a n k rank rank 个位置)。
i n s i ∈ 正 例 ins_i ∈ 正例 insi 表示只把正样本的序号加起来。

GAUC:Group AUC

为什么要引入GAUC:因为AUC有时候不能满足推荐/广告系统中用户个性化的需求。

看个例子:

假设现有两个用户甲和乙,一共有5个样本其中+表示正样本,-表示负样本。现有两个模型A和B,对5个样本的predict score按从小到大排序如下:

在这里插入图片描述
从以上模型预测结果可以看出,对于用户甲的样本,模型A和B对甲的正样本打分都比其负样本高;对于用户乙的样本也是如此,因此分别对于用户甲和乙来说,这两个模型的效果是一样好的。

但这两个模型的AUC如何呢?根据公式(3)计算, A U C A = 0.833 AUC_A = 0.833 AUCA=0.833 A U C B = 0.667 AUC_B = 0.667 AUCB=0.667。我们发现AUC在这个场景下不准了。这是因为,AUC是对于全体样本排序后计算的一个值,反映了模型对于整体样本的排序能力。但用户推荐是一个个性化的场景,不同用户之间的商品排序不好放在一起比较。因此阿里妈妈团队使用了Group AUC来作为另一个评价指标。GAUC即先计算各个用户自己的AUC,然后加权平均,公式如下:

G A U C = ∑ u i w u i ∗ A U C u i ∑ w u i GAUC = \frac{\sum_{ui} w_{ui} * AUC_{ui}}{\sum w_{ui}} GAUC=wuiuiwuiAUCui

实际计算时,权重可以设为每个用户view或click的次数,并且会滤掉单个用户全是正样本或全是负样本的情况。

GAUC代码

'''
df:pandas数据框
models:模型列表,这里用的是GBDT+LR
return:gaucclick, gaucall,分别为权重为每个用户点击数、每个用户样本数的GAUC
'''
def calculationGAUC(df, models):
    gbdt, ohecodel, lr = models[0], models[1], models[2]
    sumWAUCclick, sumWclick = 0, 0
    sumWAUCall, sumWall = 0, 0
    for suuid, data in df.groupby('suuid'):
        # 过滤单个用户全是正样本或全是负样本的情况
        if len(set(list(data['y']))) == 1:
            continue
        # 计算权重为每个用户的点击数、每个用户样本数
        wclick = data['y'].sum()
        wall = len(list(data['y']))
        # 对于每个用户预测并计算其AUC
        x, y = np.array(data.iloc[:, 1:-1]), np.array(data.iloc[:, -1:])
        x_leaves = gbdt.apply(x)[:, :, 0]
        x_trans = ohecodel.transform(x_leaves)
        y_pre = lr.predict(x_trans)
        aucUser = roc_auc_score(y, y_pre)
        # 分子、分母累加
        sumWAUCclick = sumWAUCclick + wclick * aucUser
        sumWAUCall = sumWAUCall + wall * aucUser
        sumWclick += wclick
        sumWall += wall

    gaucclick = sumWAUCclick / sumWclick
    gaucall = sumWAUCall / sumWall
    return gaucclick, gaucall

也可以参考这个代码:

https://github.com/qiaoguan/deep-ctr-prediction/blob/master/DeepCross/metric.py

猜你喜欢

转载自blog.csdn.net/qq_42363032/article/details/120070512
今日推荐