XGBOOST下一棵树的输入是什么?

最近研究XGBOOST,发现看完大篇理论推导之后根本不知道训练完一棵树后,下一棵树的输入是什么。

我想到了提升树(Boosting Tree),以平方误差损失函数为例,训练完一棵树后,只需要计算训练值\hat{y}和实际值y的残差,再对残差进行拟合就可以了。也就是说,加入我需要生成三棵树,第一棵树的拟合目标是

Tree_{1}=fit(x_{train}, y_{train})

预测输出

\hat{y_{1}}=Tree_{1}.predict(x_{train})

第二棵树的拟合目标是

Tree_{2}=fit(x_{train}, y_{train} - \hat{y_{1}})

\hat{y_{2}}=Tree_{2}.predict(x_{train})

第三课树的拟合目标是

Tree_{3}=fit(x_{train}, y_{train} - (\hat{y_{1}}+\hat{y_{2}}))

\hat{y_{3}}=Tree_{3}.predict(x_{train})

最终的预测值就是\hat{y}=\hat{y_{1}}+\hat{y_{1}}+\hat{y_{3}}

而梯度提升树(GDBT),则是拟合损失函数的负梯度在当前模型的值,假设也是三棵树,损失函数为L(y, \hat{y})

第一棵树的拟合目标是

Tree_{1}=fit(x_{train}, y_{train})

预测输出

\hat{y_{1}}=Tree_{1}.predict(x_{train})

此时需要计算第一棵树的损失函数,即L_{1}=L(y, \hat{y_{1}}),损失函数是关于\hat{y}_{1}的函数,计算该损失函数对\hat{y}_{1}的导数的相反数(负梯度)在Tree1上的值。

假设某一损失函数L=(y-\hat{y})^2,某一样本输入x_{i}的标签y_{i}=2,那么此时该样本的损失函数为L_{i}=(2-\hat{y}_{i})^2,其负梯度为-2(\hat{y}_{i}-2),它就是下一轮样本x_{i}的输入

综上所述,第二棵树的拟合目标是

Tree_{2}=fit(x_{train},-\frac{\partial L(y,\hat{y}_{1})}{\partial \hat{y_{1}}})

预测输出

\hat{y_{2}}=Tree_{2}.predict(x_{train})

第三棵树的拟合目标

Tree_{3}=fit(x_{train},-\frac{\partial L(y,\hat{y}_{1}+\hat{y}_{2})}{\partial (\hat{y_{1}}+\hat{y_{2}})})

预测输出

\hat{y_{3}}=Tree_{3}.predict(x_{train})

最终的预测值就是\hat{y}=\hat{y_{1}}+\hat{y_{1}}+\hat{y_{3}}

接下来就是XGBOOST了,

第一棵树的拟合目标是

Tree_{1}=fit(x_{train}, y_{train})

预测输出

\hat{y_{1}}=Tree_{1}.predict(x_{train})

那么最关键的,第二棵树的拟合目标是什么?是残差?还是一阶导数?还是二阶导数?其实我也不知道。我先把陈博士的图放上来

我个人的看法是,拟合是从很多种映射的集合中,找到某一映射使得损失函数最小。我们真正的关注点和目标是构造出损失函数,并让它取到最小值。看一下上图的目标函数,f_{t}是未知的,是需要求得的树结构。而\hat{y}_{i}^{(t-1)}g_ih_i是已知的,我们可以说是拟合\hat{y}_{i}^{(t-1)}g_ih_i,也可以说是拟合\hat{y}_{i}^{(t-1)}(因为g_ih_i可由它求出),拟合什么东西不重要,重要的是使得损失函数最小。

就比如我在上面的提升树中,我可以说我下一轮的输入是

Tree_{2}=fit(x_{train}, \hat{y_{1}})

这和拟合

Tree_{2}=fit(x_{train}, y_{train} - \hat{y_{1}})

是等价的

因为我进入到前者的算法后,做的第一件事情就是算y_{train} - \hat{y_{1}}的值,然后构造出损失函数。后者作为残差更直观一些罢了。

因此,在XGBOOST中,我可以选择拟合

Tree_{2}=fit(x_{train}, \hat{y_{1}})

然后在内部算法中,算出g_ih_i,构造出损失函数,并最小化。“输入”只是一个形式。

猜你喜欢

转载自blog.csdn.net/qq_41987033/article/details/81570604