src/objective/rank_obj.cu
xgboost官方文檔中說(shuō)明objective:rank 中的方法都是通過(guò)LambdaMart來(lái)實(shí)現(xiàn)的
數(shù)據(jù)結(jié)構(gòu):LambdaPair:包括pos_index(正索引) neg_index(負(fù)索引) 以及該lambdapair的權(quán)值(初始化為1)
ListEntry:包含pred預(yù)測(cè)值大咱、label標(biāo)簽值宋光、rindex原樣本的索引
定義的類:
這段代碼的主體為類模版:LambdaRankObj 根據(jù)LambdaWeightComputerT模版參數(shù)取PairWiseComputer MAPLambdaWeightComputer NDCGLambdaWeightComputer三種值來(lái)實(shí)例化不同的模版類咪橙,主要的區(qū)別在于delta的計(jì)算碍脏。
對(duì)父類中GetGradient方法進(jìn)行了重載李剖,由于rank回設(shè)置group所以要對(duì)當(dāng)前group是否合理進(jìn)行判斷。(即大小是不是0以及pred和label的group大小是否一致)
方法:ComputeGradients()
形參: preds_h(預(yù)測(cè)值) labels(標(biāo)簽值) gpair(一階與二階梯度構(gòu)成的pair)gptr(分組信息)
內(nèi)部容器:pairs 用來(lái)存儲(chǔ)LambdaPair lst用來(lái)存儲(chǔ)ListEntry rec存儲(chǔ)預(yù)測(cè)值與在原group內(nèi)的索引值
按group對(duì)已有的數(shù)據(jù)進(jìn)行操作
先初始化當(dāng)前group中的lst(pred节芥,label有滑,rindex) 以及 梯度對(duì)(初始化為0)
Lambda的計(jì)算(對(duì)應(yīng)xgboost中的g和h)
先按預(yù)測(cè)值進(jìn)行排序,再將label與原有的預(yù)測(cè)值排序后的index進(jìn)行對(duì)應(yīng)并存入rec中壹士,再將rec按照l(shuí)abel大小進(jìn)行排序
從i開始到rec的結(jié)尾產(chǎn)生隨機(jī)數(shù)與當(dāng)前下標(biāo)匹配湊成pair(該過(guò)程由參數(shù)num_pairsample控制磷雇,當(dāng)pairsample數(shù)量等于rec長(zhǎng)度時(shí)就全部取樣,小于時(shí)就取部分)躏救,當(dāng)下標(biāo)值小于當(dāng)前index時(shí)pair pos_index = 隨機(jī)數(shù)的index neg_index = i的index若隨機(jī)數(shù)大于等于當(dāng)前遍歷的值則位置相反且 neg_index = 隨機(jī)數(shù)index+1(防止產(chǎn)生相同的index)
計(jì)算lambda的值唯笙,對(duì)每一個(gè)pair計(jì)算lambda并將其匯總加到某個(gè)index的lambda中,于此同時(shí)計(jì)算每一個(gè)pair的二階梯度最后將得到的兩項(xiàng)與group占的權(quán)重以及delta值相乘得到該sample的g與h xgboost可以通過(guò)每個(gè)sample對(duì)應(yīng)的一二階導(dǎo)數(shù)計(jì)算各點(diǎn)的增益從而對(duì)分裂點(diǎn)進(jìn)行尋找
PairWiseLambdaComputer
weight為初始值1盒使,getweight函數(shù)為空崩掘,最后直接與lambda相乘
NDCGLambdaWeightComputer
首先根據(jù)label對(duì)排序算出IDCG的值
再根據(jù)輸入的pos_index和neg_index計(jì)算出交換坐標(biāo)導(dǎo)致的ndcg變化即delta數(shù)值,并將該數(shù)值以weight的形式存入pair中少办,最后與lambda相乘
MAPLambdaWeightComputer
根據(jù)pos_index neg_index以及兩者的label和pred的值苞慢,計(jì)算在交換兩者順序的情況下的delta值,在計(jì)算完成后以weight的形式存入pair中英妓,最后與lambda相乘