【编程学习】关于XGBoost你需要了解的知识
【编程学习】关于XGBoost你需要了解的知识
6Young什么是XGBoost
首先,要了解GBDT
(梯度提升决策树)是一种基于boosting增强策略的加法模型,其核心思想是通过迭代的方式,每次训练一棵CART(分类与回归树)来拟合前t-1棵树预测结果与实际训练样本真实值之间的残差。在训练过程中,GBDT
采用前向分布算法进行贪婪学习,旨在逐步优化整体模型的预测能力。
接着,XGBoost
(极限梯度提升)在GBDT
的基础上进行了多项优化。例如,它对损失函数进行了二阶泰勒展开,使模型能够更准确地逼近最优解;在目标函数中加入了正则项,有助于防止过拟合;同时,XGBoost
支持并行处理,大大加快了训练速度;并且默认对缺失值进行了处理,提高了模型的鲁棒性。这些优化使得XGBoost
在可扩展性和训练速度上有了显著的提升,但其核心思想——通过迭代训练CART树来拟合残差——与GBDT
保持一致。
XGBoost如何实现并行?
boosting不是一种串行的结构吗?XGBoost
怎么可以实现并行的?
XGBoost
的并行不是tree粒度的并行,XGBoost
也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。
XGBoost
的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost
在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
GBDT和XGBoost的区别?
基分类器:传统的GBDT
采用CART
作为基分类器,XGBoost
支持多种类型的基分类器,比如线性分类器。
二阶导数:GBDT
在模型训练时只使用了代价函数的一阶导数信息,XGBoost
对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
正则项:在使用CART
作为基分类器时,XGBoost
显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
列采样:传统的GBDT
在每轮迭代时使用全部的数据,XGBoost
则采用了与随机森林相似的策略,支持对数据进行采样,支持列抽样,不仅能降低过拟合,还能减少计算,这也是XGBoost
异于传统GBDT
的一个特性。
缺失值处理:传统的GBDT
没有设计对缺失值进行处理,XGBoost
可以为缺失值或者特定值指定分支的默认方向,对特征值有缺失的样本可以自动学习出他的分裂方向。
并行化:XGBoost
支持并行,可以在特征粒度上并行,在训练前对特征进行分块排序,在寻找最佳分裂点的时候可以并行化计算,大大提升速度。
Shrinkage(缩减):相当于学习速率(XGBoost
中的 eta)。XGBoost
在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把 eta 设置得小一点,然后迭代次数设置得大一点(注意,传统GBDT
的实现也有学习速率)。
XGBoost防止过拟合的方法
XGBoost
在设计时,为了防止过拟合做了很多优化,具体如下:
- 目标函数添加正则项:叶子节点个数+叶子节点权重的L2正则化
- 列抽样:训练的时候只用一部分特征(不考虑剩余的block块即可)
- 子采样:每轮计算可以不使用全部样本,使算法更加保守
- shrinkage: 可以叫学习率或步长,为了给后面的训练留出更多的学习空间
XGBoost如何评价特征的重要性?
采用三种方法来评判XGBoost
模型中特征的重要程度。
weight :该特征在所有树中被用作分割样本的特征的总次数。
gain:该特征在其出现过的所有树中产生的平均增益。
cover :该特征在其出现过的所有树中的平均覆盖范围。
注意:覆盖范围这里指的是一个特征用作分割点后,其影响的样本数量,即有多少样本经过该特征分割到两个子节点。
XGBoost如何处理缺失值
当XGBoost
在特征k上寻找最佳分割点时,仅对特征值为非缺失的样本进行遍历。这种策略显著减少了为稀疏离散特征寻找分割点的时间开销,使得模型训练更加高效。
在逻辑实现上,XGBoost
为了保证完备性,会将特征值缺失的样本分别分配到左叶子结点和右叶子结点进行预测计算。对于每一种分配方式(即缺失值样本被分到左分支或右分支),都会计算其对应的分裂增益。然后,模型会选择导致分裂后增益最大的那个方向(左分支或是右分支)作为默认分支方向,用于预测时特征值缺失的样本。
此外,如果在模型训练过程中没有遇到缺失值,但在预测时出现了缺失值,XGBoost
会默认将缺失值的划分方向放到右子结点。这种处理方式确保了模型在预测时能够处理缺失值,并给出合理的预测结果。
XGBoost中的一棵树的停止生长条件
- 当新引入的一次分裂所带来的增益Gain<0时,放弃当前的分裂。这是训练损失和模型结构复杂度的博弈过程。
- 当树达到最大深度时,停止建树,因为树的深度太深容易出现过拟合,这里需要设置一个超参数max_depth。
- 当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值,也会放弃此次分裂。这涉及到一个超参数:最小样本权重和,是指如果一个叶子节点包含的样本数量太少也会放弃分裂,防止树分的太细。
RF和GBDT的区别
相同点:
- 都是由多棵树组成,最终的结果都是由多棵树一起决定。
不同点:
- 集成学习:RF属于bagging思想,而
GBDT
是boosting思想 - 偏差-方差权衡:RF不断的降低模型的方差,而
GBDT
不断的降低模型的偏差 - 训练样本:RF每次迭代的样本是从全部训练集中有放回抽样形成的,而
GBDT
每次使用全部样本 - 并行性:RF的树可以并行生成,而
GBDT
只能顺序生成(需要等上一棵树完全生成) - 最终结果:RF最终是多棵树进行多数表决(回归问题是取平均),而
GBDT
是加权融合 - 数据敏感性:RF对异常值不敏感,而
GBDT
对异常值比较敏感 - 泛化能力:RF不易过拟合,而
GBDT
容易过拟合 - 剪枝:
XGBoost
先从顶到底建立所有可以建立的子树,再从底到顶反向机芯剪枝,比起GBM,这样不容易陷入局部最优解
LR和GBDT的区别
- LR是线性模型,可解释性强,很容易并行化,但学习能力有限,需要大量的人工特征工程
GBDT
是非线性模型,具有天然的特征组合优势,特征表达能力强,但是树与树之间无法并行训练,而且树模型很容易过拟合;
当在高维稀疏特征的场景下,LR的效果一般会比GBDT
好。因为:带正则化的线性模型比较不容易对稀疏特征过拟合。
XGBoost有哪些参数
XGBoost模型有众多参数,针对参数调整,可以显著改善模型的表现。XGBoost的参数名称以及作用效果如下:
- eta:默认是0.3,别名是 leanring_rate,更新过程中用到的收缩步长,在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守;取值范围:[0,1]
- gamma:默认是0,别名是 min_split_loss,在节点分裂时,只有在分裂后损失函数的值下降了(达到gamma指定的阈值),才会分裂这个节点。gamma值越大,算法越保守(越不容易过拟合);取值范围:[0,∞]
- max_depth:默认是6,树的最大深度,值越大,越容易过拟合;[0,∞]
- min_child_weight:默认是1,决定最小叶子节点样本权重和,加权和低于这个值时,就不再分裂产生新的叶子节点。当它的值较大时,可以避免模型学习到局部的特殊样本。但如果这个值过高,会导致欠拟合。取值范围:[0,∞]
- max_delta_step:默认是0,这参数限制每颗树权重改变的最大步长。如果是 0 意味着没有约束。如果是正值那么这个算法会更保守,通常不需要设置。取值范围:[0,∞]
- subsample:默认是1,这个参数控制对于每棵树,随机采样的比例。减小这个参数的值算法会更加保守,避免过拟合。但是这个值设置的过小,它可能会导致欠拟合;取值范围:(0,1]
- colsample_bytree:默认是1,用来控制每颗树随机采样的列数的占比;取值范围:(0,1]
- colsample_bylevel:默认是1,用来控制的每一级的每一次分裂,对列数的采样的占比;值范围:(0,1]
- lambda:默认是1,别名是reg_lambda,L2 正则化项的权重系数,越大模型越保守;
- alpha:默认是0,别名是reg_alpha,L1 正则化项的权重系数,越大模型越保守;在数据维度很高的情况下,可以提高运行速度。
- scale_pos_weight:默认是1,在类别高度不平衡的情况下,将参数设置大于0,可以加快收敛。
- n_estimators:弱学习器的数量。