XGBoost 是对梯度提升算法的改进:
我们在前面已经知道,构建最优模型的一般方法是 最小化训练数据的损失函数 。
预测值和真实值经过某个函数计算出损失,并求解所有样本的平均损失,并且使得损失最小。
上面的式子称为 经验风险最小化 ,如果仅仅追求经验风险最小化,那么训练得到的模型复杂度较高,很容易出现过拟合。因此,为了降低模型的复杂度,常采用下式:
上面的式子称为 结构风险最小化 ,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测 。
XGBoost的决策树生成是结构风险最小化的结果。
XGBoost(Extreme Gradient Boosting)是对梯度提升树的改进,并且在损失函数中加入了正则化项。
目标函数的第一项表示整个强学习器的损失,第二部分表示强学习器中 K 个弱学习器的复杂度。
xgboost 每一个弱学习器的复杂度主要从两个方面来考量:
上公式中,第一部分是从强学习器的角度去衡量,第二项也是衡量整个强学习器的复杂·程度。
我们直接对目标函数求解比较困难,通过泰勒展开将目标函数换一种近似的表示方式。接下来对 yi(t-1) 进行泰勒二阶展开,得到如下近似表示的公式:
其中,gi 和 hi的分别为损失函数的一阶导、二阶导:
我们观察目标函数,发现以下两项都是常数项,我们可以将其去掉。
为什么说是常数项呢?这是因为当前学习器之前的学习器都已经训练完了,可以直接通过样本得出结果。化简之后的结果为:
我们再将 Ω(f<sub>t</sub>) 展开,结果如下:
这个公式中只有 ft,该公式可以理解为,当前这棵树如何构建能够降低损失。
我们再次理解下这个公式表示的含义:
现在,我们发现公式的各个部分考虑的角度不同,有的从样本角度来看,例如:ft(xi) ,有的从叶子结点的角度来看,例如:T、||w||2。我们下面就要将其转换为相同角度的问题,这样方便进一步合并项、化简公式。我们统一将其转换为从叶子角度的问题:
例如:10 个样本,落在 D 结点 3 个样本,落在 E 结点 2 个样本,落在 F 结点 2 个样本,落在 G 结点 3 个样本
gi ft(xi) 表示样本的预测值,我们将其转换为如下形式:
λ||w||2 由于本身就是从叶子角度来看,我们将其转换一种表示形式:
我们重新梳理下整理后的公式,如下:
上面的公式太复杂了,我们令:
Gi 表示样本的一阶导之和,Hi 表示样本的二阶导之和,当确定损失函数时,就可以通过计算得到结果。 现在我们的公式变为:
1.6 对叶子结点求导 此时,公式可以看作是关于叶子结点 w 的一元二次函数,我们可以对 w 求导并令其等于 0,可得到 w 的最优值,将其代入到公式中,即可再次化简上面的公式。
将 w<sub>j</sub> 代入到公式中,即可得到:
1.7 XGBoost的回归树构建方法 该公式也叫做打分函数 (scoring function),它可以从树的损失函数、树的复杂度两个角度来衡量一棵树的优劣。 这个公式,我们怎么用呢? 当我们构建树时,可以用来选择树的最佳划分点。
其过程如下:
2. XGBoost API 2.1 通用参数 booster [缺省值=gbtree]
silent [缺省值=0]
nthread [缺省值=设置为最大可能的线程数]
> 下面的两个参数不需要设置,使用默认的就好了 num_pbuffer [xgboost自动设置,不需要用户设置]
num_feature [xgboost自动设置,不需要用户设置]
2.2 Booster 参数 2.2.1 Parameters for Tree Booster eta [缺省值=0.3,别名:learning_rate]
gamma [缺省值=0,别名: min_split_loss](分裂最小loss)
max_depth [缺省值=6]
min_child_weight [缺省值=1]
subsample [缺省值=1]
colsample_bytree [缺省值=1]
colsample_bylevel [缺省值=1]
alpha [缺省值=0,别名: reg_alpha]
scale_pos_weight[缺省值=1]
2.2.2 Parameters for Linear Booster > linear booster一般很少用到。 lambda [缺省值=0,别称: reg_lambda]
alpha [缺省值=0,别称: reg_alpha]
lambda_bias [缺省值=0,别称: reg_lambda_bias]
2.3 学习目标参数 objective [缺省值=reg:linear]
eval_metric [缺省值=通过目标函数选择] 验证集 可供选择的如下所示:
seed [缺省值=0]
3. 小结