如何使用LightGBM提高学习排序项目中的NDCG分数?
目前我在做一个学校项目,需要实现一个按查询对文档进行排序的学习排序功能,我已经用以下参数训练了我的模型:
objective="lambdarank",metric="ndcg",
用于LGBMRanker。
最初我的NDCG分数相当高,但当我用老师提供的正确验证集对预测排序进行测试时,NDCG分数显著下降(从0.78降到0.5)。我调整了参数以减少过拟合,并且还进行了F分数测试、互信息测试以及使用sklearn的随机森林重要性来选择特征。然而,我的NDCG分数仍然很低,我发现很难在不过拟合的情况下预测正确的NDCG,并且也难以提高模型的准确性。目前我使用的参数是:
objective="rank_xendcg",metric="ndcg",max_bin = 63,learning_rate = 0.03,num_iterations = 100,num_leaves = 31,path_smooth = 50,lambda_l1 = 10,min_gain_to_split = 10
回答:
显然,你的模型已经过拟合了。你没有告诉我们你是如何最初评估你的模型并达到0.78的NDCG分数的,但我希望你已经按照正确的方式做了所有事情。
你没有分享很多关于你的数据的信息。例如,你有足够的样本吗?你有多少个特征?也许你的特征比样本多,这就是你尝试进行特征选择的原因。你也可以检查一下你的验证集(老师提供的)和你的训练集有什么不同。还可以检查一下如果将这个验证集作为训练集的一部分,通过交叉验证来训练模型会发生什么。我会检查各折的性能以及这些性能的方差。如果它们变化很大,那么问题可能出在数据上。
尽管如此,我建议你不要在单一验证集上手动进行超参数调优。主要原因是你会简单地在该验证集上过拟合,当测试集到来时,你的性能不会如你所预期的那样。因此,你可以在仔细设置你的超参数空间后,使用交叉验证的随机搜索。sklearn
有一个非常好用且易于使用的实现。你可以查看其他技术,如sklearn
实现的Halving Randomised Search。
即使你正确地进行了超参数调优,性能提升也不会像你希望的那样高。超参数调优通常会使你的性能提高1-5%。因此,我建议你检查你的特征。也许你可以从当前的特征空间中生成新的特征,或创建交叉特征,丢弃共线特征等。