本文将介绍一下分类任务中的一个非常重要的评估指标: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∗N∑M∗NI(P正,P负), I(P正,P负)=⎩⎪⎨⎪⎧1,P正>P负0.5,P正=P负0,P正<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∗N∑insi∈正例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∑uiwui∗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