XGB算法梳理

本文深入解析XGBoost算法,涵盖CART树原理、损失函数、分裂节点算法、正则化及对缺失值处理等核心内容,并探讨XGBoost的优化策略与参数设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

1.CART树

2.算法原理

3.损失函数

4.分裂节点算法

5.正则化

6.对缺失值的处理

7.xgb的其他优化

8.xgb参数

9.xgb常问面试问题


1.CART树

CART树(分类与回归树),可以用于分类也可以用于回归。其内部节点特征的取值为“是”和“否”,节点的左分支取值为“是”,节点de的右分支取值为“否”。对于回归树使用平均误差最小化准则,对于分类树使用ji基尼指数最小化准则。

2.算法原理

xgb就是Tree Ensemble。xgb就是K棵树的累加。

在这里 插入泰勒公式

在这里,可以想成在原来损失函数的基础上添加使损失函数更小。

讲完了训练过程,需要讲一下正则项

另外xgb可以评估每个树的得分

因为可以评估每棵树的得分,所以可以枚举出所有的树,然后计算每棵树的得分,然后保留得分最高的树,但是实际中这样的操作是不现实的,所以xgb尝试优化树的每层。计算将该节点分裂的得分,然后将该节点分裂之后的得分与没有将该节点分裂的得分做差,从而来判断是否分裂该节点。

3.损失函数

3.1logistic损失函数

3.2对数损失函数

3.3平方误差损失函数

4.分裂节点算法

前面提到过,XGBoost每一步选能使分裂后增益最大的分裂点进行分裂。而分裂点的选取之前是枚举所有分割点,这称为精确的贪心法(Exact Greedy Algorithm).当数据量十分庞大,以致于不能全部放入内存时,Exact Greedy 算法就会很慢。因此XGBoost引入了近似的算法。即对每一个特征进行「值」采样。原来需要对每一个特征的每一个可能分割点进行尝试,采样之后只针对采样的点(分位数)进行分割尝试,这种方法很明显可以减少计算量,采样密度越小计算的越快,拟合程度也会越差,所以采样还可以防止过拟合。

 

那么,现在有两个问题:

1.如何选取候选切分点Sk={sk1,sk2,⋯skl}呢?(即选择特征的哪些分位数作为备选的分裂点呢?)
2.什么时候进行候选切分点的选取?
针对问题2:
第二个方法执行采样的方式有两个,一种是global模式,一种是local模式。global模式是执行树生成之前采一次样,后面不再更新( 学习每棵树前, 提出候选切分点);local模式是每次split之后都再次进行一次采样(每次分裂前, 重新提出候选切分点)。不同的模式和不同的采样密度带来的效果如下图:

桶的个数等于 1 / eps, 可以看出:
全局切分点的个数够多的时候,和Exact greedy算法性能相当。
局部切分点个数不需要那么多,因为每一次分裂都重新进行了选择。

下面对第一个问题进行解答,选择哪些候选切分点。
对于问题1,可以采用分位数,也可以直接构造梯度统计的近似直方图等。
简单的分位数就是先把数值进行排序,然后根据你采用的几分位数把数据分为几份即可。而XGBoost不单单是采用简单的分位数的方法,而是对分位数进行加权(使用二阶梯度h),称为:Weighted Quantile Sketch。PS:上面的那个例子采用的是没有使用二阶导加权的分位数。

5.正则化

前面的算法原理已经讲了正则化,但是xgb中的其他ca操作也会fa防止过拟合

另外分裂节点算法的算法2分裂-分裂节点的近似算法也会防止过拟合。

6.对缺失值的处理

有很多种原因可能导致特征的稀疏(缺失),所以当遇到样本某个维度的特征缺失的时候,就不能知道这个样本会落在左孩子还是右孩子。xgboost处理缺失值的方法和其他树模型不同。根据作者TianqiChen在论文[1]中章节3.4的介绍,xgboost把缺失值当做稀疏矩阵来对待,本身在节点分裂时不考虑缺失值的数值,但确定分裂的特征后,缺失值数据会被分到左子树和右子树呢?本文的处理策略是落在哪个孩子得分高,就放到哪里。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。具体的介绍可以参考:

7.xgb的其他优化

8.xgb参数

9.xgb常问面试问题

https://blog.youkuaiyun.com/weixin_43178406/article/details/86706979

参考资料

https://blog.youkuaiyun.com/weixin_43178406/article/details/86706979

https://xgboost.readthedocs.io/en/latest/tutorials/model.html

陈天奇论文与ppt

https://www.cnblogs.com/wxquare/p/5541414.html

https://www.cnblogs.com/wkslearner/p/8672334.html

https://x-algo.cn/index.php/2016/07/24/xgboost-principle/

https://www.hrwhisper.me/machine-learning-xgboost/

https://blog.youkuaiyun.com/a819825294/article/details/51206410

https://www.zhihu.com/question/41354392

http://www.mamicode.com/info-detail-2391137.html

<think>好的,我现在要帮用户解决关于XGBoost与RankNet结合模型的问题。首先,用户明确提到想了解如何实现和应用这个模型,所以我需要先理清楚XGBoost和RankNet各自的特点,以及它们如何结合。 首先,回忆一下XGBoost的基本知识。XGBoost是一个梯度提升框架,通常用于分类和回归任务,但根据引用[1]和[2],它也支持排序任务,特别是通过设置objective为"rank:pairwise",使用LambdaRank方法,虽然文档提到还在开发中。而RankNet是微软提出的一种基于概率的排序学习算法,它通过比较文档对的顺序来优化模型。用户的问题是如何将这两者结合起来。 接下来,我需要确认XGBoost是否原生支持RankNet。根据引用[4],XGBoost使用的是LambdaMART,结合了LambdaRank和MART(也就是梯度提升树)。而RankNet是另一种方法,所以可能需要自定义目标函数和梯度计算。因此,用户可能需要自己实现RankNet的损失函数,并将其集成到XGBoost中。 然后,我需要考虑实现步骤。XGBoost允许自定义目标函数,这需要定义损失函数的一阶和二阶梯度。RankNet的损失函数基于文档对的概率比较,所以需要计算每个文档对的梯度。同时,数据需要按组组织,因为排序任务通常是在组内进行的,比如每个查询对应的文档组。 接下来,应用场景方面,引用[3]提到XGBoost处理高维数据的能力,而引用[4]指出排序学习在信息检索和推荐系统中的应用。所以,结合后的模型可能适用于搜索排序、推荐系统等需要个性化排序的场景。 另外,需要注意的问题包括数据预处理,比如成对样本的构造,以及计算效率,因为成对比较可能导致数据量增大。此外,评估指标如NDCG或MAP的使用也很重要,需要确保在训练过程中优化这些指标。 最后,需要验证是否有现有资源或库已经实现了这种结合,或者是否需要用户自己编写代码。根据引用[2]和[4],XGBoost本身支持的是pairwise排序,而LambdaMART可能更接近RankNet的思想,但用户明确提到RankNet,可能需要更底层的实现。 总结来说,回答应该包括:XGBoost与RankNet的结合方式,如何自定义目标函数,数据准备的注意事项,应用场景,以及可能的挑战和解决方案。同时,引用相关文献支持这些步骤,确保回答的准确性。</think>### XGBoost与RankNet结合的模型实现与应用解析 #### 一、核心概念梳理 1. **XGBoost的排序能力** XGBoost原生支持排序任务,主要通过`objective="rank:pairwise"`参数实现,其底层基于**LambdaRank**算法优化排序指标(如NDCG、MAP)。引用[2]明确指出,XGBoost通过成对比较(pairwise)的方式学习排序模型,但未直接实现RankNet的损失函数。 2. **RankNet的核心思想** RankNet是微软提出的一种基于概率的排序学习算法,其目标是最小化文档对顺序预测的交叉熵损失。核心公式为: $$P_{ij} = \frac{1}{1 + e^{-\sigma (s_i - s_j)}}$$ 其中$s_i, s_j$为模型对文档$i,j$的预测得分,$\sigma$为缩放参数。损失函数定义为实际标签与预测概率的交叉熵。 #### 二、XGBoost与RankNet结合实现步骤 ##### 1. 自定义目标函数 需实现RankNet的损失函数及其梯度计算: ```python def ranknet_loss(preds, dmatrix): # 获取组信息 groups = dmatrix.get_uint_info("group_ptr") # 计算梯度hessian grad = np.zeros(len(preds)) hess = np.zeros(len(preds)) for i in range(len(groups)-1): group_start = groups[i] group_end = groups[i+1] for j in range(group_start, group_end): for k in range(j+1, group_end): s_j = preds[j] s_k = preds[k] delta = s_j - s_k lambda_grad = sigma * (0.5 * (1 - Sjk) - 1 / (1 + np.exp(sigma * delta))) grad[j] += lambda_grad grad[k] -= lambda_grad hess_jk = sigma**2 * np.exp(sigma * delta) / (1 + np.exp(sigma * delta))**2 hess[j] += hess_jk hess[k] += hess_jk return grad, hess ``` *注:需通过`xgb_model.set_param({'objective': ranknet_loss})`注入自定义函数* [^4] ##### 2. 数据准备规范 - **输入格式**:需构造`qid`分组标识符(如用户搜索会话ID) - **特征工程**:需同时包含**文档特征**(如文本相关性)和**上下文特征**(如用户画像) - **标签定义**:使用离散的排序等级(如0-4级相关性标签) ##### 3. 模型训练配置 ```python params = { 'objective': 'rank:pairwise', # 或自定义目标函数 'eta': 0.05, 'gamma': 1.0, 'min_child_weight': 0.1, 'eval_metric': 'ndcg@5' # 直接优化排序指标 } xgb.train(params, dtrain, num_boost_round=100, evals=watchlist) ``` #### 三、典型应用场景 1. **搜索引擎结果排序** 根据用户查询动态调整文档排序,综合文本相关性与时效性特征[^1] 2. **电商推荐系统** 对商品列表进行个性化排序,平衡点击率、转化率与多样性指标 $$Score = w_1 \cdot CTR + w_2 \cdot CVR + w_3 \cdot Diversity$$ 3. **金融风控评分** 对信贷申请者进行风险等级排序,如: $$RiskRank = f(征信分, 收入稳定性, 历史违约率)$$ #### 四、关键挑战与解决方案 1. **计算效率问题** - **问题**:成对比较导致时间复杂度为$O(n^2)$ - **优化**:采用负采样策略,或改用LambdaRank近似优化[^4] 2. **非可导指标优化** - **问题**:NDCG等指标不可直接求导 - **方案**:通过Delta-NDCG构造平滑代理损失函数 3. **数据稀疏性处理** - **技巧**:对长尾query使用特征分桶(如将点击率离散化为10个区间) #### 五、效果评估方法 | 评估指标 | 计算公式 | 适用场景 | |---------|---------|---------| | NDCG@k | $$\frac{DCG@k}{IDCG@k}$$ | 多级相关性标签 | | MAP | $$\frac{1}{Q} \sum_{q=1}^{Q} \frac{1}{m_q} \sum_{k=1}^{m_q} Precision@k$$ | 二值相关性标签 | | MRR | $$\frac{1}{|Q|} \sum_{i=1}^{|Q|} \frac{1}{rank_i}$$ | 首条结果重要性高 | #### 六、扩展优化方向 1. **与深度学习结合** 使用XGBoost生成叶子节点路径作为深度神经网络的输入特征(Wide & Deep模式) 2. **动态特征更新** 在推荐系统中实现实时排序更新: ```mermaid graph LR A[用户行为日志] --> B(流式计算引擎) B --> C{XGBoost模型} C --> D[在线排序服务] ``` 3. **不确定性建模** 引入贝叶斯框架估计排序得分的置信区间: $$Score \sim \mathcal{N}(\mu_{\text{xgb}}, \sigma_{\text{uncertainty}})$$
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值