當前位置:
首頁 >
LambdaMART的源码分析:一(MART:回归树)
發布時間:2025/3/21
29
豆豆
生活随笔
收集整理的這篇文章主要介紹了
LambdaMART的源码分析:一(MART:回归树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
LambdaMART的源碼分析:一(MART:回歸樹)
2014-12-31 17:39 508人閱讀 評論(0) 收藏 舉報
本文章已收錄于:
分類: learning to rank(6) 作者同類文章X
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的影響,決定了評分是增大,還是減少
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
參考論文: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的影響,決定了評分是增大,還是減少
總結
以上是生活随笔為你收集整理的LambdaMART的源码分析:一(MART:回归树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LambdaMART简介——基于Rank
- 下一篇: MAP(Mean Average Pre