xgboost

通俗理解kaggle比赛大杀器xgboost(原理讲解)

https://blog.csdn.net/v_july_v/article/details/81410574

xgboost原理分析以及实践(手动建树过程)

https://blog.csdn.net/qq_22238533/article/details/79477547

xgboost如何处理缺失值(自动处理缺失值,而GBDT不允许有缺失值需要手动填充)

https://www.jianshu.com/p/5b8fbbb7e754

训练时:会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。

预测:如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。

Xgboost近似分位数算法(当特征值太多没法一次全部加载到内存,近似计算分割点,加权分位数略图Weighted Quantile Sketch)

https://blog.csdn.net/anshuai_aw1/article/details/83025168

https://www.hrwhisper.me/machine-learning-xgboost/

xgboost必须把离散值one-ho编码转为连续值,然后和连续特征一起训练

遗留问题:

1. xgoost如何并行化

2. xgoost如何调参

 

具体来说,我们回忆一下建树的时候需要做什么,建树的时候最关键的一步就是选择一个分裂的准则,也就如何评价分裂的质量。比如在前面文章GBDT的介绍里,我们可以选择MSE,MAE来评价我们的分裂的质量,但是,我们所选择的分裂准则似乎不总是和我们的损失函数有关,因为这种选择是启发式的。 
比如,在分类任务里面,损失函数可以选择logloss,分裂准确选择MSE,这样看来,似乎分裂的好坏和我们的损失并没有直接挂钩。

但是,在xgboost里面,我们的分裂准则是直接与损失函数挂钩的准则,这个也是xgboost和GBDT一个很不一样的地方。

至此,我们把xgboost的基本原理阐述了一遍。我们总结一下,其实就是做了以下几件事情。 
1.在损失函数的基础上加入了正则项。 
2.对目标函数进行二阶泰勒展开。 
3.利用推导得到的表达式作为分裂准确,来构建每一颗树。

 

区别: 
1.xgboost和GBDT的一个区别在于目标函数上。 
在xgboost中,损失函数+正则项。 
GBDT中,只有损失函数。 
2.xgboost中利用二阶导数的信息,而GBDT只利用了一阶导数。 
3.xgboost在建树的时候利用的准则来源于目标函数推导,而GBDT建树利用的是启发式准则。(这一点,我个人认为是xgboost牛B的所在,也是为啥要费劲二阶泰勒展开) 
4
.xgboost中可以自动处理空缺值,自动学习空缺值的分裂方向,GBDT(sklearn版本)不允许包含空缺值。 

在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。
5.其他若干工程实现上的不同(这个由于本文没有涉及就不说了)

联系: 
1.xgboost和GBDT的学习过程都是一样的,都是基于Boosting的思想,先学习前n-1个学习器,然后基于前n-1个学习器学习第n个学习器。(Boosting) 
2.建树过程都利用了损失函数的导数信息(Gradient),只是大家利用的方式不一样而已。 
3.都使用了学习率来进行Shrinkage,从前面我们能看到不管是GBDT还是xgboost,我们都会利用学习率对拟合结果做缩减以减少过拟合的风险。 
4.其他本文没涉及到的共同点。。

 

XGBoost工具支持并行

Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的

我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值