adaboost
adaboost 解决二分类问题$y\in{0,1}$,算法针对同一训练集训练出许多不同的弱分类器,将训练的分类器以某种方式组合起来,组合成一个强分类器。算法每次训练分类器时,会将前一个分类器分错的样本给与更大地权重,加强后的全体样本会用于下一次分类器的训练,每一轮加入一个新的弱分类器,知道达到某个预定的足够小的的错误率或达到预定的最大迭代次数。
参考资料
GBDT
GBDT 模型也是基于boosting的集成学习算法的变种,GB这边,就是Gradient Boost,通过在梯度上进行boost,每一次的计算是为了减少上一次的残差(residual),在Gradient Boost中,每个新的模型的遍历是为了使得之前模型的残差往梯度方向减少。与传统Boost对错误的样本进行加权有着很大的区别。从公式上,就是下一个函数等于上一个函数+拟合了残差的函数(实际上这个残差函数会乘以一个乘数,是让目标函数最小化,这个乘数怎么来不作展开)。
XGBoost
XGBoost 是GBDT的一个变种,最大的区别是xgboost通过对目标函数做二阶泰勒展开,从而求出下一步要拟合的树的叶子节点权重(需要先确定树的结构),从而根据分裂损失选择合适的属性进行分裂。
一些特性
- GBDT无显式正则化,xgboost对每棵树的叶子节点个数和权重都做了惩罚,避免过拟合
- 类似于随机森林,XGBoost在构建树的过程中,加入了行采样与列采样,防止过拟合
- GBDT仅使用了目标函数一阶泰勒展开,而XGBoost使用了二阶的泰勒展开值
- 为什么二阶展开?加快收敛速度,另外有说本身模型训练的学习率shrinkage可以通过二阶导数做一个逼近,而原始的GBDT没有计算这个,所以一般是通过预设的超参数eta人为指定
- 分裂算法有两种,一种是精确的分裂,一种是近似分裂算法,精确分裂算法就是把每个属性的每个取值都当作一次阈值进行遍历,采用的决策树是CART。近似分裂算法是对每个属性的所有取值进行分桶,按照各个桶之间的值作为划分阈值,xgboost提出了一个特殊的分桶策略,一般的分桶策略是每个样本的权重都是相同的,但是xgboost使每个样本的权重为损失函数在该样本点的二阶导(泰勒展开不应该是损失函数关于模型的展开吗?为什么会有在该样本点的二阶导这种说法? 因为模型是对所有样本点都通用的,把该样本输入到二阶导公式中就可以得到了)。
- xgboost加入了对缺失值的处理,xgboost分别将缺失样本放置到左子树和右子树,比较两者分裂增益,选择增益较大的那一边作为该样本的分裂方向。
- XGBoost通过预排序的方法来实现特征并行,提高模型训练效率
- xgboost 在实现时,需要将所有数据导入内存,做一次pre-sort(exact algorithm),这样在选择分裂节点时比较迅速。