LambdaMART的源码分析:一(MART:回归树)
来源:互联网 发布:苏州网络测试招聘 编辑:程序博客网 时间:2024/06/06 20:57
LambdaMART的源码分析:一(MART:回归树) 2014-12-31 17:39 508人阅读 评论(0)收藏举报
本文章已收录于:
分类:
作者同类文章X
版权声明:本文为博主原创文章,未经博主允许不得转载。
参考论文:
From RankNet to LambdaRank to LambdaMART: An Overview(公式主要引用这个)
From RankNet to LambdaRank to LambdaMART: An Overview(公式主要引用这个)
GREEDY FUNCTION APPROXIMATION: A GRADIENT BOOSTING MACHINE (MART的思想)
Adapting boosting for information retrieval measures
回归树:
1.思想(参考李航的《统计学习方法》的5.51节CART生成)
注意:这里的回归树,每次split的时候,都是为了选择最优的feature和切分点,这里的切分点,只会按照该feature,把数据集一分为二
2.回归树实现(ciir.umass.edu.learning.tree.RegressionTree 二叉树)
参数介绍:
int nLeaves //控制分裂的次数,这个次数是按照节点来算的,而不是按照层数来计算的,例如,2个叶子的时候,分裂1次;3个叶子的时候,分裂2次;4个叶子的时候,分裂3次。N个叶子,分裂N-1次。
DataPoint[] trainingSamples //训练的数据点
double[] labels //这里的lables就是y值,在lambdaMART里为lambda值
FeatureHistogram hist,
int minLeafSupport //控制分裂的次数,如果某个节点所包含的训练数据小于2*minLeafSupport ,则该节点不再分裂。
fit方法
根据输入的数据以及lable值,生成回归树。
辅助类:
ciir.umass.edu.learning.tree.FeatureHistogram来选择每次split时的最优feature和最优划分点
construct方法:
sum[i][j] : 指定feature i 的所有值(训练数据中出现的值),每个j代表一个训练数据中出现的一个值,
sum[i][j]的值为feature i 的所有小于某个指定值(该值由threshold[j]提供)的训练数据 datapoint的label(该算法里为lambda)之和。
count[i][j]:
指定feature i 的所有值(训练数据中出现的值),每个j代表一个训练数据中出现的一个值,
sum[i][j]的值为feature i 的所有小于某个指定值(该值由threshold[j]提供)的训练数据 datapoint的总数。
update方法:
用新的label更新sum[i][j]
findBestSplit方法:
a.选取feature作为划分的备选(可全选,可选部分)。
b.选取最优feature和最优划分点
计算每个feature的每个划分点,
double S = sumLeft * sumLeft / countLeft + sumRight * sumRight / countRight;
最小的S即为最优feature和最优划分点s(该s是feature的具体值)。
sumLeft是该节点下某个feature的值小于指定值(备选s)的所有训练数据的lambad之和。
countLeft是该节点下某个feature的值小于指定值(备选s)的所有训练数据的总数。
sumRight 是该节点下某个feature的值大于等于指定值(备选s)的所有训练数据的lambad之和。
countRight是该节点下某个feature的值大于等于指定值(备选s)的所有训练数据的总数。
这里非常不理解,参考CART的资料,均不是按照这种方式来分裂的,希望有朋友能够帮忙解释一下
int countLeft = count[i][t];
int countRight = totalCount - countLeft;
int countRight = totalCount - countLeft;
double sumLeft = sum[i][t];
double sumRight = sumResponse - sumLeft;
double S = sumLeft * sumLeft / countLeft + sumRight * sumRight / countRight;
if(cfg.S < S)
{
cfg.S = S;
cfg.featureIdx = i;
cfg.thresholdIdx = t;
}
double sumRight = sumResponse - sumLeft;
double S = sumLeft * sumLeft / countLeft + sumRight * sumRight / countRight;
if(cfg.S < S)
{
cfg.S = S;
cfg.featureIdx = i;
cfg.thresholdIdx = t;
}
通过学习LambdaMART的思路,构建树的时候,输入为(xi,lambdai),其中lambdai代表着对xi的评分(影响排序结果,是增大还是减少)。
最好的划分点,就是把增大的划分到一起(全部为正值,相加结果为sumA),减少的划分到一起(全部为负值,相加结果为sumb).
此时的sumA*sumA/countA+sumB*sumB/countB为最大。
因此,这里的S的含义为:该划分点尽量把正值和负值区分开。 正值表示:后续评分调大;负值表示:后续评分调小;
lambdai就是si从newTree中获取的值,表示si的值如何调整才能满足C最大(类似梯度)。
C表示的是排序后的NDCG,求其最大值。
Sim=Sim-1+lambdai
Sim-1为经过m-1棵树之后,i的评分;
Sim为经过m棵树之后,i的评分;
lambdai就是第m棵树对i的影响,决定了评分是增大,还是减少
0 0
- LambdaMART的源码分析:一(MART:回归树)
- LambdaMART的源码分析:一(MART:回归树)
- LambdaMART的源码分析:一(MART:回归树)
- LambdaMART的源码分析:二(LambdaMART的流程)
- RankLib源码分析---MART(GBRT)
- 回归模型的分析一
- LambdaMART的思想
- 求解LambdaMART的疑惑?
- LambdaMART的思想
- 树回归源码分析(1)
- LambdaMART简介——基于Ranklib源码(一 lambda计算)
- LambdaMART简介——基于Ranklib源码(一 lambda计算)
- Glide的源码分析<一>
- spark mllib源码分析之逻辑回归弹性网络ElasticNet(一)
- 树回归(源码实现)
- 相关分析与回归分析(一)
- Spark MLlib之线性回归源码分析
- mllib逻辑回归LogisticRegressionWithLBFGS LogisticRegressionModel源码分析
- Linux命令-find
- 机器学习经典图
- 【poj 3150】Cellular Automaton 矩阵
- 19. Remove Nth Node From End of List
- 沉浸式状态栏
- LambdaMART的源码分析:一(MART:回归树)
- 160601iOS 模拟器 打开关闭模拟键盘
- 微软研究院Detour开发包之API拦截技术
- c++-引用一维数组
- 我的女助理辞职了!---精英会里老板们不断转发的文章
- 6-6 8255并行接口(LED)
- [LeetCode][3]Longest Substring Without Repeating Characters解析 -Java实现
- 21. Merge Two Sorted Lists
- 给iOS开发新手送点福利,简述UIDatePicker的用法