- xgboost是基于GBDT的改进,那么xgboost的树是基于CART树思想,是一颗二叉树。 每棵树拟合的也是残差,残差也是目标函数的梯度。
目标函数
- 常见的目标函数格式即 损失函数 + 正则化, 前者衡量模型的拟合程度,后者平衡模型的复杂程度
- 不同任务的损失函数L不同,常用的回归是平方误差,分类是逻辑回归误差
- 其中预测值y_hat是关于θ的函数,即模型本身
- 正则化惩罚项是一个关于θ的函数,可以根据不同情况来定义
对应到xgboost里面来,每个基模型是一棵树,损失函数是衡量所有树的叠加损失:
- fk即表示当前轮次训练的cart树
- obj衡量的是K棵树的累加损失
- 同样是由损失函数+正则化组成
叠加过程:
- 每一轮的预测值(yt)是前一轮已经训练好的模型的预测值(yt-1)加上当前轮拟合的cart树的输出值(ft(x)),也就是当前轮次的树模型拟合残差
- 每一轮的目标函数(obj(t))中的惩罚项,在前一轮已经训练好的情况下,惩罚项是已知的,所以可以写作一个常数constant,每轮目标函数衡量的是当前预测的损失和当前惩罚项
有了目标函数,训练的过程就是使目标函数最小,进而求出当前轮次最优的参数。但是对于一般损失函数来说,求极值比较困难,xgboost里面做了泰勒展开:
- 画红线部分就是前一轮的误差,是一个常数
- 最终目标函数是关于当前轮次的模型f进行最优化。
展开惩罚项:
- wq(x)中,w表示当前树所有叶子节点的分数集合,q(x)表示样本x在当前树中被划分到了哪一个节点。综合起来就是当前样本x在当前树f的预测分数。
- 正则化惩罚两部分,1是叶子节点个数,防止太多过拟合。2是叶子节点的分数,防止某些叶子节点分数太大导致过拟合。
- 从这里就可以看出,xgboost里面的cart树每个叶子节点输出的是对应的分数。一个样本进来了被划分到哪个叶子节点,那么预测值就是这个分数w。
确定了正则项后,那么现在一棵树的输出就是wq(x),对于当前轮t,只要找到使obj最小的w,那么这个wq(x)就是要训练的树。
将正则项带入目标函数:
- 红线部分转化:原式是要求每个样本的输出,可以转为每个叶子节点(Ij)包含的样本的输出再累加.
- 带入后求极值,解一个二元一次方程
上面的式子,就可以衡量一棵树的输出到底好不好,但是当前轮次可能会训练出多个q(x),那么就要根据这个公式去找出最好的q(x)作为当前轮次的树。
构建树的过程:
利用贪心算法,每次遍历所有特征所有取值,然后选择收益最大的特征最为节点:
红色部分是划分后的收益,蓝色部分是划分前的收益。