使用lightgbm做learning to rank

官方有一个使用命令行做LTR的example,实在是不方便在系统内集成使用,于是探索了下如何使用lightgbm的python API调用lambdarank算法. 而且这种方法不需要提前将数据格式转化为libsvm格式!可以直接利用DataFame格式

import lightgbm as lgb
# 生成group list  官方文档有介绍 
#比如[10 20 30]表示data里面前10个样本属于一个group,其后20个属于一个group,最后30个属于一个group

n_size = 20  #每一个query对应的doc数量 我的每一个group具有相同的doc数量
dgroup_train= np.array([n_size for i in range(5)]).flatten() #[20 20 20 20 20]
dgroup_valid= np.array([n_size for i in range(5)]).flatten() #[20 20 20 20 20]
lgb_train = lgb.Dataset(dtrain, dtrain_y, group = dgroup_train,free_raw_data=False)
lgb_valid = lgb.Dataset(dvalid, dvalid_y, group = dgroup_valid, free_raw_data=False)


lgb_train.set_group(dgroup_train)
lgb_valid.set_group(dgroup_valid)
params =  {
    'objective' : 'lambdarank',
    'boosting_type' : 'gbdt',
    'num_trees' : 30,
    'num_leaves' : 128,
    'feature_fraction' : 0.2,
    'bagging_fraction' : 0.2,
    'max_bin' : 256,
    'learning_rate' : 0.1,
    'metric':'ndcg'
}

gbm = lgb.train(params,
            lgb_train,
            num_boost_round=1500,
            valid_sets=[lgb_train, lgb_valid],
            early_stopping_rounds=150  
)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容