随机森林及Ranklib中的实现(for ranking)

声明:本文是作者原创,如有描述不妥之处,欢迎讨论指正。本文允许转载,码字儿辛苦,万望转载注明出处。

 

一、 Boosting,Bagging和Bootstrapping这三个词到底什么含义

最开始看到这几个词的时候,总是搞不清楚是什么意思,后来在周志华老师的书里面终于搞清楚了。

Boosting:学习算法,每一轮学习所有样本都参与,只是每一轮每个样本的被采样的概率不同,前一 次分得不好的样本下一次被采中的概率更大——没有学好就要被拎出来着重学。

Bootstrapping:采样方法,名叫自助采样法,也就是有放回的采样,具体过程请自行搜索。这个采样方法一个特别好的地方就是,对于全集为m个样本的数据集,总有约1/3的样本不会被采到。没有被采样到的数据可以用来做校验,叫包外估计(out-of-bag estimate), 这样就不需要专门做交叉验证了。

Bagging:学习算法,Bootstrap AGGregatING缩写而来。每一轮通过Bootstrapping方法采样部分数据参与学习,每次学习约2/3的数据参与训练。

总结一下,Bootstrapping是Bagging的采样方法,这个采样方法也许是太好了,所以专门有个名字。Bagging和Boosting最大的区别就在采样方法上了,Bagging两次训练之间没有什么关联,但是Boosting的采样依赖前一次采样后的训练结果。我感觉周老师非常推崇Bagging算法,不过大名鼎鼎的xgboost是Boosting一类的方法。

 

二、 不同的问题对应不同的优化目标

回到随机森林上来,有非常多优秀的库都有RandomForest的实现。在此,感谢大公无私的人儿们贡献出的优秀代码。比如R中的randomForest包,还有“白盒化”随机森林的forestFloor;python的sklearn;java的weka包。

不过,很多包里的随机森林都是做分类和回归任务的。对于分类问题,通常我们的优化目标是最小化(y-f(x))2,也就是最小化错误率,当然还有一些约束项,比如模型的复杂度,回归也类似,但并不是有了特征,有了算法就能把问题解决好的。比如对于推荐问题,用最小化错误率作为优化目标效果可能就很不好。因为推荐问题中样本的类别分布通常很不平衡,正类特别少,反类特征多,通常是1:10,1:100甚至更低。比如检索,返回的结果可能有好几百万条,但是通常我们只需要其中的几条甚至一条结果。这时候,最小化错误率这个优化目标就会引导学习算法把所有的样本分成反类,因为全部分成反类错误率也是接近于0的。但是显然这不是我们想要的结果。

对于推荐,有很多优化指标,如NDCG,MAP等等,这些优化指标都是根据样本的相对位置来计算的,反类排到了正类的前面就减分,看的是f(x)的相对大小。

我感觉要解决好机器学习问题,认识清楚问题,找准优化目标特别重要。

 

三、Ranklib中的随机森林专为推荐而生

Ranklib中的所有算法都是为推荐指标的优化而生的,里面的线性学习器(Coordinate Ascent)都是优化的排序指标,例如NDCG,MAP,BestAtK,Precision(这个精度跟分类精度不同)等等,请自行查阅。

标准的随机森林步骤是:

  (1)Bagging得到m个样本;

  (2)每棵树的每个节点分裂时,在k个属性中选择分裂点,k个属性通过无放回采样得到(k通常取log2(d)+1,d为属性全集);

  (3)用m个样本和每个节点上的k个属性,训练一棵树;

  (4)把(3)生成的树加到集合中;

  (5)重复(1-4),直到满足结束条件。

在Ranklib中,随机森林的步骤是:

  (1)Bagging得到m个数据;

  (2)每棵树的每个节点分裂时,在k个属性中选择分裂点,k个属性通过无放回采样得到(k通常取log2(d)+1,d为属性全集);

  (3)用m个样本和每个节点上的k个属性,训练一棵树或者一个Boosting Tree;

  (4)把(3)生成的树加到集合中;

  (5)重复(1-4),直到满足结束条件。

可以看到,在Ranklib中第(3)步骤与标准的森林不同,Ranklib里的森林,每棵树又可以是一个树的集合。这个树的集合是大名鼎鼎的LambdaMart.关于LambdaMart的介绍,这篇文章写得非常好:

http://www.cnblogs.com/wowarsenal/p/3900359.html,感谢作者wowarsenal的分享。

所以我觉得Ranklib里面的随机森林,对于推荐来说拟合能力已经完美了,最近我正在狂跑结果,期待效果ing。不过前期的效果和线性学习器比并没有特别的优势,可能是数据量太小,对于随机森林数据少了特别容易过拟合。

 

转载于:https://www.cnblogs.com/yucaodie/p/7426249.html

你可能感兴趣的:(随机森林及Ranklib中的实现(for ranking))