参考论文:
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;
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;
}
通过学习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的影响,决定了评分是增大,还是减少