XGB算法梳理

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

目录

 

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

### XGBoost分类算法介绍 XGBoost(Extreme Gradient Boosting)是一种可扩展的、分布式的梯度提升库,由陈天奇等人开发。它在传统梯度提升算法的基础上进行了一系列优化,具有高效、灵活且可扩展的特点,在各类机器学习竞赛和实际应用中都取得了很好的效果。XGBoost不仅可以用于分类问题,还能处理回归和排序等任务。在分类问题中,它能够处理二分类和多分类问题,输出样本属于各个类别的概率。 ### 原理 XGBoost基于梯度提升框架,其核心思想是通过迭代训练一系列的弱分类器(通常是决策树),并将它们组合成一个强分类器。具体步骤如下: - **初始化**:首先初始化一个常量作为初始预测值,通常是所有样本标签的均值。 - **迭代训练**:在每一轮迭代中,XGBoost会训练一个新的决策树,该决策树的目标是拟合前一轮迭代模型的残差。残差是指样本的真实标签与前一轮模型预测值之间的差值。为了找到最优的决策树结构,XGBoost使用了一种贪心算法,通过枚举所有可能的分割点,选择能够最大程度降低目标函数的分割点。 - **目标函数**:XGBoost的目标函数由两部分组成,即损失函数和正则化项。损失函数用于衡量模型的预测值与真实标签之间的差异,常见的损失函数有对数损失函数(用于分类问题)和平方损失函数(用于回归问题)。正则化项用于控制模型的复杂度,防止过拟合,它包括树的叶子节点数量和叶子节点的权重的平方和。 - **模型融合**:每一轮训练得到的决策树会乘以一个学习率(也称为步长),然后累加到前一轮的模型中,得到当前轮的模型。学习率的作用是控制每一轮迭代的步长,避免模型过拟合。 ### 应用 - **金融领域**:用于信用风险评估,根据客户的个人信息、信用历史等特征,预测客户是否会违约;也可用于欺诈检测,识别异常的交易行为。 - **医疗领域**:疾病诊断,根据患者的症状、检查结果等数据,判断患者是否患有某种疾病;还可用于疾病预后预测,预测患者的治疗效果和生存情况。 - **电商领域**:商品推荐,根据用户的浏览历史、购买记录等信息,向用户推荐可能感兴趣的商品;用户流失预测,预测用户是否会流失,以便采取相应的营销策略。 ### 使用方法 以下是使用Python和Scikit - learn接口的XGBoost库进行分类任务的示例代码: ```python import xgboost as xgb from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据集 iris = load_iris() X = iris.data y = iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建XGBoost分类器 model = xgb.XGBClassifier(objective='multi:softmax', num_class=3, learning_rate=0.1, n_estimators=100, max_depth=3) # 训练模型 model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy}") ``` 在上述代码中,首先加载了鸢尾花数据集,并将其划分为训练集和测试集。然后创建了一个XGBoost分类器,设置了目标函数为`multi:softmax`用于多分类问题,指定类别数量为3。接着使用训练集对模型进行训练,最后使用测试集进行预测,并计算预测的准确率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值