训练:
根据OBJ(Gain,根据每个叶子结点损失函数的一阶二阶导数计算)损失函数,使用贪心算法,从很多种结构的树中选出最优的树作为当前迭代层的树,一层一层选出每一层的最优树,相加。主要工作有两个:1.确定每层树的最优结构 2.确定每层树的最优叶子节点的分值。
预测:
将样本 i 放到树 j 中,找到样本 i 在树 j 中被分到的叶子节点的预测值score(根据每个叶子结点损失函数的一阶二阶导数计算),将样本 i 在所有树中对应的叶子结点的预测值相加求和即为样本 i 的预测值。
训练过程:
确定每层树的最优叶子节点的分值 -------------------------------------------------------------------------------------------
逻辑上应该是第二步,但是理论上作为第一步比较好。
目标函数:
obj = L(处理欠拟合) + 正则(处理过拟合),GBDT的目标函数没有正则项,XGBoost更加能处理过拟合的情况。
这里的l(yi,yi(t))损失函数具体是什么样的形式不固定,但是必须要求该函数二阶可导。一般情况下,回归损失函数一般是均方差(即最小二乘损失函数)。分类损失函数一般是逻辑损失函数(即交叉熵)。
其中,预测值更新过程如下:
该式子中的w为一个向量,元素为第t个决策树的所有叶子结点的预测值。q(x)表示第几个叶子结点。所以该式子表示样本 i 在决策树 t 中被分到的叶子节点 j 的节点预测值。
正则项:
T 表示当前这棵决策树的叶子节点数量,如果叶子结点数量太多,太复杂,拟合过量样本,可能会把噪声样本也拟合到。
w表示样本i在当前这可决策树中被分到的叶子结点预测值,因为预测过程是把样本i在所有决策树中被分到的叶子结点预测值(w值)相加求和作为该样本的最终预测值,如果所有w值都是较大的,全部加起来会出现一个较大的偏差,所以这里做一个L2的正则。
XGBoost公式推导
? 第t次迭代后,模型的预测等于前t-1次的模型加上第t课树的预测:
,即前t-1次的w值之和+第t课树的w值(样本i被分到的叶子结点预测值)
? 目标函数可以写成:
GBDT损失函数求最小值是根据梯度值,梯度下降,即求一阶偏导数,而这里对上面的目标函数直接求梯度值不太好求,主要是后面加的正则项影响求导,前面正则的求和部分消不掉。所以使用二阶泰勒展开:
? 将误差函数中的 成一个整体,求解这个整体取值在 处进行二阶泰勒展开:
这里 x为 , x0为 ,f(x)为l(yi,yi(t-1)+ft(xi)),在ft(xi)=0处二阶展开
,
注意,上面损失函数的自变量是ft(),后面的正则项由叶子节点数量和叶子结点预测值求出,在每次迭代中已知;前面的l(yi,yi(t-1))是上一次迭代真实值和预测值的损失,也是已知的。所以这两个都是常数,不会影响目函数的变化。
? 将函数中的所有常数项全部去掉,可以得到以下公式:
? 将函数 f 和正则项带入公式中得到以下公式:(ft(xi)表示样本 i 在决策树 t 中被分到的叶子节点 j 的节点预测值。)
wq(xi)表示样本 i 在决策树 t 中被分到的叶子节点 j 的节点预测值;大T 表示当前这棵决策树的叶子节点数量,wj 表示样本i在决策树j中被分到的叶子结点预测值,j表示第j棵决策树,小T表示小T棵决策树,i表示第i个样本,n表示样本总量。
? 定义每个决策树样本i所在的叶子节点 j 上的样本集合为: Ij
? 将样本累加操作转换为叶节点的操作
? 最终的目标函数:
? 如果树的结构确定(q函数确定),为了使目标函数最小,可以令导数为0,可以求得最优的w,将w带入目标函数,可以得到最终的损失为: (上式自变量为w,对w求导并且令之等于0即得到下面左式,此时的模型是最优的,将此时的w代入到损失函数公式中,即得到下面右式。下面的H,G都是上一次迭代的叶子结点损失的一阶二阶导,和当前模型没有关系,T代表当前模型的构建即叶子结点数量,这样在当前决策树构建的时候就不需要考虑它的w为多少,只要考虑每一次构建能使得损失函数最小即可,每一次构建都是选损失函数最小的)
以上所有的推导都是为了求最优的w和loss,这就像于公式,无论什么样的树结构,都能使用这两个公式求出当前树结构的情况下,树的最优叶子结点预测值和相应的最小损失值。
,
具体过程如下图:
上图右边I中的数字表示某个样本。g和h都是上一次迭代的误差的一阶导数和二阶导数,在当前这棵树构建的时候已经是存在已知的。
确定每层树的最优结构 -------------------------------------------------------------------------------------------------------------
? 当树的结构确定的时候,我们可以得到最优的叶子点分数以及对应的最小损失值,问题在于如何确定树结构?
? 暴力穷举所有可能的结构,选择损失值最小的;(很难求解)
? 贪心法,每次尝试选择一个分裂点进行分裂,计算操作前后的增益,选择增益最大的方式进行分裂。
? 决策树相关算法计算指标:
? ID3算法:信息增益
? C4.5算法:信息增益率
? CART算法:Gini系数
XGBoost目标函数:
其中 ,
从目标函数中,我们希望损失函数越小越好,那就是 越大越好;从而,对于一个叶子节点的分裂的分裂,分裂前后的信息增益定义为: (这里的信息增益即分割前后损失值的变化)
? Gain值越大,分裂后减少的损失值越大。所以对于一个叶子节点分割时,计算所有候选的(feature,value)对应的gain,选择gain最大特征进行分割。
每次尝试选择一个分裂点(特征)进行分裂,利用在该特征分割后,预测值和标签的损失函数(均方差/交叉熵)的一阶导数、二级导数计算信息增益,选择信息增益最大的特征进行分割,循环上述步骤创建决策树。
决策树结构确定后,
XGBoost的其它特性
? 列采样(column subsampling):借鉴随机森林的做法,支持列抽样,不仅可以降低过拟合,还可以减少计算量;
? 支持对缺失值的自动处理。对于特征的值有缺失的样本,XGBoost可以自动学习分裂方向;
? XGBoost支持并行。XGBoost的并行是特征粒度上的,在计算特征的Gain的时候,会并行执行,但是在树的构建过程中,还是串行构建的;
? XGBoost算法中加入正则项,用于控制模型的复杂度,最终模型更加不容易过拟合;
? XGBoost基学习器支持CART、线性回归、逻辑回归;
? XGBoost支持自定义损失函数(要求损失函数二阶可导)。
XGBoost和GBDT比较:
1. XGBoost在GBDT基础上加入了正则化项,防止模型过拟合。
2. XGBoost在构建过程中考虑了二阶导数,GBDT只考虑一阶。
3. XGBoost中的决策树(也是二叉树)的构建是基于损失函数,GBDT内的决策树(CART)是基于MSE/MAE/GINI系数....