说说xgboost算法

  xgboost算法最近真是愈来愈火,趁着这个浪头,咱们在最近一次的精准营销活动中,也使用了xgboost算法对某产品签约行为进行预测和营销,取得了不错的效果。说到xgboost,不得不说它的两大优点,一是准确率高,此次营销模型的AUC达到了94%;二是训练速度快,在几十万样本集,几十个特征的状况下,1分钟就能够训练完毕。究竟是什么缘由使得这门武功又快又准?下面就来简单分析一下。算法

  Xgboost的全称是Extreme Gradient Boosting,它是由华盛顿大学的陈天奇于2014年所创,因为它的高精度和高效率,在近几年的算法比赛中被普遍应用并取得了很好的成绩,大放异彩。xgboost能够看做在决策树和GBDT的基础上进化而来的,这个过程简略表示以下:多线程

 

一、决策树(Decision Tree)
  决策树的优势是解释性强、简单、速度快,缺点是模型不稳定、对特征纯度依赖高,是最简单的模型。
函数

二、GBDT(Gradient Boosting Decision Tree)性能

由于单个决策树的表达能力、范化能力和精度有限,因此GBDT引入了复合树和增量学习的概念。与随机森林类似,GBDT也是由多个CART树组合造成一个最终分类器。在GBDT生成树的时候,每棵树沿着前一棵树偏差减少的梯度方向进行训练。举例来讲,一个手机的价格100元,用GBDT进行建模,第一棵树拟合结果是90元,第二棵树是8元,第三棵树是2元,每一棵新生成的树都使得模型的误差愈来愈小,三棵树级联起来造成最终的模型。xgboost的g也体如今这个地方。学习

举个原论文中的栗子,判断一我的是否使用电脑?优化

如图很好地解释了复合树和增量学习的概念,经过这两点,GBDT的范化能力和精度比决策树有了大幅提升。spa

三、Xgboost线程

Xgboost在GBDT的基础上又进行了大幅改进,算法的综合性能有飞跃式的提升,与GBDT相比,Xgboost的优势主要体现精度、速度、可扩展性高、防止过拟合这几点,下面逐条分析。blog

(1)精度高内存

Xgboost的损失函数用到了二阶导数信息,而GBDT只用到一阶;

在大多数状况,数据集都没法避免出现null值的状况,从而致使梯度稀疏,在这种状况下,xgboost为损失函数指定了默认的梯度方向,间接提高了模型精度和速度。

(2)速度快

Xgboost在生成树的最佳分割点时,放弃了贪心算法,而是采用了一种从若干备选点中选择出最优分割点的近似算法,并且能够多线程搜索最佳分割点。Xgboost还以块为单位优化了特征在内存中的存取,解决了Cache-miss问题,间接提升了训练效率。根据论文所说,经过这些方法优化以后,xgboost的训练速度比scikit-learn快40倍。

(3)可扩展性高

GBDT的基分类器是CART,而xgboost的基分类器支持CART,Linear,LR;

Xgboost的目标函数支持linear、logistic、softmax等,能够处理回归、二分类,多分类问题。另外,Xgboost还能够自定义损失函数。

(4)防止过拟合

xgboost在损失函数里加入了正则项,下降模型的方差,使模型更简单,防止过拟合,还能自动处理one-hot特征,可是one-hot会增长内存消耗,增长训练时间,陈天奇建议one-hot类别数量在[0, 100]范围内使用;

xgboost在每一轮迭代时为每棵树增长一个权重,以此来缩减个别树的影响力;

xgboost还支持特征的下采样,相似于随机森林,也能够防止过拟合,而且提升速度,不过这个功能在当前版本没有实现。

Xgboost的

每门武功都有本身的优缺点,xgboost也不例外,这里我用随机森林做为对比,从正反两个角度来解释一下这两种算法的区别。xgboost适用于高误差,低方差的训练。而随机森林适用于高方差,低误差的训练集,两者是决策树进化的两个方向。

Xgboost的思想是增量学习,经过树的级联不断修正误差,方差较大的数据和异常值会对模型形成必定的影响。而随机森林的思想是bagging,树与树之间互相独立,经过屡次有放回的采样,而后全部树共同投票,以此下降模型的方差,两者有所区别。从正面来讲,对于误差大的训练集,随机森林必须训练到20层树的深度才能达到的准确率,xgboost只需几层树就能达到,由于随机森林依赖的树的深度下降误差,xgboost经过几个树的级联就把误差轻松修正了。从反面来讲,对于方差大的训练集,随机森林能够轻松拟合,xgboost就不容易拟合好,同理再也不赘述。

相关文章
相关标签/搜索