xgboost to rank訓(xùn)練

首先拿到的數(shù)據(jù)為樣本id 特征數(shù)據(jù) 以及 樣本id 和對應(yīng)的label兩個文檔
先把libsvm的特征處理成xgboost能夠使用的格式逆日,并按8:1:1的比例將數(shù)據(jù)分成訓(xùn)練集岩臣、驗證集以及測試集辣之。

#train id:0-42622
#valid id:42623-47957
#test id:47958-53285
def transdata(feature_file_path,group_file_path,out_feature_path_train,out_feature_path_vaild,out_feature_path_test):
    output_feature_train = open(out_feature_path_train,"w")
    output_feature_valid = open(out_feature_path_vaild, "w")
    output_feature_test = open(out_feature_path_test, "w")
    with open (feature_file_path) as features, open(group_file_path) as groups:
        for x,y in zip(features,groups):
            splits_x = x.strip().split("    ")
            splits_y = y.strip().split("    ")
            if int(splits_x[0])<42623:
                output_feature_train.write(splits_y[0]+" "+splits_x[1]+"\n")
            if int(splits_x[0])>42622 and int(splits_x[0])<47958:
                output_feature_valid.write(splits_y[0]+" "+splits_x[1]+"\n")
            if int(splits_x[0])>47957:
                output_feature_test.write(splits_y[0]+" "+splits_x[1]+"\n")
    output_feature_train.close()
    output_feature_valid.close()
    output_feature_test.close()

if __name__ =="__main__":
    transdata("topic_features.txt","gt.txt","libsvm_format.train.txt","libsvm_format.valid.txt","libsvm_format.test.txt")

對label進(jìn)行分組

#train id:0-42622
#valid id:42623-47957
#test id:47958-53285
def transdata(group_file_path,out_feature_path_train,out_feature_path_vaild,out_feature_path_test):
    output_feature_train = open(out_feature_path_train,"w")
    output_feature_valid = open(out_feature_path_vaild, "w")
    output_feature_test = open(out_feature_path_test, "w")
    groups = open(group_file_path)
    for line in groups:
        if not line:
            break
        splits_x = line.strip().split(" ")
        if int(splits_x[1]) < 42623:
            output_feature_train.write(line)
        if int(splits_x[1]) > 42622 and int(splits_x[0]) < 47958:
            output_feature_valid.write(line)
        if int(splits_x[1]) > 47957:
            output_feature_test.write(line)

    output_feature_train.close()
    output_feature_valid.close()
    output_feature_test.close()

if __name__ =="__main__":
    transdata("gt.txt","gt.train.txt","gt.valid.txt","gt.test.txt")

隨即根據(jù)qid對數(shù)據(jù)進(jìn)行分組,生成.group文件

#train id:0-42622
#valid id:42623-47957
#test id:47958-53285
def transgroup(group_file_path,save_path):
   group_output = open(save_path,"w")
   group_file = open(group_file_path)
   group = ""
   group_data = []
   for line in group_file:
       if not line:
           break
       splits = line.strip().split("   ")
       if splits[2]!=group:
           group_output.write(str(len(group_data))+"\n")
           group_data = []
       group = splits[2]
       group_data.append(splits[0])

   group_output.write(str(len(group_data)) + "\n")
   group_output.close()
   group_file.close()
if __name__ =="__main__":
   transgroup("gt.test.txt","group.test.txt")
objective參數(shù)的解釋
`rank:pairwise`: Use LambdaMART to perform pairwise ranking where the pairwise loss is minimized
`rank:ndcg`: Use LambdaMART to perform list-wise ranking where [Normalized Discounted Cumulative Gain (NDCG)](http://en.wikipedia.org/wiki/NDCG) is maximized

數(shù)據(jù)處理完成后,送入xgboost進(jìn)行訓(xùn)練

#!/usr/bin/python
import xgboost as xgb
from xgboost import DMatrix
from sklearn.datasets import load_svmlight_file

#  This script demonstrate how to do ranking with xgboost.train
x_train, y_train = load_svmlight_file("libsvm_format.train.txt")
x_valid, y_valid = load_svmlight_file("libsvm_format.valid.txt")
x_test, y_test = load_svmlight_file("libsvm_format.test.txt")

group_train = []
with open("group.train.txt", "r") as f:
   data = f.readlines()
   for line in data:
       group_train.append(int(line.split("\n")[0]))

group_valid = []
with open("group.valid.txt", "r") as f:
   data = f.readlines()
   for line in data:
       group_valid.append(int(line.split("\n")[0]))

group_test = []
with open("group.test.txt", "r") as f:
   data = f.readlines()
   for line in data:
       group_test.append(int(line.split("\n")[0]))

train_dmatrix = DMatrix(x_train, y_train)
valid_dmatrix = DMatrix(x_valid, y_valid)
test_dmatrix = DMatrix(x_test)

train_dmatrix.set_group(group_train)
valid_dmatrix.set_group(group_valid)

params = {'objective': 'rank:pairwise', 'eta': 0.1, 'gamma': 1.0,
         'min_child_weight': 0.1, 'max_depth': 6}
xgb_model = xgb.train(params, train_dmatrix, num_boost_round=4,
                     evals=[(valid_dmatrix, 'validation')])
pred = xgb_model.predict(test_dmatrix)

參考代碼1:http://www.reibang.com/p/9caef967ec0a

參考代碼2: https://github.com/dmlc/xgboost/blob/master/demo/rank/rank.py

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末檩帐,一起剝皮案震驚了整個濱河市崖面,隨后出現(xiàn)的幾起案子元咙,更是在濱河造成了極大的恐慌,老刑警劉巖巫员,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庶香,死亡現(xiàn)場離奇詭異,居然都是意外死亡简识,警方通過查閱死者的電腦和手機(jī)赶掖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門感猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奢赂,你說我怎么就攤上這事陪白。” “怎么了膳灶?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵咱士,是天一觀的道長。 經(jīng)常有香客問我轧钓,道長序厉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任毕箍,我火速辦了婚禮弛房,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘而柑。我一直安慰自己文捶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布牺堰。 她就那樣靜靜地躺著拄轻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伟葫。 梳的紋絲不亂的頭發(fā)上恨搓,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音筏养,去河邊找鬼斧抱。 笑死,一個胖子當(dāng)著我的面吹牛渐溶,可吹牛的內(nèi)容都是我干的辉浦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼茎辐,長吁一口氣:“原來是場噩夢啊……” “哼宪郊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拖陆,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤弛槐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后依啰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乎串,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年速警,在試婚紗的時候發(fā)現(xiàn)自己被綠了叹誉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸯两。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖长豁,靈堂內(nèi)的尸體忽然破棺而出钧唐,到底是詐尸還是另有隱情,我是刑警寧澤蕉斜,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布逾柿,位于F島的核電站,受9級特大地震影響宅此,放射性物質(zhì)發(fā)生泄漏机错。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一父腕、第九天 我趴在偏房一處隱蔽的房頂上張望弱匪。 院中可真熱鬧,春花似錦璧亮、人聲如沸萧诫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帘饶。三九已至,卻和暖如春群扶,著一層夾襖步出監(jiān)牢的瞬間及刻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工竞阐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缴饭,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓骆莹,卻偏偏與公主長得像颗搂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子幕垦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348