IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 推荐中的评估指标:AUC、GAUC -> 正文阅读

[人工智能]推荐中的评估指标: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)

  • 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=2?AUC?1

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=M?NM?N?I(P?P?)???I(P?P?)=??????1P?>P?0.5P?=P?0P?<P????????(2)

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

  • 第二种:

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=M?Ninsi??rankinsi???2M?(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=wui?ui?wui??AUCui??

实际计算时,权重可以设为每个用户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

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 11:53:35  更:2021-09-03 11:54:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 16:34:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码