基于XGBoost用Logloss做损失函数时的叶子节点权重和预测值问题-CSDN博客,好好梳理一遍XGBoost,争取通透。
XGBoost 原文:https://arxiv.org/pdf/1603.02754.pdf
一、XGBoost的原理
1、加法模型
是第i个样本在第K颗树中落到的叶子节点的权重,这在原文中说的比较楚:
那么就是第i个样本在前K颗树中落到的叶子节点的权重之和。
2、目标函数
学习的目标是要最小化目标函数。第一个公式右边的前半部分是损失函数,后半部分是正则项。正则项是叶子节点数量和权重的函数,可以防止过拟合。
损失函数里第一个参数已经明确是第i个样本在前K颗树中落到的叶子节点的权重之和,第二个参数是第i个样本的真实值。
这里就需要注意了,理解XGBoost其中的一个关键环节就在这:叶子节点的权重之和和样本的真实值是什么关系?在预测对象是连续型(回归问题)的时候,权重之和貌似可以直接看作是样本的预测值,但在预测对象是离散型(分类问题)的时候,是样本的真实值(0或1),权重之和是不可以直接作为样本的预测概率值的,需要转换。怎么转换呢,在外面加一个sigmod函数即可(扩展一下来说,遇到其他分布,用广义线性回归中的激活函数做转换,保证损失函数是n阶可导的,就可以用XGBoost。再退一步,不管怎么转换,只要损失函数是n阶可导的,就可以用XGBoost)。
以logloss为损失函数为例,将加sigmod函数后得到预测概率值,再代入到logloss(分类问题的损失函数)中,得到以为自变量的损失函数如下:
(详细推导参考XGBoost用Logloss做损失函数时的叶子节点权重和预测值问题-CSDN博客)
上式中是第i个样本的叶子节点的权重之和,是第i个样本的真实值(0或1)。
3、梯度提升
将加法模型代入到目标函数得到如下公式:
下面我们的目标是:在已知前t-1颗树的情况下,找出第t棵树的最优解,使得目标函数向最小的方向发展。
4、泰勒展开
一顿操作猛虎如(泰勒展开、去掉高阶项、合并正则项),目标函数结果如下:
其中:
gi、hi分别是在损失函数在处的1、2阶导数。
【
特别的,在logloss作为损失函数时:
是前t-1颗树的预测值(概率,权重之和加sigmod),可见gi和hi只与样本真实值和前面树的预测值有关。加sigmod函数后对其求导的结果依然是这么简洁,是不是很爽。
】
假设树固定,即叶子节点内的样本固定,则各叶子节点的Gj和Hj也就固定了,T也固定了,那么目标函数就是关于wj的一元二次函数。由于各个叶子节点的权重取值是独立的,所以每个叶子节点都可以独立找最优解。
第一个式子是第j个叶子节点的最优权重值,第二个式子是所有叶子节点整体的最小目标函数值。
那如果树不固定呢?逐个变量遍历分裂点,找到最好的。
5、增益分裂
分裂,就靠上面这个式子。Gain是分裂前的最小目标函数值,减去分裂后的最小目标函数值的差值(1、注意最小目标函数值前面的负号;2.外面多一个γ,是因为分裂多了一个叶子节点嘛。也能看出来他的正则化作用)。分裂的目标是要Gain越大越好。
然后就是遍历所有特征和特征值,找到增益最大的分裂。
总结起来说,XGB的大体运行流程就是:
(1)生成第一棵树时,初始化,并计算损失函数在的1、2阶导数:gi,hi;
(2)假设前面已经生成了t-1颗树,计算损失函数在处的1、2阶导数,用以更新gi,hi;
(3)在一棵树内,利用计算好的gi,hi,逐个特征、逐个分裂点进行二叉分裂,根据增益Gain以及停止条件判断是否停止分裂。
从(3)也可以判断,XGB是启发式地搜索局部最优解,而不是全局最优解。
二、XGBboost参数
在了解了XGBboost的运行原理后,再来看XGBboost参数,就更通透了。我把参数分了下面几个类别,毕竟分类容易理解和记忆嘛。
1、学习目标。objective(binary:logistic,reg:logistic,multi:softmax,reg:linear),损失函数(rmse,logloss,auc)
2、树。包括树的类型(gbtree和dart),树的数量、树的深度等
3、增益。包括Gain公式中的λ和γ。
4、学习率。这是机器学习模型常用的参数,用来控制参数向最小值方向前进的步长(过小效率太低;过大容易越过去,导致来回跳,所有有一些高级的动量法之类的)。计算完最优分裂后,叶子节点的权重要乘以学习率。
5、其他的如采样设置(随机采样)、样本均衡设置(以正负样本均衡为目的的随机采样)
6、min_child_weight,这个是用来限制单个叶子节点的权重和的,不能小于这个参数,否则就停止分裂,和正则的作用差不多。
三、LightGBM的优化
LightGBM在XGBoost的基础上,在分裂的阶段做了许多优化,节省了内存,减少了计算量,也对并行计算进行了一些优化。联邦学习框架FATE中的Secureboost就做了类似的优化。
网上关于LightGBM介绍的文章也较多,这里就不赘述了。