前辈的总结如下:
1. 传统GBDT以CART作为基分类器,XGBoost还支持线性分类器,这个时候XGBoost相当于带L1和L2正则化项的Logistic回归(分类问题)或者线性回归(回归问题)。
2. 传统的GBDT只用了一阶导数信息(使用牛顿法的除外),而XGBoost对损失函数做了二阶泰勒展开。并且XGBoost支持自定义损失函数,只要损失函数一阶、二阶可导。
3. XGBoost的目标函数多了正则项, 相当于预剪枝,使得学习出来的模型更加不容易过拟合。
4. XGBoost还有Shrinkage和列抽样,进一步防止过拟合。
5. 对缺失值的处理。对于特征的值有缺失的样本,XGBoost可以自动学习出它的分裂方向。
6. XGBoost工具支持并行。当然这个并行是在特征的粒度上,而非tree粒度,因为本质还是boosting算法。
xgboost算法作为GBDT的一种高效实现,做了很多深度优化。
- 支持线性基分类器
- 损失函数二阶泰勒近似,支持自定义损失函数
- 正则项控制树的复杂度(叶子数,权重L2平滑)
- Shinkage减小每棵树的影响, 列子抽样,列Block预排序,buffer预取cache-aware,
- 百分位点分桶近似分裂,缺失值分裂处理,level-wise并行分裂。
为什么xgboost可以处理缺失数据?
1. xgboost在寻找分裂点时不考虑缺失值的数值,只对该列特征值为non-missing的样本上对应的特征值进行遍历。为了保证完备性,缺失值数据会被分到左子树或右子树分别计算损失,选择最优的那一个。
2. 可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。
3. 如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。
参考:
机器学习算法中 GBDT 和 XGBOOST 的区别有哪些?