https://juejin.im/post/5a13c9a8f265da43333e0648
https://blog.csdn.net/weixin_42029738/article/details/81675196
https://www.jianshu.com/p/3d5a4dcb3ae4
一、XGB的理解:
(1)梯度下降更快:最基本的差距就在于XGBoost比GBDT多了两项泰勒展开式,GBDT没有采用二次泰勒展开,这个看似很简单的区别,实际上带来更快的拟合,也大大缩减了生成树的规模,减少了运行时间。
(2)防止过拟合:XGBoost相比于GBDT加入了正则化项(Regularization),我们也可以将决策树的复杂度定义成正则项:那么该如何定义树的复杂度呢?比如,可以考虑树的节点数量和叶子节点所对应的分数的L2范数。
优点:xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
1、BDT(Boosting Decision Tree 提升决策树)加入了集成学习。原理就是通过多个特征生成多个树,来决策一件事情,DT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
2、GBDT每次训练的时候都是拟合上一棵树的残差,那么我们使用损失函数来拟合这棵树:
损失函数拟合一棵决策树
使用损失函数的负梯度来拟合它的残差:
这样将所有的负梯度加起来之后就会得到一个整体的梯度下降。使得整个系统的误差函数最小
二、adaboost
adaboost是最著名的boosting算法。开始时所有的样本的权重相同,但是经过第一轮的分类总会出现错误,将错误的样本的权重加大,减小正确样本的权重,这样在下一轮的分类中就可以给予上轮出错样本更多的关注。这样,将结果再叠加到之前的结果中,就会因为权重大而对上轮结果造成的影响大,从而一步步修正结果,最终得到一个好的分类器。
XGBoost相比于GBDT加入了正则化项(Regularization)
我们使用损失函数优化是为了避免欠拟合,而使用正则化项就是为了避免过拟合。正则化项与损失函数共同组成了我们的目标函数。XGBoost比GBDT多添加了以树复杂度构成的正则化项,也是XGBoost实际表现更为优秀的原因之一
何为正则化项?正则化项的作用是什么?
我们都知道,我们在优化目标函数的时候,总是希望它更加的“小”,也就是优化一般是最小化的意思。现在我们如果给目标函数加入一个变量的平方,那么如果这个变量一旦变大,那么目标函数为了“最小化”,一定很不喜欢这个变量变大的事实,选择的时候就会刻意避开会使变量变大的路径。这大概就是正则化的简单解释了。在XGBoost中,我们是将树的复杂度作为正则项加入,那么优化器在工作的时候,会尽量不让这个树更加复杂,也就达到我们的效果。
我们假设XGBoost决策树的叶子节点个数为T,该决策树是由所有叶子节点对应的值组成的向量w,以及一个把特征向量映射到叶子节点索引(Index)的函数 组成的,我们将树可以写成:
,我们也可以将决策树的复杂度定义成正则项: