RankLib源码分析---MART(GBRT)
来源:互联网 发布:88端口怎么起 编辑:程序博客网 时间:2024/05/17 08:27
参考论文:
GREEDY FUNCTION APPROXIMATION: A GRADIENT BOOSTING MACHINE
1.boosting的算法流程
2.针对排序问题的具体算法
这里F(x)为我们针对指定query的x文档的打分结果。
对L的定义为:
因此
对于树h,需要满足:
代码实现中˜yi的结果为正或者为负,最佳切分点S定义在:
构建树的时候,输入为(xi,lambdai),其中lambdai代表着对xi的评分(影响排序结果,是增大还是减少)。
最好的划分点,就是把增大的划分到一起(全部为正值,相加结果为sumA),减少的划分到一起(全部为负值,相加结果为sumb).此时的sumA*sumA/countA+sumB*sumB/countB为最大。
因此,这里的S的含义为:该划分点尽量把正值和负值区分开。 正值表示:后续评分调大;负值表示:后续评分调小;
源码分析:
ciir.umass.edu.learning.tree.MART类:
对求导,得到
protected void computePseudoResponses()
{
for(int i=0;i<martSamples.length;i++)
pseudoResponses[i] = martSamples[i].getLabel() - modelScores[i];
}
{
for(int i=0;i<martSamples.length;i++)
pseudoResponses[i] = martSamples[i].getLabel() - modelScores[i];
}
根据构建的回归树,求得pm=(某个叶子节点下所有残差之和的平均值,决定是增大评分,还是减少评分)
protected void updateTreeOutput(RegressionTree rt)
{
List<Split> leaves = rt.leaves();
for(int i=0;i<leaves.size();i++)
{
float s1 = 0.0F;
Split s = leaves.get(i);
int[] idx = s.getSamples();
for(int j=0;j<idx.length;j++)
{
int k = idx[j];
s1 += pseudoResponses[k];
}
s.setOutput(s1/idx.length);
}
}
GRBT与LambdaMART的区别
两者的区别在于,其损失函数不一样,求导的形式不一样,求叶子赋值的方式pm不一样。
GRBT的损失函数:
求满足L最小值的F,对F求导的结果为。
根据残差(yi-Fm-1(xi),即L的求导值),构建回归树,并求每个叶子的值ρm,使得
对h进行切分的时候,使得残差为负的尽量聚集在一起,残差为正的尽量聚集在一起。因此每个叶子的ρm最后为该叶子下的残差的平均值。 如果残差为负的聚集在一起,得到一个负的平均值pm, (残差-pm)的平方会尽量的小(是否是最小。这个需要大神来证明一下);残差为正的,情况于残差为负的相同。
LambdaMART的损失函数:
这里的C代表着NDCG,因此求满足C最大值的S,C对si(xi的评分)求导的结果如图中所示。
其回归树的每个叶子的值如下面的公式计算:
rkm的公式解释:
假设Si要更新为Si=Si+r,将更新后的Si代入到下面的C中
求满足C取最大值时的r。
设r的初值为0,根据Newton-Raphson,求函数最小值为:
这里求最大值,则用加
这部分参考:
From RankNet to LambdaRank to LambdaMART: An Overview的第6节:MART for Two Class Classification。
0 0
- RankLib源码分析---MART(GBRT)
- Ranklib部分源码分析
- RankLib源码分析(三)----LambdaRank
- RankLib源码分析(一):主框架
- RankLib源码分析(二):RankNet
- RankLib源码分析---RFRanker(随机森林)
- Ranklib分析
- 从boost到Adaboost再到GBRT-GBDT-MART
- LambdaMART的源码分析:一(MART:回归树)
- LambdaMART的源码分析:一(MART:回归树)
- LambdaMART的源码分析:一(MART:回归树)
- gbrt(gbdt)源码分享
- Gradient Tree Boosting (GBM, GBRT, GBDT, MART)算法解析和基于XGBoost/Scikit-learn的实现
- LambdaMART简介——基于Ranklib源码(一 lambda计算)
- LambdaMART简介——基于Ranklib源码(二 Regression Tree训练)
- LambdaMART简介——基于Ranklib源码(二 Regression Tree训练)
- LambdaMART简介——基于Ranklib源码(一 lambda计算)
- GBDT、GBRT
- BZOJ 2157 旅游 树链剖分
- 滑动式界面和消息数视图
- Servlet中filter过滤<dispatcher>FORWARD</dispatcher>标签使用
- glViewport
- linux服务器切换用户只显示-bash-4.1#不显示路径
- RankLib源码分析---MART(GBRT)
- 二叉查找树、红黑树、B树、B+树、AVL树
- Leetcode -- Remove Nth Node From End of List
- OpenGL 房子
- table的HTML5+css3的可用样式
- 浅析UML建模中的几种关系
- CM开发日志 - 搜索引擎(三)
- javascript:void(0)是什么意思?JS的几种跳转
- 密码学概述