之前介绍了GBDT算法的一些知识,该算法的拟合能力很强,但由于是前向算法,所以运行起来会很慢,要等前面的结果出来后,才能拟合残差。陈天奇团队研究的XGBoost算法,可以解决这个问题,并且对GBDT有了很大的改进。
本文主要学习自B站up主:春暖花开Abela的视频,讲解的很透彻。(后面的知识有些听不懂了,直接截图的,大家可以去B站上的视频听这个老师讲课)
在有监督的学习任务里,一般有模型,参数,目标函数和学习方法。
- 模型:给定输入X后预测输出y的方法,比如回归,分类等。
- 参数:模型中的参数,比如线性回归y=ax+b中的权重a和偏置b
- 目标函数:即损失函数,包含正则项
- 学习方法:给定目标函数后求解模型的和参数的方法,比如梯度下降法,牛顿法等。
XGBoost相比GBDT的改进
第一,GBDT将目标函数泰勒展开到一阶,而xgboost将目标函数泰勒展开到了二阶。保留了更多有关目标函数的信息,对提升效果有帮助。
第二,GBDT是给新的基模型寻找新的拟合标签(前面加法模型的负梯度),而xgboost是给新的基模型寻找新的目标函数(目标函数关于新的基模型的二阶泰勒展开)。
第三,xgboost加入了和叶子权重的L2正则化项,因而有利于模型获得更低的方差。
第四,xgboost增加了自动处理缺失值特征的策略。通过把带缺失值样本分别划分到左子树或者右子树,比较两种方案下目标函数的优劣,从而自动对有缺失值的样本进行划分,无需对缺失特征进行填充预处理。
此外,xgboost还支持候选分位点切割,特征并行等,可以提升性能。
回顾
xgboost是gbdt的进阶版,而gbdt是由一堆cart树通过boosting集成算法得到的。
这里先看一下cart树的计算案例。回归树输出的是一个分数,表示这个人喜欢玩电脑游戏的程度,利用这个分数我们可以进行回归,或映射成概率进行分类。
gbdt的计算案例。用两棵树进行预测,结果是两个树的和。
问题一:为什么xgboost用的是cart树,而不是别的呢?或者为什么是cart和boosting算法结合,而不是C4.5或者ID3?
在之前的树模型中有介绍,由于cart树是二叉树,计算结果会更快些。另外,对于分类问题,由于CART树的叶子节点对应的值是一个实际的分数,而非一个确定的类别,这将有利于实现高效的优化算法。
xgboost介绍
xgboost数学模型
xgboost利用前向分布算法,学习到包含K棵树的加法模型。这里的K就是树的棵数,F表示所有可能的CART树,f表示一棵具体的CART树。这个模型由K棵CART树组成。
这里面最重要的就是得到所有决策树,知道树的结构和叶子结点。
xgboost目标函数
这个目标函数包含两部分,第一部分就是损失函数(预测值和真实值之间的差距),第二部分就是正则项(衡量决策树的复杂程度,复杂程度越高,正则化向就越大,对损失函数的惩罚也大一些。),这里的正则化项由K棵树的正则化项相加而来。
我们的目标是为了优化这个目标函数,但因为f是决策树(包含树的结构和叶子结点的个数),不是数值型的向量,因此不能用梯度下降的算法进行优化。
目标函数中损失函数的处理
xgboost是前向分布算法(通过一次次迭代,来获得当前的集成模型),通过贪心算法寻找局部最优解。第t次的结果,是第t-1次预测的结果,加上第t个弱分类器的结果。
要使损失函数最小,因为前t-1次的结果已经确定了,那么久需要找到第t棵树,使损失函数降低最多,以达到优化值。
每次迭代都要寻找使损失函数降低最大的f(cart树),所以,目标函数可以写成如下形式