官方有一个使用命令行做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
)
网友评论