单值AUC
AUC主要用于评估当前模型的排序能力,假设一共有m条正样本和n条负样本,模型为model,那么通过model可以对其中每一条记录进行预测并获得概率值。
对于m条正样本和n条负样本,一共可以有mn中二元组合方式,每个二元组包括一条正样本和一条负样本,对所有的二元组使用model进行预测,倘若正样本的概率值大于负样本则加1,统计所有的和,将该和除以mn就是AUC值。
- 这种说法并不那么的严谨,因为倘若所有的样本都预测为同一概率的话,那么AUC应该是0.5,而上述说法的话AUC就是0了,但是样本数量充足的情况下,AUC大致如上所述,理解一下AUC是衡量模型排序能力的指标就OK了,之后会写一篇关于AUC的具体含义的文章可以加深一下理解。
AUC表示随机给定一个正样本和负样本,正样本的模型预测概率大于负样本的预测概率的概率值,AUC越高表示模型排序能力越好,若所有正样本的预测概率值都高于负样本,模型的AUC就是1。
单值AUC的意义我认为就是评估该特征对于整体样本划分的子空间是否更加符合当前数据集整体的点击分布,倘若训练集和测试集的分布完全相同那么CTR的问题就可以获得解决了,但是通常而言训练集和测试集数据分布是存在差异并且不断变化的,所以空间的划分不能太粗粒度则会丧失学习能力,太细粒度则会过拟合。
当前做法
- 当前计算单值AUC使用的是所有的训练数据集但特征只选择某一类例如只使用年龄特征,通过CTR模型例如LR、GBDT等进行训练,通过logloss来作为优化目标训练,之后通过模型在训练集以及测试集输出的概率值以及样本真实的label计算其AUC。
- 这种做法有个问题是,模型经过多次训练迭代收敛,速度较慢,还需要涉及到特征onehot训练啊什么的,本文提出如何优化其计算。
单特征作用
想要优化计算方式,很重要的一点是理解单值AUC到底是如何计算的,或者说通过单值特征训练得到的模型预估结果有什么特点?
首先,单值特征或者说交叉特征形成的单值特征,其作用就是为样本划分更加细粒度的子空间。
- 对于经典的ctr场景来说,我只用一个简单交叉特征就可以达到在训练集AUC达到1,这种方案带来的问题就是过拟合非常严重,也就是交叉特征是为了划分子领域来提升记忆功能的,但是如果粒度太细过拟合会非常严重。
- 这个交叉特征就是用户id关联物品id,倘若用户与物品存在多次的交互记录那么再交叉一个次数特征,这相当于模型是一个记忆能力非常夸张的人,他可以记住用户对物品在第几次到底有没有点击,但是这种形式的泛化能力非常非常之差。
- 综上而言,交叉特征有效但是也需要注意其划分的子空间粒度,在精度不够时通过交叉特征提升精度,但是也要做好过拟合的风险准备,这些都需要依赖具体的业务进行分析。
好的,回到之前说的,单值特征训练时模型到底获得了什么结果?先上结论,模型收敛于每个划分子空间在训练集上的平均ctr,这个时候整体模型的似然函数也是最大的,满足最大熵理论。
- 下面给一下证明过程。
证明
好的,来到上一部分提到的证明环节,这里假设大家对于一些基本的知识例如sigmoid、极大似然等都有一定的了解,下面的证明过程中就不对这些部分进行展开介绍了。
首先,我们假设训练数据集有n条样本,
δ
(
i
)
\delta(i)
δ(i)代表第i条样本通过模型预测的为正例的概率(以LR为例即是sigmoid激活后的概率值),那么第i条样本为负例的概率为
1
−
δ
(
i
)
1-\delta(i)
1−δ(i),整体就是如下所示,其中y(i)表示第i条样本的真实label。
p
(
i
)
=
{
δ
(
i
)
y(i)=1
1
−
δ
(
i
)
y(i)=0
p(i)= \begin{cases} \delta(i)& \text{y(i)=1}\\ 1-\delta(i)& \text{y(i)=0} \end{cases}
p(i)={δ(i)1−δ(i)y(i)=1y(i)=0将上式进行统一,表达为如下:
p
(
i
)
=
δ
(
i
)
y
(
i
)
∗
(
1
−
δ
(
i
)
)
1
−
y
(
i
)
p(i)={\delta(i)}^{y(i)}*{(1-\delta(i))}^{1-y(i)}
p(i)=δ(i)y(i)∗(1−δ(i))1−y(i)
那么对于全体的训练数据集,我们希望的是在训练集上的对数似然函数取极大(取对数将连乘变为求和),由于样本数量不等,因此objective即优化目标取平均,公式如下:
l
o
s
s
=
1
n
∑
i
=
1
n
y
(
i
)
l
o
g
(
δ
(
i
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
(
δ
(
i
)
)
)
loss=\frac{1}{n}\sum _{i=1}^{n}y(i)log(\delta(i))+(1-y(i))log(1-(\delta(i)))
loss=n1i=1∑ny(i)log(δ(i))+(1−y(i))log(1−(δ(i)))
这里由于我们使用的是单特征对样本进行子空间的划分,假设我们使用的是feature,并将样本空间划分为了K个,每个样本空间对应的样本数量为
C
k
C_k
Ck,那么loss可以改写为以下公式:
l
o
s
s
=
1
n
∑
k
=
1
K
∑
i
=
1
C
k
y
(
i
)
l
o
g
(
δ
(
i
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
(
δ
(
i
)
)
)
loss=\frac{1}{n}\sum _{k=1}^{K}\sum _{i=1}^{C_k}y(i)log(\delta(i))+(1-y(i))log(1-(\delta(i)))
loss=n1k=1∑Ki=1∑Cky(i)log(δ(i))+(1−y(i))log(1−(δ(i)))
观察上式,因为我们的样本只有一个特征,也就是说在K个子空间内部,他的预测值是一样的,因为只有一个特征用于预测,这里以
δ
(
k
)
\delta(k)
δ(k)表示其预测值,以
C
k
p
C_{kp}
Ckp代表K子空间下训练集的正样本数量,则负样本的数量为
C
k
−
C
k
p
C_k-C_{kp}
Ck−Ckp,优化目标变为如下:
a
r
g
m
a
x
l
o
s
s
=
1
n
∑
k
=
1
K
C
k
p
l
o
g
(
δ
(
k
)
)
+
(
C
k
−
C
k
p
)
l
o
g
(
1
−
(
δ
(
k
)
)
)
argmax\ loss=\frac{1}{n}\sum _{k=1}^{K}C_{kp}log(\delta(k))+(C_k-C_{kp})log(1-(\delta(k)))
argmax loss=n1k=1∑KCkplog(δ(k))+(Ck−Ckp)log(1−(δ(k)))
可以发现影响loss最大的K个空间之间是相互独立的,求总体最大相当于分别求各个子空间下的loss最大,最后求和即可。
也就是说最大化
a
r
g
m
a
x
1
n
∑
k
=
1
K
C
k
p
l
o
g
(
δ
(
k
)
)
+
(
C
k
−
C
k
p
)
l
o
g
(
1
−
(
δ
(
k
)
)
)
argmax\ \frac{1}{n}\sum _{k=1}^{K}C_{kp}log(\delta(k))+(C_k-C_{kp})log(1-(\delta(k)))
argmax n1k=1∑KCkplog(δ(k))+(Ck−Ckp)log(1−(δ(k)))相当于挨个优化:
a
r
g
m
a
x
C
k
p
l
o
g
(
δ
(
k
)
)
+
(
C
k
−
C
k
p
)
l
o
g
(
1
−
(
δ
(
k
)
)
)
argmax\ C_{kp}log(\delta(k))+(C_k-C_{kp})log(1-(\delta(k)))
argmax Ckplog(δ(k))+(Ck−Ckp)log(1−(δ(k)))
- 那么我们求其中一个子空间下的loss优化的解,这里求导麻烦,就用手写的了,不敲公式了,如下图:
- 其实也就是直接对 C k p l o g ( δ ( k ) ) + ( C k − C k p ) l o g ( 1 − ( δ ( k ) ) ) C_{kp}log(\delta(k))+(C_k-C_{kp})log(1-(\delta(k))) Ckplog(δ(k))+(Ck−Ckp)log(1−(δ(k)))进行求导,上图中的t1代表的是子空间中正样本的数量,Ct代表子空间中样本的总数量,对该式子求导后可以直接求得其函数最优解,并且由于只有一个极值点,所以不存在局部最优解的情况。
- 根据上面的推导可以发现,把每个子空间下的样本点全部预测为子空间上正样本的比例就会使得对数似然函数到极大,也就是之前说到的结论,模型会将收敛于预测值等于单特征划分的子空间在训练数据集下的平均CTR值。
优化计算
前面介绍了单值特征进行训练的背景,也基于数学证明了模型的收敛,那么如何加速计算AUC呢?
相信大家应该都知道了,给定训练数据集,统计该特征划分的子空间下的平均点击率,将该点击率与测试集进行join,然后计算AUC即可。
后语
因为使用的是单特征,所以最优化直接使用求导便ok了,随着特征数量的提升,求取几何解(这种应该叫啥我记不清了,欢迎指正)变得越来越困难,并且上升至更高的维度后局部最优解也越来越多,通过梯度下降等一些最优化方法可以有效地高效率进行求解,虽然也会陷入局部最优解,但是也有许多的方案来尽量摆脱这种问题来尽可能求取最优解,例如变化步长、模拟退火、蚁群算法等等。