XGBoost(Extreme Gradient Boosting)全名为极端梯度提升,是GBDT的改进,可以用于分类也可以用于回归问题。

下面讲述一下单个树结构、xgboost思路、xgboost原理推导、xgboost模型参数四个方面内容。

单个树结构:

对于每一棵回归树,其模型为:

xgboost理解
xgboost理解

其中w为叶子节点的得分值,q(x)表示样本x对应的叶子结点,T为该树的叶子结点个数。其中为了提高树的泛化能力,这时需要加入正则项,公式如下:

xgboost理解
xgboost理解

举一个简单例子如下图:

xgboost理解

xgboost思路:

首先明确下目标是,希望建立K个回归树,使得树群的预测值尽量接近真实值而且有较强的泛化能力。利用数学表达,其目标函数:

xgboost理解

其中i表示第i个样本,k表示第k棵树。公式前一部分,计算所有样本的预测误差(希望预测尽量接近真实值);后面一部分,表示树的复杂程度(希望能够提高泛化能力,防止过拟合)。

那么如何按照上面目标构建树群呢?首先构建第一棵树,其中节点分裂采用贪心策略(也就是在当前节点按照目标最优化决定,并不考虑下一节点,有点眼前利益最大化),而叶子结点上的值w我们采用对目标函数进行二次最优化(即二次泰勒展开)进行确定,具体推导在下面会详细讲解。树与树之间相互关联,详细一点就是下一棵树拟合上一棵树的残差。这样一颗一颗的构建形成一个树群。

该树群构建一般需要遵守下面几条人为设定:

l 当进行节点分裂时,假若该分裂带来的增益小于设定的阈值,我们就剪掉这个分裂(max_depth);

l 当一棵树深度达到我们设定的深度时,则该树停止构建;

l 当样本权重和小于设定阈值时,停止建树(min_child_weight)。

Xgboost原理推导:

xgboost理解
xgboost理解

接下来的问题是如何一个一个的构建CART树?

对于第t棵树,损失函数可以如下表示:

xgboost理解

其中n个样本,t棵树,由于构建第t棵树时,第t-1棵树已经构建完成,关于第t-1棵树的参数已经训练完成,是已知量,所以在损失函数推导式中出现常数c1。公式(2)可以等价转换为如下(这里c1表示为C或constant):

xgboost理解

接下来根据二阶凸优化进行泰勒展开近似求解,得到:

xgboost理解
xgboost理解
xgboost理解
xgboost理解
xgboost理解

XGBoost参数解释:

在运行XGBoost程序之前,必须设置三种类型的参数:通用类型参数(general parameters)、)、booster参数和学习任务参数(task parameters)。其中并不全面,后续如果了解在添加。

通用类型参数:

l booster[默认是gbtree]

选择每次迭代的模型,有两种选择:gbtree基于树的模型、gbliner线性模型

booster参数:

Booster参数-该参数的设置依赖于我们选择哪一种booster模型。

l eta[默认是0.3] 和GBM中的learning rate参数类似。通过减少每一步的权重,可以提高模型的鲁棒性。典型值0.01-0.2

l min_child_weight[默认是1] 决定最小叶子节点样本权重和(我理解的是最后一棵树的所有叶子节点权重和)。当它的值较大时,可以避免模型学习到局部的特殊样本。但如果这个值过高,会导致欠拟合。这个参数需要用cv来调整

l max_depth [默认是6] 树的最大深度,这个值也是用来避免过拟合的3-10

l max_leaf_nodes 树上最大的节点或叶子的数量,可以代替max_depth的作用,应为如果生成的是二叉树,一个深度为n的树最多生成2n个叶子,如果定义了这个参数max_depth会被忽略

l gamma[默认是0] 在节点分裂时,只有在分裂后损失函数的值下降量大于gamma,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。这个参数值越大,树的结构越简单,泛化能力越强,但如果过大可能欠拟合。

l lambda[默认是1] 权重的L2正则化项 ,也就是式子

xgboost理解
xgboost理解
xgboost理解

学习目标参数:

l objective[默认是reg:linear]

这个参数定义需要被最小化的损失函数。最常用的值有:binary:logistic二分类的逻辑回归,返回预测的概率非类别。multi:softmax使用softmax的多分类器,返回预测的类别。在这种情况下,你还要多设置一个参数:num_class类别数目。

l seed[默认是0]

随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数。

XGBoost优势

l 内置交叉验证CV

XGBoost允许在每一次迭代都进行一次交叉验证,从而在一次实验中直接得到最佳的迭代次数

l 模型继续训练

使用者能继续从上一次模型开始进一步的训练

XGBoost版本包含xgboost自身的库xgb和sklearn库中的xgb,调参方式有:1.自带的CV(xgboost自身的方法);2.GridSearch;3.Random Search。详细可参考博客:https://blog.csdn.net/RuDing/article/details/78328835

相关文章: