XGBoost的实现,我觉得主要还是在于对GBDT的改良上。对于GBDT还是不太熟悉的朋友,请看我这一篇文章《GBDT》。我个人认为这两者区别主要还是在于细节上,理解了GBDT我认为就差不多等于理解了XGBoost。
我重点比较一下XGBoost与GBDT两种算法的不同:
XGBoost的目标函数与GBDT存在泰勒展开项的不同:
最基本的差距就在于XGBoost比GBDT多了两项泰勒展开式。具体这个泰勒展开式是怎么得到的,是对于什么展开的呢?我们看:
XGBoost算法可以看成是由K棵树组成的加法模型:
XGBoost加法模型
其中F为所有树组成的函数空间(这里的回归树也就是一个分段函数,不同分段的不同取值就构成了一颗树),与一般机器学习算法不同的是,加法模型不是学习d维空间的权重,而是直接学习决策树的集合。
上述加法模型的目标函数定义为:
目标函数
其中Ω表示决策树的复杂度,那么该如何定义树的复杂度呢?比如,可以考虑树的节点数量、树的深度或者叶子节点所对应的分数的L2范数等等。
如何来学习加法模型呢?
解这一优化问题,可以用前向分布算法(forward stagewise algorithm)。有了之前GBDT的基础,我们知道,加法模型的学习器每次都用函数来拟合上一棵树没有拟合完整的残差,最后将这些残差全部加起来就会得到对于目标完整的预测,这也叫做Boosting。具体地,我们从一个常量预测开始&#x