00 Index
01 GBDT和XGBoost的原理介绍 02 GBDT和XGBoost的异同点分析 03 什么风控建模场景下常用这两个明星算法? 04 GBDT的评估与调参思路 05 XGBoost的评估与调参思路 06 总结一下
我们都知道这两个算法都属于Boosting算法,所谓的Boosting算法就是从一个初始权重的基弱学习器进行模型训练,根据模型的学习误差来调整样本的权重,让下次模型迭代更加去关注那些被分类错误的样本,不断迭代更新模型知道得到一个强学习器。所以可以看出来Boosting它迭代的方式是串行的,并且下一个学习器依赖上一个学习器的训练结果。
GBDT,全称Gradient Boosting Decision Tree,也是属于Boosting集成算法,通过梯度下降来对新的学习器进行迭代,基学习器为CART
决策树,它的核心就在于每一次迭代的决策树都是在学习之前所有树结论和的残差,节点分裂的方式采用的是Gini系数。
我们都知道XGBoost是由陈天奇大佬和他的伙伴们一起提出来的一个基于GBDT优化的算法,在Paper中,作者是这样子定义XGBoost的:
a scalable machine learning system for tree boosting.
XGBoost全称是 Extreme Gradient Boosting,它的目标函数由训练损失(Training loss)和正则项(Regularization term)组成。其最大的优点就是可以实现特征选择的并行处理,正则使用L2的稀疏感知算法,同时引入有效的缓存结构,这样子对于训练效率有很大的提升。更多关于XGBoost的介绍,可以看一下之前的一篇文章《带你撸一遍 XGBoost论文》。
XGBoost严格意义上并不是一种单一算法,而是Gradient Boosting的一种极度高效的系统实现,也可以理解是基于GBDT的一次深度优化。所以GBDT算法有的特性,XGBoost也基本上有,比如:
说不同点,其实还倒不如说是XGBoost的“个人秀”。
基分类器
:GBDT的基分类器为CART
(Classification And Regression Trees),而XGBoost不仅支持CART,还支持线性分类器
;正则项
:XGBoost的目标函数里多了一项正则项
,这有利于防止过拟合,从而提高模型的泛化能力;损失函数
:传统GBDT只是对目标函数用到了一阶导数,而XGBoost则是引入二阶泰勒展开式进行求导。二阶展开式可以描述梯度变化方向是怎么变化的,能够让梯度收敛得更快;抽样
:XGBoost的优化主要就是加入了列抽样
以及缩减
,两者的作用就是防止 过拟合。列抽样(Column Subsampling
)就是每次基分类器modeling的时候并不是把所有的预选特征都用上,而是随机抽样一些特征;缩减(Shrinkage
)相当于学习率,对应XGBoost的参数eta,在每次迭代完后对该叶子节点乘以这个系数,主要就是为了削弱每棵树的影响,让后面的树有更多的表现机会(所以对应的一般会把树的深度适当调大);并行处理
:Boosting算法天然就是串行处理的,但是XGBoost说的并行处理并不是指的在Tree
颗粒度,而是在特征
颗粒度进行并行,提升处理效率。具体就是提前把数据排好序,并按照Block的形式存储,后续迭代过程中重复利用该结构,减少计算量,同时让并行成为可能,因为在进行节点分裂的时候,需要计算每个特征的增益的,而这一步就可以并行计算了。这一小节其实是想着来梳理下风控建模中各个环节有哪些模型,顺便看看这GBDT和XGBoost哪儿能用,简单点分类就按贷前、贷中、贷后来,我根据自己过往的经验,按照出场率
来评个分,从S级-A级-B级-C级-D级-E级-F级
逐级打分,打分结果比较偏主观臆断,大家大概有个感觉就好了嘻嘻。
预授信模型
:A级出场率,对客户的信用水平做一次粗排序,因为改环节可以获得的客户信息较少。A卡(申请评分卡)
:S级出场率。申请反欺诈
:B级出场率,样本标签稀缺为主要难点,XGBoost可以解决一部分样本失衡问题,但更多地会用一些异常值检测算法、无监督学习算法。客户意愿度模型
:A级出场率。客户价值模型
:B级出场率,主要会偏策略,对客户进行分级。B卡(行为评分卡)
:S级出场率。交易反欺诈
:A级出场率,主要是支付风控,防止客户进行薅羊毛、套现等行为。客户流失
:A级出场率。催收告警
:A级出场率。迁徙率预测
:B级出场率。失联修复
:C级出场率。还款率预测
:B级出场率。在开始讲调参思路前,我们先移步看看有哪些参数:
🚪传说门:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier
建议大家先浏览一下上面的链接,对GBDT有哪些超参数,超参的取值范围以及这些超参的作用等等。
在风控模型中我们经常也是用来做分类(Classification),但我们知道GBDT的基分类器是CART,即Classification And Regression Tree,所以也可以支持回归建模,不过今天主要是基于分类来展开的,GBDT的超参主要可以分成两种类型:
learning_rate
:学习率,值域范围为[0,∞],默认是0.1,常用的取值范围是[0.02,0.2],这个值越小越能够降低每棵树的贡献,学习率决定了新的迭代树去纠正错误的程度,所以如果模型过拟合应该降低学习率。n_estimators
:弱学习器的最大迭代次数,默认100,值越大越容易过拟合,经过与learning_rate一起搭配来调参,比如降低学习率,增加弱学习器的迭代次数来使得模型更加稳健。subsample
:采样,值域范围为[0,1],默认是1,如果值小于1,则会抽样一部分样本去做决策树,可以有效防止过拟合。criterion
:评价指标,‘friedman_mse’, ‘squared_error’, ‘mse’, default=’friedman_mse’。min_samples_split
:最小的节点分裂样本数量。默认2,值域范围为[2,∞],这个值一般选择在总样本量的0.5%-1%之间,比如1w样本,这个值填50-100。min_samples_leaf
:叶子节点最少的样本数。默认1,值域范围为[1,∞]。这个参数和min_samples_split
还挺像的,作用也是类似,关于它们的区别,可以看下面的栗子:如果设置 min_sample_split = 6,当前节点有4个样本,那么不会发生拆分(不管熵是多少)。 另一方面,如果设置 min_sample_leaf = 3,当前一个含有5个样本的节点,可以分别分裂成2个和3个大小的叶子节点,但分裂也不会发生,因为最小的叶子大小为3,而其中1个节点是2。
max_depth
:树深度。默认3,值域范围为[1,∞]。这个很常见了,树越深(max_depth越大),模型则更容易学习到更多信息。max_leaf_nodes
:最大叶子节点数,默认None,值域范围为[2,∞],可以防止模型过拟合。max_features
:节点分裂时考虑的最大特征数。{‘auto’, ‘sqrt’, ‘log2’}, int or float, default=None。如果不填的话,默认就是用所有的特征。而关于风控模型怎么调优,我会在下一节一起讲。
在开始讲调参思路前,我们还是先移步看看有哪些参数:
🚪传说门:https://xgboost.readthedocs.io/en/latest/parameter.html
建议大家先浏览一下上面的链接,对XGBoost有哪些超参数,超参的取值范围以及这些超参的作用等等,看完了我们可以大概知道参数可以分成这几类:
一般对于风控模型来说这一类的参数都不需要额外调整,选择默认的即可。比如booster
参数,默认就是gbtree
,即基于决策树的模型。verbosity
参数默认1,它的选项有0 (silent), 1 (warning), 2 (info), 3 (debug),为了理解模型输出,选择1可以尽可能展示更多的信息。
这类参数就是平时我们经常说到的超参。比如:
eta
:又叫learning_rate,值域范围为[0,1],默认是0.3,常用的取值范围是[0.01,0.2],用于控制shrinkage的大小。gamma
:值域范围为[0,∞],默认是0,这个值决定了节点分裂的阈值,这个值越大,决策树就越难分裂,算法会越保守。max_depth
:值域范围为[0,∞],默认是6,很常见的超参,就不做过多解释了。min_child_weight
:值域范围为[0,∞],默认是1。调大这个值意味着在构建树的过程中会放弃掉一些小权重的分支(避免学习到局部特征),可以有效的防止模型过拟合。max_delta_step
:值域范围为[0,∞],默认是0,这个值一般情况下不会使用,但在样本失衡的时候可以尝试使用,对LR有奇效。subsample
:随机采样,值域范围为[0,1],默认是1。我们可以通过调小这个值来避免过拟合,常用的取值范围是[0.5,1]。lambda
:L2正则化项,默认1,调大这个值会让模型更保守。alpha
:L1正则化项,默认0,调大这个值会让模型更保守。scale_pos_weight
:默认1,通常不会用,但在样本失衡的时候,可以调大参数(正样本偏少的时候),可以平衡正负样本。这类参数主要是用来控制优化目标的。比如 objective
,默认是reg:squarederror
,也支持很多回归、二分类等目标设置,详情见上面提及的文档,还有一个参数eval_metric
,评估指标设置,也是十分常用的,有很多指标可以选择,比如auc、error、mae、rmse
等等,在风控模型中我们经常就是做评分卡,所以auc
相对来说是最为常用的。
关于风控模型的调优,先前有篇文章讲得比较细致《风控ML[7] | 风控模型调优的思路有哪些》,大家可以移步去回顾一下。其实说白了,数据决定了天花板,而模型参数调优只是为了无限接近这个天花板,而且更多的会采用一些优化方法(轮子)来进行,比如基于贝叶斯优化的超参数优化 Bayesian Optimization
、基于随机搜索的超参数优化 Random Search
等等。
但我觉得偶尔手工调调参数,也挺好的,加深你对模型的理解,可以基于模型在不同数据集(训练、测试、跨时间验证)上的表现(KS值、AUC值等),来判断模型是欠拟合还是过拟合,然后调调参数,看着模型效果越来越好也是一种不错的感觉。如果模型效果一直还是不行,就得考虑从头再来,我指的是从样本选取、数据预处理、特征工程那一块开始再来哦。
最后,我们都知道XGBoost可以处理失衡样本,具体我们通过哪个参数来调模型呢?这里我们要区分你更关注什么。
scale_pos_weight
参数调大(正样本偏少的时候),这个参数是为了平衡正负样本。max_delta_step
来帮助模型收敛。作为集成模型的明星模型,我们还是很有必要了解它们的,知道怎么去调优。不过我也相信也有很多同学和我一样,调参的过程只是象征性的调调,更多的功夫会关注在问题定义以及特征工程上,把调优交给“轮子”去自动执行,空出时间来想想业务,怎么从业务中可以提取到更多有用的特征,方为正道啊。至于一开始说的要了解参数,到底是什么时候用?我想你应该是懂的~😁
[1] 万字长文总结机器学习的模型评估与调参,附代码下载 https://mp.weixin.qq.com/s?__biz=MzIzOTA0NDEwNA==&mid=2649610729&idx=1&sn=ee7fe27d509df4fada356ee2cd0b6c17&chksm=f1296a8ec65ee398d6f8baad533f9193fa9fe4d1913e98b4eb48db61131c25a327bf4b97a72e&scene=21#wechat_redirect [2] 推荐收藏 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结 https://mp.weixin.qq.com/s?__biz=MzIzOTA0NDEwNA==&mid=2649610691&idx=1&sn=cb086414137170b210a1374c9dcb323c&chksm=f1296aa4c65ee3b2ecc25b91e338370f51ce5a702d7d25f423e84c49737d9b03b70c7e669881&scene=21#wechat_redirect [3] 带你撸一遍 XGBoost论文 https://mp.weixin.qq.com/s?__biz=MzIzOTA0NDEwNA==&mid=2649609899&idx=1&sn=ae850f8a9627439ef6a711d504686f1d&chksm=f12965ccc65eecda4ffb272d286e310d7ed12d549515be9dee0c4caf617b149dba405c9341a9&token=1503733554&lang=zh_CN#rd [4] 10道XGBoost面试题送给你 https://mp.weixin.qq.com/s?__biz=MzIzOTA0NDEwNA==&mid=2649610673&idx=1&sn=316349e3eba5ea11c0a0cc2cc38a0413&chksm=f1296ad6c65ee3c01bd2b016cedca2e10045aabec178db7c6983fbc5dbfd50f70e5c05737c57&token=1503733554&lang=zh_CN#rd [5] 又有10道XGBoost面试题送给你 https://mp.weixin.qq.com/s?__biz=MzIzOTA0NDEwNA==&mid=2649610674&idx=1&sn=812f8480dad4a1abedb83c2a784bc989&chksm=f1296ad5c65ee3c323427db3c715f8c85cb520b3f1fbb569359e4a60eb1dda51eec86206a67a&token=1503733554&lang=zh_CN#rd [6] 模型融合---GBDT调参总结 https://www.cnblogs.com/nxf-rabbit75/p/10593524.html [7] sklearn API 参数解析 —— GBDT https://www.jianshu.com/p/5f17bc83e72a