机器学习中GBDT和XGBOOST的区别
这里默认是想做分类任务,由于GBDT分2种,一种是sklean中的AdaptiveBoostingClassifer,一种是skleran中的GradientBoostingClassifier,所以这里分别来对待。
Base learner
在AdaBoost中,base learner是classfication tree,即f(x) = 1 or -1,使用gini作为base learner的cost function
在GBDT中,base learner是regression tree,使用square loss作为cost function,f(x)为一个score,可以为-0.3,可以为0.2,可以为1
在XGBoost中,base learner是regression tree,f(x)为一个score,可以为-0.3,可以为0.2,可以为1
损失函数
在AdaBoost中,使用exp loss
在GBDT中,使用(待补充,我记得也是log loss)
在XGBoost中,主要使用log loss
GBDT和XGBoost类似,但没有2
泰勒展开及优化
AdaBoost在进行泰勒展开时只展开到一阶,由于base learner f(x)取值被限定为1 或者 -1,所以,不用对f(x)在进行正则化。
GBDT也展开到了一阶,但由于f(x)理论上可以取到正无穷大到负无穷大,所以原始目标的一个naive solution是f(x) = 正无穷大 or 负无穷大。这样做首先显然错的,其次,也违背了泰勒展开时,默认f(x)很小的约束,因此,对原始目标优化时需要对每个f(x)后面加一个正则项,优化目标变为原始目标 + 正则项,这样做的结果是,等同于regression tree对neg gradient以square loss为metric做regression,GBDT的的loss function是log loss,但每棵regression tree的loss function是squre loss
(详情见林轩田的机器学习技法的Gradient Boosting Decision Tree章节)
XGBoost,由于常用的函数,比如log loss,比如square loss,二阶求导后的结果都是正值,即h为正值,(这点很重要,论文中没有提及,但陈天奇在一个tutorial pdf中提及了),所以,XGBoost进行了二阶展开后可以避免naive solution,而且,非常巧地可以通过解一元二次方程把f(x)求出来
其实二阶求导也不是什么新鲜东西,Friedman的logit boost还是哪篇文章中也有提及。
模型复杂度
XGBoost引入了多种方式防止过拟合、
关于shrinkage
这点其实很有意思,对于XGboost和GBDT,shrinkage的作用是,找到一个“best direction”后,沿着它走“一小步”
对于AdaBoost,找到了一个“best direction”后,沿着它走"maximum step size”
其他
XGBoost确实引入多有意思的东西,比如parallization, column block,sampling, dart等,但这些东西,GBDT理论上也可以完美地引入,就不细说了
作者|薄新强
- 点赞
- 收藏
- 关注作者
评论(0)