这篇博文主要参考了2017 年的WWW的paper《Model Ensemble for Click Prediction in Bing Search Ads》。虽然这里的model ensemble用到的场景是点击预测,但是其中的思想可以用在任意的使用机器学习的场景。
首先要说的是,这篇文章里介绍的模型融合策略是基于GBDT(XGBOOST)、DNN和LR这三种基本的分类器。(其实在实战中用的最多的也就是这三种分类器了,同时不难看出LR等效于没有隐藏层且输出层维度为1的DNN)。
同时需要注意的是,这篇paper里用到的DNN只包含了一层隐层单元,论文里的解释是虽然多层的DNN能够显著的提升线下的成绩,但是可能容易造成过拟合,导致线上成绩很烂(这只是paper中的看法,我认为我们不能照搬,在实战中还是要多试试多层网络的,毕竟多层网络的表征能力更强)。
下面就来讲解几种常见的融合方法:
1 GBDT2LR
首先使用GBDT对原始数据进行处理,对原始数据进行特征转换,“treat each individual tree as a categorical feature that takes as feature value the index of the leaf where a sample falls in.”,最后每一棵树都可以看成是一种one-hot feature,最后把所有树的one-hot 集合起来作为LR的输入。
2 LR2GBDT
首先训练出LR,然后把LR预测数的分数和原来样本的特征一起作为GBDT的输入特征。
3 GBDT2DNN
首先训练出GBDT,把GBDT的预测分数和原来的样本特征一起作为DNN的输入特征。
4 DNN2GBDT
首先训练出DNN,把DNN的预测分数和原来的特征一起作为GBDT的输入特征。
5 GBDT+DNN
分别使用原来的训练数据训练出GBDT和DNN,然后对两者的结果取平均作为最后的预测分数。
6 LR+GBDT
首先训练出一个LR,然后把LR的预测分数和正确label之间的残差作为GBDT的输入,然后迭代训练出T棵树。
p=σ(ylr+ygbdt)
ylr=w.x+b
ygbdt=r1.ylr+∑Tt=2rt.ft(x)
其中
ft(x)
代表了gbdt中的第t棵树
7 DNN+GBDT
和上面的差不多,首先训练出一个DNN,然后把LR的预测分数和正确label之间的残差作为GBDT的输入,然后迭代训练出T棵树。
p=σ(ydnn+ygbdt)
ydnn=w.x+b
ygbdt=r1.ydnn+∑Tt=2rt.ft(x)
其中
ft(x)
代表了gbdt中的第t棵树
8 LR2DNN
首先训练出一个LR,然后把LR的分数和原来的特征一起作为DNN的输入特征。如图所示:
这里需要注意的是,position bias并没有和其他的feature cross在一起,说明了神经网络的构建并不一定都是全连接,我们也是选择性的把具有相关意义的特征cross在一起,这样构造的网络才更具有可解释性,如果把现实中的没有含义的特征强行cross在一起并不是明智的选择。也许传统的CNN就是这样构造出来的,只是把相邻的元素卷在了一起,因为只有相邻的元素是有意义的。这也就是为什么LR中的特征中不能同时出现类别特征和数值特征的原因吧。
需要注意的是,在DNN和LR等模型中在处理之前要对数值特征进行归一化预处理,之所以这样处理,这主要是方便后面的优化。一般来说在优化目标函数的时候,一般采用的是随机梯度下降策略,比方说对目标函数 Loss=(w1∗x1+w2∗x2−yi)2 进行优化的时候,如果不进行归一化预处理那么 w1 就更新为 w1=w1+α∗x1∗2(w1∗x1+w2∗x2−yi) ,其中 α 为学习速率,不难看出量纲大的变量往往拥有更大的步长。这是如果使用较小的学习速率去迎合量纲大的变量,就会使小量纲变量收敛速度太慢;如果使用较大的学习速率去迎合量纲小的变量,就会使大量纲变量步幅太大。这两者都会影响最终的优化结果,因此做归一化使得优化过程变得简单,更容易找到全局最优解。需要注意的是,并不是所有的机器学习算法都是需要归一化预处理的,我认为只有那些特征之间cross在一起的,具有上述不同量纲数据之间学习速率不一致问题的算法才需要,如果特征之间互相独立(比方说决策树类型)就不需要归一化操作了。