技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

技术分析:jiangnanboy/learning_to_rank

项目背景与痛点

jiangnanboy/learning_to_rank 项目主要利用 LightGBM 进行学习排序,涵盖了数据处理、模型训练、模型决策可视化、模型解释性以及预测等多方面。在现代互联网应用中,信息检索、推荐系统、广告排序等场景都需要对数据进行排序学习,而传统的排序方法已经无法满足这些场景下的性能和效果需求。因此,迫切需要高效且准确的排序学习模型来提高用户的体验和系统的效率。该项目的实现则很好地回应了这一需求,它通过使用 LightGBM 特性来加速模型训练过程,同时提升排序学习模型在实际应用中的准确性。

核心技术揭秘

该项目的核心技术栈是基于 Python 和 LightGBM 的实现,突显了其在处理大规模数据集时的高性能与效率。LightGBM 是一种高效的梯度提升框架,它通过可伸缩的前沿技术,能够处理超过十亿行数据,同时保持较高的模型精度。项目中涵盖的关键模块如下:

  • 数据处理:项目提供了数据预处理的脚本,通过数据清洗与特征工程优化输入数据,为后续建模打下了坚实基础。
  • 模型训练:采用 LightGBM 进行模型训练,通过特征选择与参数调优提升模型性能。
  • 模型可视:利用 LightGBM 的内置功能,将模型决策路径可视化,方便理解模型内部工作原理。
  • 模型解释性:提供 SHAP 值计算,从而让模型对于特征重要性的解释变得清晰直观。
  • 预测:在训练模型完毕后,项目实现模型的快速预测功能,支持实时查询与多场景应用。

下图描述了项目的技术框架主要流程:

graph TD A[原始数据] --> B[数据处理] B --> C{"模型训练"} C -->|"LightGBM" | D[特征选择] C -->|"Gradient Boosting" | E[参数调优] D --> F[模型可视] E --> F F --> G[模型解释性] G --> H[预测]

功能亮点与差异

jiangnanboy/learning_to_rank 的亮点在于它结合了数据处理、模型训练、可视化解释等模块,形成了一个完整的排序学习解决方案。在同类项目中,该项目的可解释性以及模型可视化的实现让模型调试变得更加高效便捷。同时,使用 LightGBM 来训练模型,使得整个过程在追求性能最大化的同时,拥有较高的鲁棒性和稳定性,适用于不同规模的数据集。

应用场景与落地建议

该项目非常适合作为检索系统、推荐引擎以及广告排序模块中的排序学习工具。在实际生产应用中,应当注意模型的样本偏差与特征覆盖范围,确保数据集能够有效代表业务目标的特征。另外,由于 LightGBM 模型的高效性,可以考虑部署在高并发场景下以确保服务的稳定性和快速响应能力。

综合评价

jiangnanboy/learning_to_rank 对于需要进行排序学习的应用场景,提供了一个高效且全面的解决方案。项目中的代码实践与算法实现能够帮助开发者快速了解和部署相似功能。然而,在某些深度定制需求下,可能需要进一步扩展项目的模型库与算法优化以满足特殊应用要求。尽管如此,该项目仍然是同类项目中一个非常有竞争力的选择,值得推荐用于学习与实践。

关于

GitHub 原始描述(英文)

利用lightgbm做(learning to rank)排序学习,包括数据处理、模型训练、模型决策可视化、模型可解释性以及预测等。Use LightGBM to learn ranking, including data processing, model training, model decision visualization, model interpretability and prediction, etc.

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
425
价值分
188
活跃状态
活跃

语言占比

Python

贡献者

README

利用lightgbm做learning to rank 排序,主要包括:

  • 数据预处理
  • 模型训练
  • 模型决策可视化
  • 预测
  • ndcg评估
  • 特征重要度
  • SHAP特征贡献度解释
  • 样本的叶结点输出

(要求安装lightgbm、graphviz、shap等)

一.data format (raw data -> (feats.txt, group.txt))

python lgb_ltr.py -process
1.raw_train.txt

0 qid:10002 1:0.007477 2:0.000000 … 45:0.000000 46:0.007042 #docid = GX008-86-4444840 inc = 1 prob = 0.086622

0 qid:10002 1:0.603738 2:0.000000 … 45:0.333333 46:1.000000 #docid = GX037-06-11625428 inc = 0.0031586555555558 prob = 0.0897452 …

2.feats.txt:

0 1:0.007477 2:0.000000 … 45:0.000000 46:0.007042

0 1:0.603738 2:0.000000 … 45:0.333333 46:1.000000 …

3.group.txt:

8

8

8

8

8

16

8

118

16

8

…

二.model train (feats.txt, group.txt) -> train -> model.mod

python lgb_ltr.py -train
train params = {
        'task': 'train',  # 执行的任务类型
        'boosting_type': 'gbrt',  # 基学习器
        'objective': 'lambdarank',  # 排序任务(目标函数)
        'metric': 'ndcg',  # 度量的指标(评估函数)
        'max_position': 10,  # @NDCG 位置优化
        'metric_freq': 1,  # 每隔多少次输出一次度量结果
        'train_metric': True,  # 训练时就输出度量结果
        'ndcg_at': [10],
        'max_bin': 255,  # 一个整数,表示最大的桶的数量。默认值为 255。lightgbm 会根据它来自动压缩内存。如max_bin=255 时,则lightgbm 将使用uint8 来表示特征的每一个值。
        'num_iterations': 200,  # 迭代次数,即生成的树的棵数
        'learning_rate': 0.01,  # 学习率
        'num_leaves': 31,  # 叶子数
        'max_depth':6,
        'tree_learner': 'serial',  # 用于并行学习,‘serial’: 单台机器的tree learner
        'min_data_in_leaf': 30,  # 一个叶子节点上包含的最少样本数量
        'verbose': 2  # 显示训练时的信息
    }
  • docs:7796
  • groups:380
  • consume time : 4 seconds
  • training’s ndcg@10: 0.940891
1.model.mod(model的格式在data/model/mode.mod)

训练时的输出:

  • [LightGBM] [Info] Total Bins 9171
  • [LightGBM] [Info] Number of data: 7796, number of used features: 40
  • [LightGBM] [Debug] Trained a tree with leaves = 31 and max_depth = 9
  • [1] training’s ndcg@10: 0.791427
  • [LightGBM] [Debug] Trained a tree with leaves = 31 and max_depth = 12
  • [2] training’s ndcg@10: 0.828608
  • [LightGBM] [Debug] Trained a tree with leaves = 31 and max_depth = 10
  • …
  • …
  • …
  • [198] training’s ndcg@10: 0.941018
  • [LightGBM] [Debug] Trained a tree with leaves = 31 and max_depth = 11
  • [199] training’s ndcg@10: 0.941038
  • [LightGBM] [Debug] Trained a tree with leaves = 31 and max_depth = 11
  • [200] training’s ndcg@10: 0.940891
  • consume time : 4 seconds

三.模型决策过程的可视化生成

可指定树的索引进行可视化生成,便于分析决策过程。

python lgb_ltr.py -plottree

image

四.predict 数据格式如feats.txt,当然可以在每行后面加一个标识(如文档编号,商品编码等)作为排序的输出,这里我直接从test.txt中得到feats与comment作为predict

python lgb_ltr.py -predict
1.predict results
  • [‘docid = GX252-32-5579630 inc = 1 prob = 0.190849’
  • ‘docid = GX108-43-5342284 inc = 0.188670948386237 prob = 0.103576’
  • ‘docid = GX039-85-6430259 inc = 1 prob = 0.300191’ …,
  • ‘docid = GX009-50-15026058 inc = 1 prob = 0.082903’
  • ‘docid = GX065-08-0661325 inc = 0.012907717401617 prob = 0.0312699’
  • ‘docid = GX012-13-5603768 inc = 1 prob = 0.0961297’]

五.validate ndcg 数据来自test.txt(data from test.txt)

python lgb_ltr.py -ndcg

all qids average ndcg: 0.761044123343

六.features 打印特征重要度(features importance)

python lgb_ltr.py -feature

模型中的特征是"Column_number",这里打印重要度时可以映射到真实的特征名,比如本测试用例是46个feature

1.features importance
  • feat0name : 228 : 0.038
  • feat1name : 22 : 0.0036666666666666666
  • feat2name : 27 : 0.0045
  • feat3name : 11 : 0.0018333333333333333
  • feat4name : 198 : 0.033
  • feat10name : 160 : 0.02666666666666667
  • …
  • …
  • …
  • feat37name : 188 : 0.03133333333333333
  • feat38name : 434 : 0.07233333333333333
  • feat39name : 286 : 0.04766666666666667
  • feat40name : 169 : 0.028166666666666666
  • feat41name : 348 : 0.058
  • feat43name : 304 : 0.050666666666666665
  • feat44name : 283 : 0.04716666666666667
  • feat45name : 220 : 0.03666666666666667

七.利用SHAP值解析模型中特征重要度

python lgb_ltr.py -shap

这里不同于六中特征重要度的计算,而是利用博弈论的方法–SHAP(SHapley Additive exPlanations)来解析模型。 利用SHAP可以进行特征总体分析、多维特征交叉分析以及单特征分析等。

1.总体分析

image

image

2.多维特征交叉分析

image

3.单特征分析

image

八.利用模型得到样本叶结点的one-hot表示,可以用于像gbdt+lr这种模型的训练

python lgb_ltr.py -leaf

这里测试用例是test/leaf.txt 5个样本

[

  • [ 0. 1. 0. …, 0. 0. 1.]
  • [ 1. 0. 0. …, 0. 0. 0.]
  • [ 0. 0. 1. …, 0. 0. 1.]
  • [ 0. 1. 0. …, 0. 1. 0.]
  • [ 0. 0. 0. …, 1. 0. 0.] ]

九.REFERENCES

https://github.com/microsoft/LightGBM

https://github.com/jma127/pyltr

https://github.com/slundberg/shap

contact

如有搜索、推荐、nlp以及大数据挖掘等问题或合作,可联系我:

1、我的github项目介绍:https://github.com/jiangnanboy

2、我的博客园技术博客:https://www.cnblogs.com/little-horse/

3、我的QQ号:2229029156

评论

暂无评论