个性化推荐系统是达观数据在金融、电商、媒体、直播等行业的主要产品之一。在达观数据的个性化推荐系统架构中, 可以简单地分为5层架构,每层处理相应的数据输出给下一层使用,分别是:
数据处理层 作为推荐系统最低端的数据处理层,主要功能是首先将客户上传上来的一些无用的噪声数据进行清理过滤,将推荐系统所需要用到的数据导入到数据存储层中;
数据存储层 对于item的数据一般存入在Mysql中,随着数据量越来越大的item的数据,相比Mysql的扩展性来说,HBase和Hive是一个更好的选择,Hive可以方便离线分析时操作。而对于实时模块,以及一些用进程同步相关的模块,实时性要求比较高的,redis就可以派上用场了,作为缓存,生产者生产数据写入redis供消费者读取;
生成候选集 通过一系列的基础算法如协同过滤,content-base,点击反馈,热门等数据给每个用户生成个性化的候选集;
融合候选集 将各个算法生成的候选集的item按照一系列规则进行融合过滤。
重排序 将融合过滤后的item集合用一定的算法重新排序,将排序后的结果输出到用户,这边主要常用到机器学习相关模型和算法,如LR和GBDT。
本文将着重浅析一下重排序用到的集成学习算法(Ensemble Method)
集成学习算法本身不算一种单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务。可以说是集百家之所长,能在机器学习算法中拥有较高的准确率,不足之处就是模型的训练过程可能比较复杂,效率不是很高。
目前常见的集成学习算法主要有2种:基于Bagging的算法和基于Boosting的算法,基于Bagging的代表算法有随机森林,而基于Boosting的代表算法则有Adaboost、GBDT、XGBOOST等。
Bagging算法(装袋法)是bootstrap aggregating的缩写,它主要对样本训练集合进行随机化抽样,通过反复的抽样训练新的模型,最终在这些模型的基础上取平均。
基本思想
1.给定一个弱学习算法,和一个训练集;
2.单个弱学习算法准确率不高;
3.将该学习算法使用多次,得出预测函数序列,进行投票;
4.最后结果准确率将得到提高。
以随机森林为例来详解:
随机森林由LeoBreiman(2001)提出,从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练样本集合,然后根据自助样本集生成k个分类树组成随机森林,新数据的分类结果按分类树投票多少形成的分数而定。
其实质是对决策树算法的一种改进,将多个决策树合并在一起,每棵树的建立依赖于一个独立抽取的样品,森林中的每棵树具有相同的分布,分类误差取决于每一棵树的分类能力和它们之间的相关性。
特征选择采用随机的方法去分裂每一个节点,然后比较不同情况下产生的误差。能够检测到的内在估计误差、分类能力和相关性决定选择特征的数目。单棵树的分类能力可能很小,但在随机产生大量的决策树后,一个测试样品可以通过每一棵树的分类结果经统计后选择最可能的分类。
1 选取n个数据作为训练数据输入
从训练数据中选取n个数据作为训练数据输入,一般情况下n是远小于整体的训练数据N的,这样就会造成有一部分数据是无法被取到的,这部分数据称为袋外数据,可以使用袋外数据做误差估计。
2 构建决策树
选取了输入的训练数据的之后,需要构建决策树,具体方法是每一个分裂结点从整体的特征集M中选取m个特征构建,一般情况下m远小于M。
3 分裂节点的选取
在构造每棵决策树的过程中,按照选取最小的基尼指数进行分裂节点的选取进行决策树的构建。决策树的其他结点都采取相同的分裂规则进行构建,直到该节点的所有训练样例都属于同一类或者达到树的最大深度。
4 得到随机森林
重复第2步和第3步多次,每一次输入数据对应一颗决策树,这样就得到了随机森林,可以用来对预测数据进行决策。
5 进行预测
输入的训练数据选择好了,多棵决策树也构建好了,对待预测数据进行预测,比如说输入一个待预测数据,然后多棵决策树同时进行决策,最后采用多数投票的方式进行类别的决策。
1.在构建决策树的过程中是不需要剪枝的。
2.整个森林的树的数量和每棵树的特征需要人为进行设定。
3.构建决策树的时候分裂节点的选择是依据最小基尼系数的。
提升算法(Boosting)是常用的有效的统计学习算法,属于迭代算法,它通过不断地使用一个弱学习器弥补前一个弱学习器的“不足”的过程,来串行地构造一个较强的学习器,这个强学习器能够使目标函数值足够小。
基本思想
1.先赋予每个训练样本相同的概率;
2.然后进行T次迭代,每次迭代后,对分类错误的样本加大权重(重采样),使得在下一次的迭代中更加关注这些样本。
Boosting系列算法里最著名算法主要有AdaBoost算法和提升树(boosting tree)系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)。
以AdaBoost算法作为代表算法来详解:
Adaboost(adaptive boosting: boosting + 单层决策树)是boosting中较为代表的算法,基本思想是通过训练数据的分布构造一个分类器,然后通过误差率求出这个若弱分类器的权重,通过更新训练数据的分布,迭代进行,直到达到迭代次数或者损失函数小于某一阈值。
假设训练数据集为
其中有
1.初始化训练数据的分布
训练数据的权重平均分布为
其中
2.选择基本分类器
这里选择最简单的线性分类器
分类器选定之后,最小化分类误差可以求得参数。
3.计算分类器的系数和更新数据权重
误差率也可以求出来为。同时可以求出这个分类器的系数。
基本的Adaboost给出的系数计算公式为
然后更新训练权重分布为
其中规范因子为
4.得出分类器的组合
数学上可以证明,AdaBoost方法不断拟合一个强学习器的过程其实是利用某种优化方法(如自适应牛顿法)使目标函数最小的过程。
Bagging算法与Boosting算法的核心都是将一系列弱学习器的算法按照特定的结合策略组合成强学习器的过程。两者之间的区别在于以下几点上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化.而权值是根据上一轮的分类结果进行调整。
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
Bagging:各个预测函数可以并行生成。
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
以上部分我们主要关注与学习器本身,对于学习器之间的结合策略并未涉及到,这一小节主要介绍常见的结合策略,主要有平均法,投票法,学习法。
对于数值类的回归预测问题,通常使用的结合策略是平均法,也就是说,对于若干和弱学习器的输出进行平均得到最终的预测输出。最简单的平均是算术平均,也就是说最终预测为:
如果每个学习器有一个权重w,则最终预测为
其中是个体学习器的权重,有
假设我们的预测类别是,对于任意一个预测样本x,我们的个弱学习器的预测结果分别是。 最简单的投票法是相对多数投票法,也就是我们常说的少数服从多数,也就是个弱学习器的对样本X的预测结果中,数量最多的类别为最终的分类类别。如果不止一个类别获得最高票,则随机选择一个做最终类别。
稍微复杂点的投票有绝对多数投票法,也就是我们常说的要票过半数。在相对多数投票法的基础上,不光要求获得最高票,还要求票过半数。
更加复杂的是加权投票法,和加权平均法一样,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。
上两节的方法都是对弱学习器的结果做平均或者投票,相对比较简单,但是可能学习误差较大,于是就有了学习法这种方法。对于学习法,代表方法是stacking,当使用stacking的结合策略时, 我们不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。
在这种情况下,我们将弱学习器称为初级学习器,将用于结合的学习器称为次级学习器。对于测试集,我们首先用初级学习器预测一次,得到次级学习器的输入样本,再用次级学习器预测一次,得到最终的预测结果。
Bagging和Boosting都是把若干个分类器整合为一个分类器的集成学习方法,只是整合的方式不一样,最终得到不一样的效果。下面是将决策树与这些算法框架进行结合所得到的新的算法:
1.Bagging + 决策树 = 随机森林
2.AdaBoost + 决策树 = 提升树
3.Gradient Boosting + 决策树 = GBDT
其中GBDT在达观数据个性化推荐重排序层得到很好地应用。
作者:陈祥龙,达观数据数据挖掘工程师,毕业于复旦大学计算机科学与技术专业,现主要负责大型私有化推荐项目部署工作。